Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Динамическая клавиатура.

Непрочитано 04.09.2020, 13:49  
j-Roger
Гражданин KAZUS.RUN
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 839
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Сорри за оффтоп..

Нажмите на изображение для увеличения
Название: Galileo_Inquisition_For_Isr.jpg
Просмотров: 0
Размер:	85.5 Кб
ID:	156058

Реклама:
j-Roger вне форума  
Эти 2 пользователя(ей) сказали Спасибо j-Roger за это сообщение:
arty123 (06.02.2021), ForcePoint (04.09.2020)
Непрочитано 04.09.2020, 15:01  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Логически то я разобрался, а вот реализация у меня хромает. Буду думать значит.
Yarikkasl вне форума  
Непрочитано 04.09.2020, 16:16  
parovoZZ
Почётный гражданин KAZUS.RUN
 
Регистрация: 15.11.2010
Сообщений: 2,376
Сказал спасибо: 337
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию 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);
} 
parovoZZ вне форума  
Непрочитано 04.09.2020, 16:51  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию 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-го уровня.
ForcePoint вне форума  
Непрочитано 04.09.2020, 17:05  
parovoZZ
Почётный гражданин KAZUS.RUN
 
Регистрация: 15.11.2010
Сообщений: 2,376
Сказал спасибо: 337
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Тогда не понимаю, где наросла проблема.
parovoZZ вне форума  
Непрочитано 04.09.2020, 20:50  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

parovoZZ, видимо по тому что я не там смотрел.
Yarikkasl вне форума  
Непрочитано 04.09.2020, 20:52  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

ForcePoint, Спасибо! Почитаю
Yarikkasl вне форума  
Непрочитано 04.09.2020, 22:52  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

Ой, да у него там два dalay-я по одному циклу декремента )) Че там такого трагикомичного то?
Если выходы переключают только лог.уровни (активный столбец - 0, неактивные стобцы - 1), то задержек в принципе не требуется, переходные процессы завершаются быстрее, чем работает этот МК. А если выходы переключаются в Hi-Z для неактивных столбцов, а на строках стоят подтяжки, тогда переходные процессы могут длиться дольше, до нескольких микросекунд, и без задержек между активациями столбцов возможны ложные определения кнопок.

Вот осциллограмма сигналов. Зеленые - это выходы в режиме 1/0, остальное - выходы в режиме 0/Hi-Z. В показанном примере подтяжка около 40 кОм (внутренняя).
Миниатюры:
Нажмите на изображение для увеличения
Название: DS1Z_QuickPrint14.png
Просмотров: 0
Размер:	41.3 Кб
ID:	156076  
NewWriter вне форума  
Непрочитано 10.09.2020, 13:09  
Yarikkasl
Частый гость
 
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Yarikkasl на пути к лучшему
По умолчанию Re: Динамическая клавиатура.

По итогу все паузы заменил на _delay_us(5), и да где то прочел про то что нужно отключить фьюз jtagen отключил- непомогло, так же отключил фьюз м103с и все заработало. Всем спасибо! Пологаю что следующая порция вопросов будет про обмен по usart0 и usart1
Yarikkasl вне форума  
 

Метки
atmega128, atmel studio, прерывания
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клавиатура Mera-REFA KL-13 теряет 1 бит при передачи в Arduino AVRkin Микроконтроллеры, АЦП, память и т.д 10 20.02.2018 06:10
Старая клавиатура для "486", типа AT Cahes2 Ремонт оргтехники 25 31.01.2014 16:48
iPod Mini A1051. Не работает клавиатура spacebrother Поиск схем. Делимся схемами 0 17.02.2012 06:37
Не матричная клавиатура для МП alexplev Микроконтроллеры, АЦП, память и т.д 8 22.02.2009 03:16
Динамическая индикация,вопрос Zemlyanov Микроконтроллеры, АЦП, память и т.д 29 05.08.2008 19:13


Часовой пояс GMT +4, время: 21:16.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.