- Типы прерываний
- Прерывания в Arduino
- Использование прерываний в Arduino
- Необходимые компоненты
- Принципиальная электрическая схема
- Программирование прерывания Arduino
- Демонстрация прерывания Arduino
Рассмотрим быстро движущийся автомобиль: если он внезапно столкнется с другой машиной в противоположном направлении, первое, что произойдет, это то, что датчик акселерометра, присутствующий в автомобиле, обнаружит внезапное снижение ускорения и вызовет внешнее прерывание для микроконтроллера, присутствующего в машина. Затем на основе этого прерывания микроконтроллер выдает электрический сигнал для немедленного приведения в действие подушек безопасности. Микроконтроллеры, присутствующие в автомобиле, контролируют множество вещей одновременно, например, определение скорости автомобиля, проверку других датчиков, контроль температуры кондиционера и т. Д. Так что же делает внезапное открытие подушки безопасности за секунды? Ответ - прерывания, здесь используется сигнал прерывания, который имеет наивысший приоритет из всех.
Другой простой пример прерываний - мобильные телефоны с сенсорным экраном, которые имеют наивысший приоритет перед чувством «касания». Почти у каждого электронного устройства есть какие-то прерывания, чтобы «прервать» обычный процесс и выполнить некоторые действия с более высоким приоритетом в определенном событии. Обычный процесс возобновляется после обслуживания прерывания.
Таким образом, технически прерывания - это механизм, с помощью которого ввод-вывод или инструкция могут приостановить нормальное выполнение процессора и получить обслуживание, как будто оно имеет более высокий приоритет. Например, процессор, выполняющий нормальное выполнение, может быть прерван каким-либо датчиком для выполнения определенного процесса, который присутствует в ISR (процедура обслуживания прерывания). После выполнения ISR процессор снова может возобновить нормальное выполнение.
Типы прерываний
Есть два типа прерываний:
Аппаратное прерывание: это происходит, когда происходит внешнее событие, например, когда вывод внешнего прерывания меняет свое состояние с LOW на HIGH или HIGH на LOW.
Программное прерывание: происходит в соответствии с инструкциями программного обеспечения. Например, прерывания от таймера - это программные прерывания.
Прерывания в Arduino
Теперь посмотрим, как использовать прерывания в плате Arduino. Он имеет два типа прерываний:
- Внешнее прерывание
- Прерывание смены пина
Внешнее прерывание:
Эти прерывания обрабатываются аппаратно и выполняются очень быстро. Эти прерывания могут быть настроены для срабатывания по событию ПОДЪЕМ, ПАДЕНИЕ или НИЗКИЙ уровень.
Плата Arduino |
Контакты внешнего прерывания: |
ООН, НАНО |
2,3 |
Мега |
2,3,18,19,20,21 |
Прерывания смены контактов:
Arduinos может иметь больше контактов прерывания, включенных с помощью прерываний смены контактов. В платах Arduino на базе ATmega168 / 328 любые контакты или все 20 сигнальных контактов могут использоваться в качестве контактов прерывания. Они также могут запускаться с помощью ПОДЪЕМНЫХ или ПАДАЮЩИХ краев.
Использование прерываний в Arduino
Чтобы использовать прерывания в Arduino, необходимо понимать следующие концепции.
Процедура обслуживания прерывания (ISR)
Подпрограмма обслуживания прерывания или обработчик прерывания - это событие, содержащее небольшой набор инструкций. Когда происходит внешнее прерывание, процессор сначала выполняет этот код, который присутствует в ISR, и возвращается в состояние, в котором он оставил нормальное выполнение.
В Arduino ISR имеет следующий синтаксис:
attachInterrupt (digitalPinToInterrupt (контакт), ISR, режим);
digitalPinToInterrupt (pin): в Arduino Uno, NANO для прерывания используются выводы 2,3 и мега 2,3,18,19,20,21. Укажите здесь входной вывод, который используется для внешнего прерывания.
ISR: это функция, которая вызывается при выполнении внешнего прерывания.
Режим: Тип перехода для включения, например, падение, рост и т. Д.
- RISING: запускает прерывание, когда вывод переходит с LOW на HIGH.
- ПАДЕНИЕ: запускает прерывание, когда вывод переходит из ВЫСОКОГО в НИЗКИЙ.
- CHANGE: запускать прерывание, когда вывод переходит из LOW в HIGH или из HIGH в LOW (т. Е. При изменении состояния вывода).
Некоторые условия при использовании прерывания
- Функция обработки прерывания (ISR) должна быть как можно короче.
- Функция Delay () не работает внутри ISR, и ее следует избегать.
В этом руководстве по прерыванию Arduino число увеличивается с 0, и для запуска прерывания используются две кнопки, каждая из которых подключена к D2 и D3. Светодиод используется для индикации прерывания. При нажатии одной кнопки светодиод загорается, а на дисплее отображается прерывание 2 и гаснет, а при нажатии другой кнопки светодиод гаснет, а на дисплее отображается прерывание 1 и гаснет.
Необходимые компоненты
- Плата Arduino (в этом руководстве используется Arduino NANO)
- Нажимная кнопка - 2
- Светодиод - 1
- Резистор (10К) - 2
- ЖК-дисплей (16x2) - 1
- Хлебная доска
- Подключение проводов
Принципиальная электрическая схема
Схема подключения между Arduino Nano и ЖК-дисплеем 16x2:
ЖК-дисплей |
Ардуино Нано |
VSS |
GND |
VDD |
+ 5В |
V0 |
К центральному контакту потенциометра Для управления контрастностью ЖК-дисплея |
RS |
D7 |
RW |
GND |
E |
D8 |
D4 |
D9 |
D5 |
D10 |
D6 |
D11 |
D7 |
D12 |
А |
+ 5В |
K |
GND |
Две кнопки подключены к Arduino Nano на выводах D2 и D3. Они используются для использования двух внешних прерываний: одно для включения светодиода, а другое для выключения светодиода. Каждая кнопка имеет понижающий резистор номиналом 10 кОм, подключенный к земле. Таким образом, когда кнопка нажата, это логический ВЫСОКИЙ (1), а когда не нажата - логический НИЗКИЙ (0). Понижающий резистор является обязательным, в противном случае на входных выводах D2 и D3 будут плавающие значения.
LED также используется для указания того, что прерывание было вызвано или кнопка была нажата.
Программирование прерывания Arduino
В этом руководстве число увеличивается с 0, которое постоянно отображается на ЖК-дисплее (16x2), подключенном к Arduino Nano, всякий раз, когда нажимается левая кнопка (вывод прерывания D3), светодиод загорается, и на дисплее отображается Interrupt2, а когда правая кнопка (контакт прерывания D2) нажат, светодиод гаснет и на дисплее отображается Interrupt1.
Полный код с рабочим видео дан в конце этого урока.
1. Сначала включается файл заголовка для ЖК-дисплея, а затем определяются контакты ЖК-дисплея, которые используются для подключения к Arduino Nano.
#включают
2. Внутри функции void setup () сначала выведите вводное сообщение на ЖК-дисплей. Узнайте больше о взаимодействии ЖК-дисплея с Arduino здесь.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ДАЙДЖЕСТ ЦЕПИ"); lcd.setCursor (0,1); lcd.print ("ArduinoInterrupt"); задержка (3000); lcd.clear ();
3. Затем в той же функции void setup () должны быть указаны входной и выходной контакты. Вывод D13 подключен к аноду светодиода, поэтому этот вывод должен быть определен как выход.
pinMode (13, ВЫХОД);
4. Теперь самое главное в программировании - это функция attachInterrupt (), которая также включена в void setup ().
attachInterrupt (digitalPinToInterrupt (2), buttonPressed1, RISING); attachInterrupt (digitalPinToInterrupt (3), buttonPressed2, RISING);
Здесь указывается, что контакт 2 предназначен для внешнего прерывания, а функция buttonPressed1 вызывается, когда на контакте D2 присутствует RISING (LOW to HIGH). И контакт 3 также предназначен для внешнего прерывания, и функция buttonPressed2 вызывается, когда на контакте D3 появляется RISING.
5. Внутри цикла void () число (i) увеличивается с нуля и печатается на ЖК-дисплее (16x2).
lcd.clear (); lcd.print ("СЧЕТЧИК:"); lcd.print (i); ++ i; задержка (1000);
В том же void loop (), digitalWrite () используется на выводе D13, к которому подключен анод светодиода. В зависимости от значения переменной выходной мощности светодиод загорится или погаснет.
digitalWrite (13, вывод);
6. Самая важная часть - это создание функции обработчика прерывания в соответствии с именем, которое используется в функции attachInterrupt () .
Поскольку используются два контакта прерывания, 2 и 3, то требуется два ISR. Здесь в этом программировании используются следующие ISR
buttonPressed1 ():
void buttonPressed1 () { вывод = НИЗКИЙ; lcd.setCursor (0,1); lcd.print («Прерывание 1»); }
Эта функция выполняется при нажатии кнопки на выводе D2 (ПОДЪЕМНЫЙ КРАЙ). Эта функция изменяет состояние выхода на НИЗКОЕ, в результате чего светодиод выключается, и на ЖК-дисплее отображается «прерывание1».
buttonPressed2 ():
void buttonPressed2 () {вывод = ВЫСОКИЙ; lcd.setCursor (0,1); lcd.print ("Прерывание2"); }
Эта функция выполняется при нажатии кнопки на контакте D3. Эта функция изменяет состояние выхода на ВЫСОКОЕ, в результате чего светодиод загорается и выводит на ЖК-дисплей «прерывание2».
Демонстрация прерывания Arduino
1. При нажатии КНОПКИ на левой стороне светодиод загорается, а на ЖК-дисплее отображается Interrupt2.
2. При нажатии КНОПКИ справа светодиод гаснет, а на ЖК-дисплее отображается «Прерывание1».
Вот как прерывание может быть полезно для запуска любой важной задачи между обычным выполнением.