Аппаратные прерывания

Что же такое прерывание? На ардуино есть определенные пины, которые способны в любой момент времени отследить уровень сигнала на этом пине и незамедлительно запустить определенную часть кода. Допустим, нам нужно запустить определенную часть кода, по срабатыванию датчика, но мы точно не знаем, когда именно он сработает, благодаря функции attachInterrupt, мы можем выполнять код, не обращая внимания на датчик, как только он сработает, автоматически запустится часть кода. Скорость выполнения прерывания: считанные доли микросекунд.

Функция attachInterrupt()

Чтобы использовать прерывания их надо подключить и настроить. Функция attachInterrupt(pin, function, mode); имеет 3 параметра:

  • pin, на котором нужно определить сигнал, нумерация начинается с нуля и не совпадает с нумерацией на плате Arduino, чтобы определить какой это пин обратиться к инструкции;
  • functiom – для выполнения определенного блока кода нужно создать свою функцию, и записать ее название сюда. Как создать свою функцию смотри здесь;
  • mode – режим работы. На какой сигнал будет реагировать функция. Существует 4 режима:

LOW – срабатывает, при низком уровне сигнала (LOW);

RISING – срабатывает, при смене уровня сигнала с LOW на HIGH;

FALLING – срабатывает, при смене уровня сигнала с HIGH на LOW;

CHANGE – срабатывает, при смене уровня сигнала с LOW на HIGH и наоборот.

Функцию, которую мы создадим для аппаратного прерывания, имеет ряд особенностей. Поскольку прерывания происходят мгновенно, то и использование задержки (delay) в этой функции не может быть возможным, а что касается команды millis(), то она сработает один раз, где мы ее указали. Если мы хотим изменить значение какой-либо переменной, она должна иметь атрибут volatile.

Для отключения работы прерывания есть функция detachInterrupt (pin), она имеет один параметр: номер пина, на котором отключаем прерывания.

Помимо отключения есть приостановление — noInterrupts (pin) и продолжение — interrupts (pin) прерывания.

Пример использования прерываний. Нам потребуется тактовая кнопка и плата линейки Arduino. В Arduino Uno это пины 2 (int 0) и пин 3 (int 1). Мы подключим кнопку одним котактом к 3 пину а другим на землю. При нажатии на кнопку мы будем  запускать прерывание и посылать в последовательный порт какой-либо сообщение.

Открыв последовательный порт и нажав пару раз на кнопку, мы увидим эффект дребезга контактов (надпись будет появляться в несколько раз больше чем нажатий на кнопку), как побороть такой эффект смотрите здесь.

0 0 vote
Article Rating