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 не пробовал, потому что использую их для связи.
@4redwings, 👍0
1 ответ
Лучший ответ:
Дело не в том, что контакты 18 или 19 неисправны, вам просто повезло, что остальные работали.
Как я упоминал на моей странице о прерываниях*, вам рекомендуется всегда записывать 1 в соответствующий бит EIFR перед включением прерывания, поскольку оно (условие прерывания) могло быть установлено в прошлом.
Я проверил источник attachInterrupt
в файле WInterrupts.c, и там нет упоминания о регистре EIFR, поэтому attachInterrupt
никогда не влияет на этот регистр.
* Также см. мой ответ: Как прерывания работают на Arduino Uno и подобных платах?
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Возникла проблема с переобъявлением символа другого типа
- Захват прерывания на обоих фронтах, когда он установлен на RISING или FALLING
- Датчик PIR и сон (прерывание) на Mega2560
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Точность синхронизации Arduino nano
- Запись на SD-карту с частотой дискретизации 50 мс или меньше? У меня есть скетч, который записывает в sd каждую 1 секунду, но застревает на более высоких частотах дискретизации. Пожалуйста помоги?
- Мега: присоединение Interrupt на выводе 18/19/20/21 не работает
Ух ты! Я знаю, где проведу следующие несколько часов. Спасибо!, @4redwings