Внешние прерывания
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передается обработчику прерывания, который выполняет работу по обработке события и возвращает управление в прерванный код. Arduino так же предоставляет свои функции для работы с прерываниями.
Их всего две:
❒ attachInterrupt();
❒ detachInterrupt().
Функция attachInterrupt
Задает функцию обработки внешнего прерывания, т. е. функцию, которая будет вызвана по внешнему прерыванию. Если до этого была задана другая функция, то назначается новая. Вычисляет значение указанного бита (бит 0 — это 1, бит 1 — это 2, бит 2 — это 4 и т. д.).
Синтаксис:
attachInterrupt(interrupt, function, mode);
Параметры:
❒ interrupt — номер прерывания:
• 0— на цифровом порту 2;
• 1— на цифровом порту 3;
• 2— на цифровом порту 21 (для Arduino Mega);
• 3— на цифровом порту 21 (для Arduino Mega);
• 4— на цифровом порту 21 (для Arduino Mega);
• 5— на цифровом порту 21 (для Arduino Mega);
❒ function — функция, вызываемая прерыванием (должна быть без параметров и не возвращать значений);
❒ mode — задает режим обработки прерывания, допустимо использование следующих констанст:
• LOW— вызывает прерывание, когда на порту LOW;
• CHANGE— прерывание вызывается при смене значения на порту с LOW на HIGH и наоборот;
• RISING— прерывание вызывается только при смене значения на порту с LOW на HIGH;
• FALLING— прерывание вызывается только при смене значения на порту с HIGH на LOW.
Возвращаемого значения нет.
Внутри функции обработки прерывания не работает функция delay(), значения, возвращаемые функцией millis(), не изменяются. Возможна потеря данных, передаваемых по последовательному соединению (Serial data) в момент выполнения функции обработки прерывания. Переменные, изменяемые в функции, должны быть объявлены как volatile.
Функция detachInterrupt
Выключает обработку внешнего прерывания.
Синтаксис:
detachInterrupt(interrupt);
Параметр: interrupt — номер прерывания (0 или 1), для Arduino Mega еще 2, 3, 4
или 5.
Возвращаемого значения нет.
приведен пример использования прерывания 0 при наступлении события CHANGE на порту 2. При этом светодиод на выводе 13 Arduino при каждом прерывании меняет статус (горит либо гаснет).
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
// функция обработки прерывания void blink()
{
state = !state;
}