Соответствие номеров внутренних прерываний пинам микроконтроллера
МК / номер прерывания | INT0 | INT1 | INT2 | INT3 | INT4 | INT5 |
---|---|---|---|---|---|---|
ATmega 328/168 (Nano, UNO, Mini) | D2 | D3 | - | - | - | - |
ATmega 32U4 (Leonardo, Micro) | D3 | D2 | D0 | D1 | D7 | - |
ATmega 2560 (Mega) | D2 | D3 | D21 | D20 | D19 | D18 |
Подключение прерываний
Подключается прерывание при помощи функции
attachInterrupt(pin, handler, mode)
-
pin
– пин прерывания- Для AVR Arduino это номер прерывания (см. таблицу выше)
- Для ESP8266 следует использовать такую конструкцию digitalPinToInterrupt(PIN) , где PIN это номер GPIO или D-пин на плате. Например attachInterrupt(digitalPinToInterrupt(D2), btn_read, RISING)
-
handler
– имя функции-обработчика прерывания -
mode
– режим работы прерывания:-
RISING
(рост) – срабатывает при изменении сигнала с LOW на HIGH -
FALLING
(падение) – срабатывает при изменении сигнала с HIGH на LOW -
CHANGE
(изменение) – срабатывает при изменении сигнала (с LOW на HIGH и наоборот) -
LOW
(низкий) – срабатывает постоянно при сигнале LOW (не поддерживается на ESP8266)
-
Прерывание можно отключить при помощи функции
detachInterrupt(pin)
.
Можно глобально запретить прерывания функцией
noInterrupts()
и снова разрешить их при помощи
interrupts()
noInterrupts()
остановит также прерывания таймеров, и у вас “сломаются” все функции времени и генерация ШИМ.
Функция обработчик прерывания
- Для AVR Arduino это функция вида
void имя(){}
- Для ESP8266/32 функция создаётся с атрибутом
IRAM_ATTR или ICACHE_RAM_ATTR
Например RAM_ATTR void имя(){}
К коду внутри этой функции есть некоторые требования:
- Переменные, которые изменяют своё значение в прерывании, должны быть объявлены со спецификатором
volatile
. Пример:volatile byte val;
- Не работают задержки типа
delay()
- Не меняет своё значение
millis() и micros()
- Некорректно работает вывод в порт
Serial.print()
- Нужно стараться делать как можно меньше вычислений и вообще “долгих” действий – это будет тормозить работу МК при частых прерываниях:
- Вычисления с
float
- Работа с (функции new(), malloc(), realloc() и прочие)
- Работа со String-строками
- Вычисления с