Внешние прерывания ARDUINO и ESP
Небольшая шпрагалка по внешним прерываниям микроконтроллеров Arduino, ATTiny и ESP
Внешние прерывания ARDUINO и ESP
29.02.2024 в 10:55   640 0
Версия для печати
logo

Соответствие номеров внутренних прерываний пинам микроконтроллера 

МК / номер прерывания 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-строками


Источник: https://alexgyver.ru/lessons/interrupts/
Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Программирование | Добавил: :, (27.11.2022)
Просмотров: 640 | Теги: Interrupts, прерывания, Arduino, ESP | Рейтинг: 0.0/0
Поделиться:
Всего комментариев: 0
avatar