Прерывания останавливают текущую работу Arduino, так что может быть выполнена другая работа.
Предположим, вы сидите дома, общаетесь с кем-то. Внезапно зазвонил телефон. Вы прекращаете общаться и берете трубку, чтобы поговорить с абонентом. Когда вы закончите разговор по телефону, вы вернетесь к разговору с человеком до того, как зазвонит телефон.
Точно так же вы можете думать об основной процедуре как о чата с кем-то, телефонный звонок заставляет вас перестать общаться. Процедура обслуживания прерывания – это процесс разговора по телефону. Когда телефонный разговор заканчивается, вы возвращаетесь к своей основной рутине общения. Этот пример объясняет, как именно прерывание заставляет процессор работать.
Основная программа работает и выполняет некоторую функцию в цепи. Однако, когда происходит прерывание, основная программа останавливается, пока выполняется другая процедура. Когда эта процедура заканчивается, процессор снова возвращается к основной процедуре.
Важные особенности
Вот несколько важных особенностей о прерываниях –
-
Прерывания могут исходить из разных источников. В этом случае мы используем аппаратное прерывание, которое вызывается изменением состояния на одном из цифровых выводов.
-
Большинство конструкций Arduino имеют два аппаратных прерывания (называемые «прерывание 0» и «прерывание 1»), жестко соединенные с выводами цифрового ввода-вывода 2 и 3 соответственно.
-
Arduino Mega имеет шесть аппаратных прерываний, включая дополнительные прерывания («interrupt2» – «interrupt5») на контактах 21, 20, 19 и 18.
-
Вы можете определить подпрограмму, используя специальную функцию, называемую «подпрограмма обработки прерывания» (обычно известная как ISR).
-
Вы можете определить процедуру и указать условия на переднем или заднем фронте или на обоих. В этих конкретных условиях прерывание будет обслуживаться.
-
Эту функцию можно выполнить автоматически каждый раз, когда происходит событие на входном выводе.
Прерывания могут исходить из разных источников. В этом случае мы используем аппаратное прерывание, которое вызывается изменением состояния на одном из цифровых выводов.
Большинство конструкций Arduino имеют два аппаратных прерывания (называемые «прерывание 0» и «прерывание 1»), жестко соединенные с выводами цифрового ввода-вывода 2 и 3 соответственно.
Arduino Mega имеет шесть аппаратных прерываний, включая дополнительные прерывания («interrupt2» – «interrupt5») на контактах 21, 20, 19 и 18.
Вы можете определить подпрограмму, используя специальную функцию, называемую «подпрограмма обработки прерывания» (обычно известная как ISR).
Вы можете определить процедуру и указать условия на переднем или заднем фронте или на обоих. В этих конкретных условиях прерывание будет обслуживаться.
Эту функцию можно выполнить автоматически каждый раз, когда происходит событие на входном выводе.
Типы прерываний
Есть два типа прерываний –
-
Аппаратные прерывания – они происходят в ответ на внешнее событие, такое как вывод внешнего прерывания, повышающийся или понижающийся.
-
Программные прерывания – они происходят в ответ на инструкцию, отправленную в программном обеспечении. Единственный тип прерывания, который поддерживает «язык Arduino», – это функция attachInterrupt ().
Аппаратные прерывания – они происходят в ответ на внешнее событие, такое как вывод внешнего прерывания, повышающийся или понижающийся.
Программные прерывания – они происходят в ответ на инструкцию, отправленную в программном обеспечении. Единственный тип прерывания, который поддерживает «язык Arduino», – это функция attachInterrupt ().
Использование прерываний в Arduino
Прерывания очень полезны в программах Arduino, так как они помогают в решении проблем синхронизации. Хорошее применение прерывания – это чтение вращающегося датчика или наблюдение за пользовательским вводом. Как правило, ISR должен быть максимально коротким и быстрым. Если ваш эскиз использует несколько ISR, одновременно может выполняться только один. Другие прерывания будут выполнены после того, как текущее прерывание завершится в порядке, который зависит от их приоритета.
Как правило, глобальные переменные используются для передачи данных между ISR и основной программой. Чтобы убедиться, что переменные, общие для ISR и основной программы, обновлены правильно, объявите их как volatile.
Синтаксис оператора attachInterrupt
attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only //argument pin: the pin number //argument ISR: the ISR to call when the interrupt occurs; //this function must take no parameters and return nothing. //This function is sometimes referred to as an interrupt service routine. //argument mode: defines when the interrupt should be triggered.
Следующие три константы предопределены как допустимые значения –
-
НИЗКИЙ, чтобы вызвать прерывание всякий раз, когда вывод низкий.
-
ИЗМЕНИТЬ, чтобы вызвать прерывание всякий раз, когда вывод меняет значение.
-
Падение всякий раз, когда штифт идет от высокой к низкой.
НИЗКИЙ, чтобы вызвать прерывание всякий раз, когда вывод низкий.
ИЗМЕНИТЬ, чтобы вызвать прерывание всякий раз, когда вывод меняет значение.
Падение всякий раз, когда штифт идет от высокой к низкой.
пример