Учебники

Arduino – Прерывания

Прерывания останавливают текущую работу 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.

Следующие три константы предопределены как допустимые значения –

  • НИЗКИЙ, чтобы вызвать прерывание всякий раз, когда вывод низкий.

  • ИЗМЕНИТЬ, чтобы вызвать прерывание всякий раз, когда вывод меняет значение.

  • Падение всякий раз, когда штифт идет от высокой к низкой.

НИЗКИЙ, чтобы вызвать прерывание всякий раз, когда вывод низкий.

ИЗМЕНИТЬ, чтобы вызвать прерывание всякий раз, когда вывод меняет значение.

Падение всякий раз, когда штифт идет от высокой к низкой.

пример