Как обнаружить два или более нажатия кнопки (GPIO) одновременно микропроцессором / микроконтроллером?

Как уже упоминалось в вопросе, мне было интересно, может ли контроллер обнаруживать одновременное нажатие двух кнопок.

Я новичок в программировании контроллера и начал с основ - мигающий светодиод, затем перешел к кнопкам и теперь пытаюсь поиграть с нажатиями кнопок. Я хотел установить флажок, когда обе кнопки нажаты вместе.

Но, насколько мне известно, в этом случае будет вызываться только один ISR, что позволяет обнаружить одно нажатие. Как мы можем достичь этого...

(В некоторых электронных устройствах он имеет определенные функциональные возможности, когда мы нажимаем определенные кнопки вместе, например, сброс настроек телефона при одновременном нажатии 3 соответствующих кнопок)

С уважением, Месси

1 ответ

Решение

Одного срабатывания ISR недостаточно для обнаружения нажатия одной кнопки. Из-за отказов электромеханического сигнала, который вы получаете от всех кнопок, вам нужен какой-то алгоритм отскока.

Кроме того, вам нужно, чтобы программа была защищена от EMI, чтобы множественные прерывания не создавали хаос в стеке, когда от кнопки (кнопок) поступает много импульсов.

Например:

  1. Если кнопки подключены к разным портам, которые дают разные прерывания, создайте одно прерывание для каждой кнопки. Если они подключены к одному и тому же порту, они обычно могут инициировать одно и то же прерывание (в зависимости от MCU).

  2. Всякий раз, когда вы получаете прерывание в результате какого-либо фронта сигнала (повышения или понижения) от кнопки, тогда в ISR отключите прерывание и запустите аппаратный таймер обычно 5-10 мс в зависимости от кнопки. Таймер должен предпочтительно вызывать прерывание таймера.

    Отключение прерывания необходимо для того, чтобы отфильтровать ложные прерывания, вызванные скачками и потенциальными помехами EMI.

    Таймер необходим для устранения скачков. Если вы не можете найти точное время отскока сигнала в паспорте кнопки (чаще всего нет), просто измерьте его с помощью осциллографа.

  3. По истечении времени таймера считайте порт и сохраните результат в переменной. Включите прерывание кнопки еще раз.

  4. Переменная должна быть объявлена ​​в области видимости файла как static volatile, Статический для частной инкапсуляции, которая необходима для хорошего дизайна программы. Изменчивость для предотвращения распространенных ошибок оптимизатора компилятора, когда компилятор не понимает, что переменная была изменена ISR.

  5. Реализуйте то же самое для первой кнопки. У вас будет две разные переменные, показывающие текущее состояние кнопок. Просто сравните эти две переменные друг с другом, чтобы определить, были ли нажаты две кнопки одновременно.

Другие вопросы по тегам