Микроконтроллеры Arduino позволяют обрабатывать внешние и внутренние прерывания. Внутренние прерывания используются для поддержки последовательной связи, отсчета времени, подсчета количества импульсов и т. д.
Внешние прерывания могут использоваться для связи с различными схемами, подключенными к Arduino. В зависимости от используемой системы Arduino, в распоряжении разработчика имеются, по крайней мере, два источника прерываний. Ниже приведена таблица прерываний для типичных систем Arduino:
Обработка прерывания заключается в остановке выполнения основного кода, с целью выполнения определенного для данного прерывания действия, с последующим возвратом к выполнению основной программы.
Из этого следует, что нам необходимо сообщить микроконтроллеру, что делать, когда происходит прерывание.
Функция attachInterrupt()
Функция attachInterrupt() позволяет назначить функцию для обработки внешнего прерывания. Синтаксис функции:
[slh lang=»php»] attachInterrupt(прерывание, функция, режим);[/slh]
- прерывание — это номер обрабатываемого прерывания;
- функция — имя функции обработки прерываний;
- режим — указывает условие вызова прерывания.
Допустимые значения условия вызова прерывания приведены в таблице ниже:
Ниже приведен пример использования внешнего прерывания:
[slh lang=»php»]
#define pin 13
volatile int stat = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, stat);
}
void blink() // функция обработки прерывания
{
stat = !stat;
}
[/slh]
Как видно из примера, прерывание int.0 используется для управления выводом 13. Функция blink() назначена для обработки прерывания с параметром CHANGE, а это означает, что любое изменение состояния вывода, ответственного за прерывание int.0, вызовет функцию.
В результате переменная «stat» изменит свое значение на противоположное. Следует обратить внимание на использование декларации переменной типом volatile. Данный тип сообщает компилятору о том, что необходимо обновить значение переменной «stat» после завершения работы обработчика прерываний (подробнее см. статью тип данных).
Функция detachInterrupt ()
Иногда бывает, что мы хотим использовать прерывание в программе для обработки нескольких внешних устройств в зависимости от обстоятельств (например, изменение чтения данных).
Функция detachInterrupt () позволяет отключить конкретную функцию как обработчика прерываний. После чего можно назначить новую функцию обработчика прерываний.
Синтаксис функции detachInterrupt () ограничен номером прерывания:
[slh lang=»php»]
detachInterrupt(0); //отключение прерывания 0
[/slh]
Функции interrupts() и noInterrupts()
Функции interrupts(), noInterrupts() обеспечивают глобальное управление системой прерываний. По умолчанию прерывания в Arduino включены, это означает, что параллельно с основной программой могут выполняться дополнительные операции по причине прерывания.
Иногда бывает необходимо выполнить определенное действие с уверенностью, что ни одна служба прерывания его не нарушит. В этом случае с помощью функции noInterrupts() можно отключить прерывания, а затем с помощью interrupts() снова включить. Следующий пример иллюстрирует способ использования данных функций:
[slh lang=»php»]
void loop()
{
// инструкции, программы
noInterrupt();
// критическая секция, требующая отключения прерываний
interrupt();
// инструкции,программы
[/slh]