Прерывание – это метод, с помощью которого микроконтроллер перенаправляет программу с текущего пути выполнения кода в другую, специальную область кода, чтобы сделать некоторые важные вещи, требующие немедленной обработки. Код, который активируется для обработки всякий раз, когда происходит прерывание, называется обработчиком прерываний, в иностранных источниках этому термину соответствует аббревиатура ISR или Interrupt Service Routine. Как только прерывание происходит, контроллер прекращает свою текущую обработку и начинает выполнение кода ISR, он возвращается к предыдущей задаче лишь только после того, как закончит выполнение кода в ISR.

Поскольку основой платы Arduino является микроконтроллер (зачастую ATmega), то в Arduino также можно организовывать прерывания, что может быть полезно в некоторых задачах. В данном проекте будет реализован простой генератор переменной частоты с индикацией благодаря функции прерывания.
В среде разработки Arduino IDE предусмотрены некоторые функции, позволяющие использовать прерывания в микроконтроллере платы Arduino. В коде, написанном для этого проекта, используются функции attachInterrupt() и detachInterrupt(). Первая применяется для разрешения прерывания, а вторая для отключения уже включенного прерывания. Рассмотрим каждую функцию в отдельности.
Функция attachInterrupt() используется для разрешения прерывания на любом из двух внешних выводов прерываний, также в ней происходит настройка типа срабатывания и назначение ISR для появившегося прерывания. Функция имеет три переменные: первая – номер вывода, на котором ожидаются сигналы прерывания, вторая определяет функцию, которая может действовать как ISR. Третий параметр определяет метод срабатывания. Прототип функции задается следующим образом
Void attachInterrupt (interrupt_pin, isr_function, trigger_method);
Параметр interrupt_pin может принимать значение 0 (для включения прерывания на выводе 2) или 1 (для включения прерывания на выводе 3). Второй параметр указывает на функцию, которая должна быть организована как обработчик прерывания, то есть ISR. Третий параметр может принимать четыре значения: LOW (для запуска прерывания всякий раз, когда линия находится в низком логическо уровне), CHANGE (для запуска прерывания всякий раз, когда сигнал на линии изменяется), RISING (для запуска прерывания, когда сигнал на линии переходит от низкого к высокому уровню), FALLING (для запуска прерывания, когда сигнал на линии переходит от высокого к низкому уровню). Возвращаемый тип функции объявлен как void, и, следовательно, функция ничего не возвращает.
Функция detachInterrupt() несколько проще. В качестве аргумента здесь используется только значение линии с активированной возможностью прерывания. Этот аргумент может принимать значение 0 (для выключения прерывания на выводе 2) или 1 (для выключения прерывания на выводе 3).
Ниже представлен код для Arduino, в котором наглядно демонстрируется принцип функционирования прерываний. Здесь мы реализуем простейший генератор переменной частоты с помощью функций attachInterrupt() и tone(). Подключите светодиод на линию 6 и замкните линию 2 с линией 8, чтобы светодиод менял свое состояние.
int led = 6; // номер линии с подключенным светодиодом
int led_state = 0; // переменная состояния светодиода
void setup()
{
pinMode(led, OUTPUT); // линия со светодиодом настраивается на выход
attachInterrupt(0, glow, RISING); // разрешаем внешнее прерывание 0 с функцией glow в качестве ISR, прерывание по изменению уровня сигнала с низкого на высокий
tone(8, 0.1);
}
void loop()
{
digitalWrite(led, led_state); // включаем или выключаем светодиод в зависимости от состояния переменной led_state
}
// Обработчик прерывания ISR
void glow()
{
led_state = !led_state; // инвертируем значение led_state
}
// Обработчик прерывания ISR
© digitrode.ru