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 |
@Luigi, 👍4
Обсуждение2 ответа
Лучший ответ:
Вы можете дублировать сигналы на выводах, если оба устройства подают сигналы в одном направлении (HIGH или LOW) или их сигналы должны быть обусловлены таким образом. При возникновении прерывания ваша процедура прерывания сначала опрашивает устройства, чтобы определить, какое из них сработало, а затем направляет вызов коду, соответствующему этому устройству. Если возможно возникновение состояния гонки, следует запомнить двойное срабатывание (сохранить его в логическом типе или в виде двух однобитовых флагов) и направлять вызовы на одно устройство по очереди.
Обновление:
Что вы подразумеваете под «удвоением количества кеглей»?
Подключите выходы «готовности» двух устройств к одному и тому же выводу прерывания. Процедура обработки прерывания должна будет определить, какое устройство запрашивает обслуживание, и действовать соответствующим образом.
Спасибо. Что вы имеете в виду под «удвоением количества контактов»?, @Luigi
исследование схемы «проводное ИЛИ», @jsotola
по сути один вход с подтягивающим резистором и несколькими переключателями, включенными параллельно... любой из переключателей активирует вход, @jsotola
Если вы читаете техническое описание микросхемы AVR, вы можете столкнуться с контактами PCINT в дополнение к контактам INT.
INT — это выделенные аппаратные выводы прерываний, описанные в Справочнике Arduino. Вывод INT связан с выделенным вектором прерываний, поэтому вы всегда знаете, какой вывод вызвал прерывание в обработчике прерываний.
PCINT относится к прерыванию по изменению состояния вывода, которое может быть сгенерировано практически (но не всегда) любым выводом ввода-вывода. PCINT потребляет больше накладных расходов на определение вывода, вызвавшего прерывание, поскольку группа выводов (выводов одного порта GPIO) использует один и тот же вектор PCINT, поэтому необходимо определить, какой вывод вызвал прерывание в обработчике прерывания, прежде чем предпринимать какие-либо действия. Кроме того, PCINT может выходить из спящего режима при отключении питания, в то время как INT — только при низком уровне. В зависимости от приложения, PCINT очень удобен, если требуется отслеживать состояние нескольких выводов одновременно, например, при использовании поворотных энкодеров.
Эта статья содержит хорошее описание и пример использования PCINT. Для использования прерывания по изменению контакта существует библиотека PinChangeInterrupt от NicoHood.
В частности, для ATmega2560 имеется 24 контакта, поддерживающих PCINT.

- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Почему мой код прерывания не работает?
- Возникла проблема с переобъявлением символа другого типа
- Захват прерывания на обоих фронтах, когда он установлен на RISING или FALLING
- Датчик PIR и сон (прерывание) на Mega2560
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Mega AttachInterrupt на контактах 18 или 19 требует, чтобы сначала был установлен бит EIFR (чтобы его очистить)?
- Точность синхронизации Arduino nano
также есть прерывания по смене контакта (не на всех портах в отличие от меньших AVR), @KIIV