Прерывания Arduino

Прерывания Arduino

Всем привет! В этой статье мы узнаем, что такое прерывания и таймеры Arduino uno. Как их использовать и для чего они могут быть полезны.

схема

Зайдем из далека: Arduino uno построена на базе микроконтроллера atmel atmega 328 отсюда возникают ограничения в исполнении нашей программы. В отличие от компьютера микроконтроллер не может выполнять одновременно несколько функций, то есть наша прошивка для Arduino выполняется последовательно строчка за строчкой и поэтому мы можем столкнутся с проблемой, когда обработчик какого-либо действия не застанет событие во время своего выполнения. С этой проблемой мы столкнулись при в статье о создании меню для управления светодиодами. Проблема заключалась в том, что иногда короткое нажатие на кнопку не приводило к изменениям переменных. Это происходило из-за того, что наша программа в момент нажатия на кнопку была занята чем-то другим и просто не знала, что кнопка нажата, для решения этой проблемы и были придуманы прерывания.

Как работают прерывания в Arduino Uno

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

Для кода в основном цикле программы приостановка выполнении программы остается не замеченным, то есть никак не влияет на них.

 

Технические подробности прерываний Arduino uno

 

В моем распоряжении сейчас есть Arduino uno на базе 328 меги, по этой причине мы рассмотрим примеры на ней. Они также будут актуальны для флех плат на базе atmega 328, но для справки я приведу информацию и о других версиях Arduino.

Arduino Uno имеет всего два прерывания на 2 и 3 пине, что реально мало по сравнению с более старшими платами, но для начала нам этого хватит.

 

пины прерываний Arduino

Uno, Nano, Mini, other 328-based — 2, 3.

Mega, Mega2560, MegaADK — 2, 3, 18, 19, 20, 21.

Micro, Leonardo, other 32u4-based — 0, 1, 2, 3, 7.

Due — Все цифровые порты.

 

Для работы с прерываниями используется стандартная функция ide Arduino attachInterrupt(interrupt, function, mode)

Где interrupt — номер вызываемого прерывания (0 — на 2 пине, 1- на 3 пине.).

function — называние функции, которая будет вызываться при срабатывании прерывания. Напомню, что она не должна как принимать, так и возвращать ни каких значений.

mode — Условия срабатывания прерывания. Возможны следующие варианты LOW, CHANGE, FALLING, RISING.

LOW — Условие при котором прерывание вызывается тогда, когда значение на контакте будет нулевым. Вызываемая функция будет срабатывать снова и снова до тех пор, пока значение будет нулевым. Он рассчитан на постоянные срабатывания. К примеру: Функция будет выполнятся циклично пока нажата кнопка.

CHANGE — прерывание вызывается при смене сигнала от LOW к HIGH и наоборот. Функция выполняется только один раз при любой смене сигнала.

RISING — прерывание вызывается один раз, когда значение меняется от LOW к HIGH на каждый удовлетворяющий вызову переход.

FALLING — прерывание вызывается один раз, когда значение меняется от HIGH к LOW на каждый удовлетворяющий вызову переход.

В место концовки

При работе с прерываниями важно помнить о таком явлении как дребезг контактов. Дребезг контактов хорошо виден на картинке:

sample_bounce

 

То есть при одиночном нажатии кнопки состояние вывода может поменяется несколько раз, а значит и прерывание может сработать незапланированно несколько раз или вызвать срабатывание другого прерывания.

Борьба с этим явлением достойна отдельной статьи.

А на сегодня все!

 

Метки: , , , , , . Закладка Постоянная ссылка.

Добавить комментарий