attachInterrupt()

Описание

Задает функцию, которую необходимо вызвать при возникновении внешнего прерывания. Заменяет предыдущую функцию, если таковая была ранее ассоциирована с прерыванием. В большинстве плат Ардуино существует два внешних прерывания: номер 0 (цифровой вывод 2) и 1 (цифровой вывод 3). Номера выводов для внешних прерываний, доступные в тех или иных платах Ардуино, приведены в таблице ниже:

Плата
int. 0
int. 1
int. 2
int. 3
int. 4
int. 5
Uno, Ethernet
2
3




Mega2560
2
3
21
20
19
18
Leonardo
3
2
0
1
7

Due
см. ниже *


* Плата Arduino Due предоставляет больше возможностей по работе с прерываниями, поскольку позволяют ассоциировать функцию-обработчик прерывания с любым из доступных выводов. При этом в функции attachInterrupt() можно непосредственно указывать номер вывода.


Синтаксис

attachInterrupt(interrupt, function, mode);
attachInterrupt(pin, function, mode); 
(только для Arduino Due)


Параметры

  • interrupt: Номер прерывания (int).
  • pin: Номер вывода (только для Arduino Due).
  • function: Функция, которую необходимо вызвать при возникновении прерывания. Эта функция должна быть без параметров и не возвращать никаких значений. Такую функцию иногда называют обработчиком прерывания.
  • mode: Определяет условие, при котором должно срабатывать прерывание. Может принимать одно из четырех предопределенных значений.


  • LOW - Прерывание будет срабатывать всякий раз, когда на выводе присутствует низкий уровень сигнала.
  • CHANGE - Прерывание будет срабатывать всякий раз, когда меняется состояние вывода.
  • RISING - Прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий.
  • FALLING - Прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий.
  • HIGH - Прерывание будет срабатывать всякий раз, когда на выводе присутствует высокий уровень сигнала (только для Arduino Due).


Возвращаемые значения

Нет.


Примечания

  • Внутри функции-обработчика прерывания, функция delay() не будет работать.
  • Значения, возвращаемые функцией millis(), не будут увеличиваться.
  • Также будут потеряны данные, полученные по последовательному интерфейсу во время выполнения обработчика прерывания.
  •  Любые переменные, которые изменяются внутри функции обработчика должны быть объявлены как volatile.


Использование прерываний

Прерывания могут использоваться для того, чтобы заставить микроконтроллер выполнять определенные участки программы автоматически и позволяют решить проблемы с синхронизацией. Типичными задачами, требующими использования прерываний, являются считывание сигнала энкодера (датчика вращения) либо мониторинг воздействий пользователя.

В программе, от которой требуется постоянно обрабатывать сигнал от датчика вращения (не пропуская при этом ни единого импульса), очень сложно реализовать еще какую-либо функциональность помимо опроса. Это объясняется тем, что для своевременной обработки поступающих импульсов, программа должна постоянно опрашивать выводы, к которым подключен энкодер. При работе с другими типами датчиков часто требуется подобный динамический интерфейс: например, при опросе звукового датчика с целью различить щелчок, или при работе с инфракрасным щелевым датчиком (фото-прерывателем) для распознавания момента броска монеты. Во всех этих примерах использование прерываний позволит разгрузить микроконтроллер для выполнения другой работы, при этом не теряя контроль над поступающими сигналами.


Пример

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;
}


Смотрите также

Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.