Mega AttachInterrupt на контактах 18 или 19 требует, чтобы сначала был установлен бит EIFR (чтобы его очистить)?

Экспериментируем с внешними прерываниями на Mega. Пины 2 и 3 работают стандартно

attachInterrupt(digitalPinToInterrupt(iPin),ISR,FALLING);

кодирование и позвоните моему ISR. С контактами 18 и 19 пришлось добавить

EIFR = 4;

для контакта 19 и

EIFR = 8;

для контакта 18 перед вызовом AttachInterrupt(...), чтобы заставить их работать. Почему?

Кстати, я добавлю эту таблицу, которую я заполнил методом проб и ошибок, для всех, кто интересуется номерами внешних прерываний Atmel (AVR) к номерам внешних прерываний Arduino (я не буду перечислять номера выводов чипа AVR)

>
AVR INT      5 .  4 .  3 .  2 .  1 .  0
EIFR (Dec)  32 . 16 .  8 .  4 .  2 .  1
Arduino Pin  3 .  2 . 18 . 19 . 20 . 21
Arduino INT  1 .  0 .  5 .  4 .  3 .  2

Я знаю, что запись 1 в бит EIFR для соответствующего прерывания очищает прерывание. Когда я перезагружаю Arduino без очистки прерываний на контактах 2 и 3, все в порядке. Если я не очищаю 18 и 19 после сброса, прерывание сразу же выдается. (Да, мне следует ИЛИ EIFR с битом, который я хочу изменить, но я просто играю) 20 и 21 не пробовал, потому что использую их для связи.

, 👍0


1 ответ


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

2

Дело не в том, что контакты 18 или 19 неисправны, вам просто повезло, что остальные работали.

Как я упоминал на моей странице о прерываниях*, вам рекомендуется всегда записывать 1 в соответствующий бит EIFR перед включением прерывания, поскольку оно (условие прерывания) могло быть установлено в прошлом.

Я проверил источник attachInterrupt в файле WInterrupts.c, и там нет упоминания о регистре EIFR, поэтому attachInterrupt никогда не влияет на этот регистр.


* Также см. мой ответ: Как прерывания работают на Arduino Uno и подобных платах?

,

Ух ты! Я знаю, где проведу следующие несколько часов. Спасибо!, @4redwings