Добавление общего PIN активации в группу кнопок

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

Есть ли способ подключить кнопки таким образом, чтобы в дополнение к их индивидуальному pinу они также активировали общий контакт (в данном случае прерывающий)?

, 👍2

Обсуждение

Почему бы вместо этого не использовать прерывание PinChange? Это также может вывести Arduino из спящего режима. И это работает почти с каждым пином. Хотя у вас есть одно прерывание для группы максимум из 8 контактов, и вам нужно проверить, какая кнопка была нажата, внутри ISR., @chrisl

Спасибо! Будет ли это также работать в режиме ожидания процессора из библиотеки avr / sleep.h?, @Marco Giacomin

Вы могли бы использовать [диоды для "или"](https://i.stack.imgur.com/ntAAj.gif ) несколько кнопок вместе. Но в этом случае я бы выбрал решение pcint, предложенное Крислом., @Gerben


1 ответ


Лучший ответ:

3

Вы можете подключить все кнопки к одному контакту прерывания, подключив их через диоды (как писал Гербен в комментариях). Это будет выглядеть так:

schematic

Диоды изолируют каждый входной вывод от другого, но позволяют кнопкам опустить вывод прерывания.

Хотя это не тот путь, который я бы предложил. Вместо этого вы можете просто использовать прерывание PinChange. Это другой тип прерывания, который может реагировать на все контакты порта в одном ISR для всего порта. Вы можете замаскировать неиспользуемые контакты порта, чтобы прерывание не срабатывало для них. Почти каждый контакт можно использовать таким образом.

Если вы хотите использовать для этого фреймворк Arduino, вы можете просто использовать функцию attachInterrupt(), которая может использовать прерывание PinChange в фоновом режиме.

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

  • С помощью битов в PCICR вы можете включить прерывание PinChange для портов (3 различных прерывания для Uno).
  • PCMSKn (n означает число от 0 до 2) используется для маскировки неиспользуемых выводов порта. Вы должны установить биты для используемых выводов равными 1, а для остальных - нулю.

Затем вам нужно определить фактическую процедуру обслуживания прерываний (ISR) в вашем коде:

ISR (PCINTn_vect) // обработайте прерывание смены контакта для D8 на D13 здесь
{    
    ...
}

Здесь снова подставьте n для номера используемого вами прерывания PinChange. Внутри ISR вам нужно прочитать все входные контакты кнопок, которые подключены к этому прерыванию PinChange, и выполнить свой код соответствующим образом. Примечание: Как указано в названии, прерывание срабатывает при каждом изменении контакта. Внутри ISR вам нужно разобраться, что это было за изменение. Все сводится к тому, чтобы просто прочитать контакт, но вы должны иметь это в виду.

Также убедитесь, что никогда не делайте длинных вещей внутри ISR; он должен быть как можно короче; Делайте длинные вещи внутри основного кода, который может быть вызван через переменную флага из ISR)

Если вы ищете в Google что-то вроде "Прерывание изменения контакта Arduino", вы можете найти подробные учебные пособия для этого, которые могут быть намного глубже, чем я могу найти на этом сайте вопросов и ответов.

Будет ли это также работать в спящем режиме процессора из библиотеки avr / sleep.h ?

Согласно таблице 9-1 в главе "9.1 Спящие режимы" таблицы данных, прерывания PinChange находятся на том же уровне, что и внешние прерывания INTn в отношении спящих режимов. Так что это должно работать точно так же, как и с прерываниями INTn.

,