Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибочное срабатывание матричной клавиатуры на STM32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Схемотехника
MaxiMuz
Организовал матричную клавиатуру 3х4. На столбцы PB5,PB6,PB7 подаю бегущую "1". Строки РА12...РА9 настроенные как вход с внутренней подтяжкой к нулю.

...........Р.Р.Р
...........В.В.В
...........5.6.7
РА12--1-2-3
РА11--4-5-6
РА10--7-8-9
РА9 --*-0-#

Читаю:
Код
    // вкл. pin1 - на вывод
    /* Настраиваем KEYCOL1 - на вых.двухтактный f=50MHz     */
    GPIOB->CRL&= ~(GPIO_CRL_CNF5);
    GPIOB->CRL|=GPIO_CRL_MODE5;
    ON_PIN(KEYCOL1);// вкл. стобец столбец
    __NOP();
//    __NOP();
//    __NOP();
//    __NOP();
//    __NOP();
    tmp=RD_PORT(inPort);
    KeyMat[i++]=(u16)tmp;//=tmp<<4;
    OFF_PIN(KEYCOL1);
    // вкл. pin3 - Z-состояние
    /* Настраиваем KEYCOL1 - на вход в третьем сост     */
    GPIOB->CRL&= ~(GPIO_CRL_MODE5|GPIO_CRL_CNF5);
    GPIOB->CRL|=GPIO_CRL_CNF5_0;

    // вкл. pin2 - на вывод
    /* Настраиваем KEYCOL2 - на вых.двухтактный f=50MHz     */
    GPIOB->CRL&= ~(GPIO_CRL_CNF6);
    GPIOB->CRL|=GPIO_CRL_MODE6;
    ON_PIN(KEYCOL2);// вкл. второй столбец
    __NOP();
//    __NOP();
//    __NOP();
//    __NOP();
//    __NOP();
    tmp=RD_PORT(inPort);
    KeyMat[i++]=(u16)tmp;//=tmp<<4;
    OFF_PIN(KEYCOL2);
    // вкл. pin2 - Z-состояние
    /* Настраиваем KEYCOL2 - на вход в третьем сост     */
    GPIOB->CRL&= ~(GPIO_CRL_MODE6|GPIO_CRL_CNF6);
    GPIOB->CRL|=GPIO_CRL_CNF6_0;    

    // вкл. pin3 - на вывод
    /* Настраиваем KEYCOL3 - на вых.двухтактный f=50MHz     */
    GPIOB->CRL&= ~(GPIO_CRL_CNF7);
    GPIOB->CRL|=GPIO_CRL_MODE7;
    ON_PIN(KEYCOL3); // вкл. первый столбец
    __NOP();
//    __NOP();
//    __NOP();
//    __NOP();
//    __NOP();
    tmp=RD_PORT(inPort);
    KeyMat[i++]=(u16)tmp;//=tmp<<4;
    OFF_PIN(KEYCOL3);// выкл. первый столбец
    // вкл. pin1 - Z-состояние
    /* Настраиваем KEYCOL3 - на вход в третьем сост     */
    GPIOB->CRL&= ~(GPIO_CRL_MODE7|GPIO_CRL_CNF7);
    GPIOB->CRL|=GPIO_CRL_CNF7_0;


При подаче 1 на РВ5 и замыкании кнопки (кн.4) на РА11 срабатывает соседний пин РА10.
При замыкании кнопки7 на РА10 срабатывают соседние РА11, РА9.
При замыкании кнопки * на РА9 иногда срабатывает соседний РА10.
Если после включения 1 на столбце и считывания строк ввести задержку __NOP(); помехи пропадают.
Есть ли другие способы борьбы с такими помехами ?
Сергей Борщ
Цитата(MaxiMuz @ Jun 26 2014, 16:32) *
Есть ли другие способы борьбы с такими помехами ?
И с этими и с другими - внешние подтяжки значительно меньшего сопротивления, чем внутренние. Физику не обманешь, паразитным емкостям выводов и монтажа нужно время для зарядки/разрядки. Чем меньше ток - тем больше время.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.