Arduino Mega: есть ли способ получить дополнительные контакты прерывания?

У меня Arduino Mega, и у меня закончились контакты прерывания. Доступен только 18-й контакт, но мне нужны два. Что делать?

закрепить INTx digitalPinToInterrupt(pin)
3 INT5 1
2 INT4 0
18 TX1 INT3 5
19 RX1 INT2 4
20 SDA INT1 3
21 SCL INT0 2

, 👍4

Обсуждение

также есть прерывания по смене контакта (не на всех портах в отличие от меньших AVR), @KIIV


2 ответа


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

2

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

Обновление:

Что вы подразумеваете под «удвоением количества кеглей»?

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

,

Спасибо. Что вы имеете в виду под «удвоением количества контактов»?, @Luigi

исследование схемы «проводное ИЛИ», @jsotola

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


11

Если вы читаете техническое описание микросхемы AVR, вы можете столкнуться с контактами PCINT в дополнение к контактам INT.

INT — это выделенные аппаратные выводы прерываний, описанные в Справочнике Arduino. Вывод INT связан с выделенным вектором прерываний, поэтому вы всегда знаете, какой вывод вызвал прерывание в обработчике прерываний.

PCINT относится к прерыванию по изменению состояния вывода, которое может быть сгенерировано практически (но не всегда) любым выводом ввода-вывода. PCINT потребляет больше накладных расходов на определение вывода, вызвавшего прерывание, поскольку группа выводов (выводов одного порта GPIO) использует один и тот же вектор PCINT, поэтому необходимо определить, какой вывод вызвал прерывание в обработчике прерывания, прежде чем предпринимать какие-либо действия. Кроме того, PCINT может выходить из спящего режима при отключении питания, в то время как INT — только при низком уровне. В зависимости от приложения, PCINT очень удобен, если требуется отслеживать состояние нескольких выводов одновременно, например, при использовании поворотных энкодеров.

Эта статья содержит хорошее описание и пример использования PCINT. Для использования прерывания по изменению контакта существует библиотека PinChangeInterrupt от NicoHood.

В частности, для ATmega2560 имеется 24 контакта, поддерживающих PCINT.

,