AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.09.2020, 13:49
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 707
Сказал спасибо: 363
Сказали Спасибо 795 раз(а) в 370 сообщении(ях)
|
Re: Динамическая клавиатура.
Сорри за оффтоп..
|
|
|
Эти 2 пользователя(ей) сказали Спасибо j-Roger за это сообщение:
|
|
|
04.09.2020, 15:01
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
Логически то я разобрался, а вот реализация у меня хромает. Буду думать значит.
|
|
|
|
04.09.2020, 16:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: Динамическая клавиатура.
Могу дать код для MSP430 из набора стандартных примеров.
Нажмите, чтобы открыть спойлер
PHP код:
|
/
// MSP430FR2xxx Keypad Matrix
// ----------------- ›-/ -o ›-/ -o ›-/ -o ›-/ -o
// | | | | | | | | | |
// /|\| P1.0|‹---o--ROW0-----^----|--^----|--^----|--^ |
// | | | | | | | |
// --|RST | 4.7M | | | |
// | | | | | | |
// | | GND ›-/ -o ›-/ -o ›-/ -o ›-/ -o
// | | | | | | | | | |
// | P1.1|‹---o--ROW1-----^----|--^----|--^----|--^ |
// | | | | | | |
// | | 4.7M | | | |
// | | | | | | |
// | | GND ›-/ -o ›-/ -o ›-/ -o ›-/ -o
// | | | | | | | | | |
// | P1.2|‹---o--ROW2-----^----|--^----|--^----|--^ |
// | | | | | | |
// | | 4.7M | | | |
// | | | | | | |
// | | GND ›-/ -o ›-/ -o ›-/ -o ›-/ -o
// | | | | | | | | | |
// | P1.3|‹---o--ROW3-----^----|--^----|--^----|--^ |
// | | | | | | |
// | | 4.7M | | | |
// | | | | | | |
// | | GND | | | |
// | P2.0|--›----COL0----------^ | | |
// | P2.1|--›----COL1------------------^ | |
// | P2.6|--›----COL2--------------------------^ |
// | P2.7|--›----COL3----------------------------------^
//
//
// Caleb Overbay
// Texas Instruments Inc.
// Aug 2017
// Built with IAR Embedded Workbench v7.10 & Code Composer Studio v7.2
//************************************************** ****************************
#include ‹msp430.h›
#include ‹stdint.h›
/* Constant Definitions */
#define TOTAL_KEYS 16 // Number of Buttons on Keypad
#define TOTAL_COLS 4 // Number of Columns on Keypad
#define TOTAL_ROWS 4 // Number of Rows on Keypad
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
int8_t key; // Stores value of pressed key
UART_init(); // Initialize UART interface
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance
// mode to activate configured port settings
__enable_interrupt(); // Enable global interrupts
/* Main loop */
while(1)
{
Keypad_setupForPress(); // Wait for a button press
key = Keypad_performScan(); // Determine which button was pushed
if(key ›= 0) // Filter out false button presses
{
UART_sendByte(key); // Transmit key number
// Loop waiting for release of all keys
while(Keypad_performScan() ›= 0)
{
Keypad_setupForRelease();
}
}
}
}
/**
* Setup keypad I/O for a button push
* P1.0 to P1.3 = input, interrupt on rising edge
* P2.0, P2.1, P2.6, P2.7 = output high
*
* Unused pins = output low
* Enter LPM4, wake on button push
*/
static inline void Keypad_setupForPress()
{
PADIR = 0xFFF0; // P1.0 to P1.3 = input
PAOUT = 0xC300; // P2.0-P2.1, P2.6-P2.7 = output high
P1IES = 0x00; // P1.0 to P1.3 interrupt rising edge
P1IFG = 0; // Clear P1 interrupt flags
P1IE = (BIT0 + BIT1 + BIT2 + BIT3); // Enable P1.0 to P1.3 interrupts
__bis_SR_register(LPM4_bits); // Enter LPM4, wake on button push
WDT_startDebounce(); // Debounce button
}
/**
* Setup keypad I/O for a button release
* P1.0 to P1.3 = input, interrupt on falling edge
* Only a single P2.x column remains high from Keypad_performScan()
*
* Enter LPM4, wake on button release
*/
static inline void Keypad_setupForRelease()
{
P1IES = (BIT0 + BIT1 + BIT2 + BIT3); // P1.0 to P1.3 interrupt falling edge
P1IFG = 0x00; // Clear P1 interrupt flags
P1IE = (BIT0 + BIT1 + BIT2 + BIT3); // Enable P1.0 to P1.3 interrupts
__bis_SR_register(LPM4_bits); // Enter LPM4, wake on button release
WDT_startDebounce(); // Debounce button
}
/**
* Scans the keys to determine which button was pushed
* If button was pushed, column containing button remains driven high
* and others are driven low
*
* Returns the button number pushed
*/
static int8_t Keypad_performScan(void)
{
uint8_t pressedKeys = 0;
uint8_t testRow;
int8_t keyNum = -1;
uint8_t col;
uint8_t row;
P2OUT = 0x00; // Set columns to output low
// Loop the columns, setting only one high at a time
for (col = 0; col ‹ TOTAL_COLS; col++)
{
//Turn on a single column
switch(col)
{
case 0:
P2OUT = BIT0; // select column 0 (Col0)
break;
case 1:
P2OUT = BIT1; // select column 1 (Col1)
break;
case 2:
P2OUT = BIT6; // select column 2 (Col2)
break;
case 3:
P2OUT = BIT7; // select column 3 (Col3)
break;
default:
__no_operation(); // add more cases if TOTAL_COLS › 4
break;
}
pressedKeys = (P1IN & 0x0F); // Capture the row input
testRow = BIT0; // Start cycling at Row 0
// Cycle through the rows determining if a key is pressed
for (row = 0; row ‹ TOTAL_ROWS; row++)
{
if (pressedKeys & testRow)
{
keyNum = (row * TOTAL_COLS) + col; // Calculate button number
// Break out of loops
col = TOTAL_COLS;
row = TOTAL_ROWS;
}
testRow = testRow ‹‹ 1; // Shift to next row
}
}
return(keyNum);
}
|
|
|
|
|
04.09.2020, 16:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,951
Сказал спасибо: 2,994
Сказали Спасибо 3,172 раз(а) в 2,152 сообщении(ях)
|
Re: Динамическая клавиатура.
Сообщение от parovoZZ
|
Могу дать код для MSP430 из набора стандартных примеров.
|
Да это и у производителя МК (прародителя) есть:
AN_1232 - AVR240: 4x4 Keypad-Wake Up on Keypress on tinyAVR and megaAVR devices - http://www.microchip.com//wwwAppNote...pnote=en591177
AN_1231 - AVR242: Multiplexing LED Drive & a 4x4 Keypad on tinyAVR and megaAVR devices - http://www.microchip.com//wwwAppNote...pnote=en591259
AN_2532 - AVR243: Matrix Keyboard Decoder on tinyAVR and megaAVR devices - http://www.microchip.com//wwwAppNote...pnote=en591996
__________________
Экзорцист 40-го уровня.
|
|
|
|
04.09.2020, 17:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: Динамическая клавиатура.
Тогда не понимаю, где наросла проблема.
|
|
|
|
04.09.2020, 20:50
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
parovoZZ, видимо по тому что я не там смотрел.
|
|
|
|
04.09.2020, 20:52
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
ForcePoint, Спасибо! Почитаю
|
|
|
|
04.09.2020, 22:52
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Динамическая клавиатура.
Ой, да у него там два dalay-я по одному циклу декремента )) Че там такого трагикомичного то?
Если выходы переключают только лог.уровни (активный столбец - 0, неактивные стобцы - 1), то задержек в принципе не требуется, переходные процессы завершаются быстрее, чем работает этот МК. А если выходы переключаются в Hi-Z для неактивных столбцов, а на строках стоят подтяжки, тогда переходные процессы могут длиться дольше, до нескольких микросекунд, и без задержек между активациями столбцов возможны ложные определения кнопок.
Вот осциллограмма сигналов. Зеленые - это выходы в режиме 1/0, остальное - выходы в режиме 0/Hi-Z. В показанном примере подтяжка около 40 кОм (внутренняя).
|
|
|
|
10.09.2020, 13:09
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая клавиатура.
По итогу все паузы заменил на _delay_us(5), и да где то прочел про то что нужно отключить фьюз jtagen отключил- непомогло, так же отключил фьюз м103с и все заработало. Всем спасибо! Пологаю что следующая порция вопросов будет про обмен по usart0 и usart1
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:22.
|
|