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

Внешние прерывания
Вызываются при изменении сигнала на определенных цифровых входах. Например, при нажатии кнопки или срабатывании датчика.
Внутренние прерывания
Генерируются внутренними модулями микроконтроллера, такими как таймеры, АЦП, интерфейсы. Например, прерывание по переполнению таймера.
Внешние прерывания обычно используются для реакции на события окружающей среды, а внутренние — для точного тайминга и синхронизации.
Как настроить и использовать прерывания в Arduino
Для работы с прерываниями в Arduino используются следующие функции:
attachInterrupt()
— привязывает функцию-обработчик к прерываниюdetachInterrupt()
— отключает прерываниеinterrupts()
— глобально разрешает прерыванияnoInterrupts()
— глобально запрещает прерывания
Основные шаги для настройки прерывания:
- Определить функцию-обработчик прерывания
- Настроить пин для прерывания как INPUT
- Привязать обработчик к прерыванию с помощью attachInterrupt()
- Разрешить прерывания глобально с помощью interrupts()
Пример настройки внешнего прерывания по нажатию кнопки:

const int buttonPin = 2;
volatile bool buttonPressed = false;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonInterrupt, FALLING);
}
void loop() {
if (buttonPressed) {
// Обработка нажатия кнопки
buttonPressed = false;
}
}
void buttonInterrupt() {
buttonPressed = true;
}
Преимущества использования прерываний в проектах Arduino
Применение прерываний дает ряд важных преимуществ при разработке проектов на Arduino:
- Значительное снижение энергопотребления за счет использования спящих режимов
- Повышение надежности — гарантированная обработка всех событий
- Упрощение кода — не нужно постоянно опрашивать входы в основном цикле
- Возможность обрабатывать несколько источников событий одновременно
- Повышение отзывчивости системы — мгновенная реакция на события
Прерывания особенно полезны в проектах, работающих от батарей, системах реального времени, при работе с быстрыми внешними сигналами.
Ограничения и особенности работы с прерываниями
При использовании прерываний в Arduino важно учитывать некоторые ограничения:

- Обработчики прерываний должны быть максимально короткими
- В обработчиках нельзя использовать delay() и другие блокирующие функции
- Нужно правильно обрабатывать дребезг контактов для кнопок
- Возможны конфликты при одновременном срабатывании нескольких прерываний
- Не все пины Arduino поддерживают прерывания
Правильное применение прерываний требует понимания их работы и соблюдения определенных правил программирования. Но при грамотном использовании прерывания значительно повышают эффективность проектов Arduino.
Примеры использования прерываний в реальных проектах
Рассмотрим несколько примеров применения прерываний в проектах Arduino:
Энергоэффективный датчик движения
Микроконтроллер находится в спящем режиме и активируется по прерыванию от PIR-датчика при обнаружении движения. Это позволяет многократно увеличить время автономной работы.
Точное измерение частоты
Прерывания от таймера используются для точного подсчета импульсов входного сигнала. Это дает возможность измерять частоту с высокой точностью.

Система управления умным домом
Прерывания от различных датчиков (движения, открытия дверей, утечки газа) позволяют мгновенно реагировать на события в доме.
Беспроводной пульт управления
Эти примеры показывают, как прерывания помогают создавать эффективные проекты Arduino с низким энергопотреблением и быстрой реакцией на события.
Отладка проектов с прерываниями
При работе с прерываниями возникают некоторые сложности с отладкой:
- Обработчики прерываний выполняются асинхронно, что затрудняет пошаговую отладку
- В обработчиках нельзя использовать Serial.print() для вывода отладочной информации
- Возможны сложные для обнаружения ошибки из-за конфликтов прерываний
Для отладки проектов с прерываниями можно использовать следующие подходы:
- Установка флагов в обработчиках и проверка их в основном цикле
- Использование светодиодов для индикации срабатывания прерываний
- Временное отключение прерываний для изоляции проблем
- Применение осциллографа для анализа временных диаграмм
Тщательное тестирование и отладка критически важны при работе с прерываниями для обеспечения надежности проекта.

arduino sleep
В этом видео мы узнаем, как использовать прерывания с Arduino — продвинутой, но чрезвычайно полезной функцией Arduino.. Есть много чего, так что без дальнейших задержек. Давайте начнем, Привет, ребята, меня зовут Ник, и добро пожаловать на канал education8s.tv, посвященный проектам DIY-электроники с Arduino., Малина, Пи, ESP8266 и другие популярные доски. Подписаться на канал. Сейчас, если ты не, хочу пропустить любое будущее видео. в этом видео, мы собираемся узнать, как использовать прерывания в наших проектах, построив два простых проекта. Обязательно досмотрите до конца видео, потому что трюк, который мы используем во втором примере, очень полезен для наших будущих проектов., Но что такое прерывание? У большинства микропроцессоров есть прерывания. Прерывания. Позвольте вам реагировать на внешние события, одновременно занимаясь чем-то другим. Допустим, вы сидите дома и ждете новую плату ESP32.
. Программа Arduino запущена и выполняет некоторую функцию.. тем не мение, когда происходит прерывание, основная программа перестает выполняться и вызывается другая функция. Когда эта функция завершится. Процессор снова возвращается к основной программе и возобновляет ее выполнение с точки. Это было остановлено. Функция, которую процессор выполняет при возникновении прерывания, — это ISR.. Процедура обслуживания прерывания.

. Я подключил светодиод к цифровому контакту 13 и кнопку на цифровой пин 2, который поддерживает аппаратные прерывания. Чтобы сделать цифровой вывод для прерывания основного скетча Arduino, мы используем функцию attachInterrupt.. Первый аргумент — это идентификатор прерывания., поэтому, если мы используем Arduino Uno, прерывание 0 соответствует цифровому выводу 2.. Следующий аргумент — это функция, которая будет выполняться при срабатывании прерывания.. Другими словами, это функция ISR.. В этом примере, мы называем ISR buttonPressed.. Последний аргумент сообщает Arduino, что вызывает прерывание.. RISING означает, что прерывание будет срабатывать, когда состояние цифрового вывода 2 переходит от НИЗКОГО к ВЫСОКОМУ.. Мы также можем использовать слово ПАДЕНИЕ, это означает, что прерывание будет запущено, когда состояние вывода изменится с HIGH на LOW.
Не используйте задержку. Не делайте серийных распечаток, Сделать переменные, используемые совместно с основным кодом, изменчивыми, Итак, мы создали очень короткую функцию. Мы не используем никаких задержек или последовательной печати, и мы объявили переменную как изменчивую.. Мы готовы протестировать код.. Как вы видете, код проекта работает как положено.. Когда я нажимаю кнопку, срабатывает прерывание, и светодиод горит или гаснет. . Наш первый скетч, использующий прерывания, готов. Если мы еще раз проверим код, мы видим, что функция цикла пуста. У нас есть рабочий проект без кода в функции цикла.. Если бы мы хотели построить один и тот же проект без перерывов, мы бы проверяли состояние кнопки много раз в секунду, для обнаружения любого изменения его состояния и включения или выключения светодиода.. Вот как мы поступали так. Далеко. Теперь перейдем ко второму проекту.. В этом проекте. Я использую датчик PIR, чтобы вызвать прерывание.. Датчик PIR работает так.. Он имеет только три контакта Vcc GND и контакт выхода сигнала.. Когда датчик обнаруживает движение. Сигнальный контакт переходит с НИЗКОГО на ВЫСОКИЙ и остается включенным в течение 10 секунд. Если он не обнаруживает движения в течение 10 секунд. Он возвращается к НИЗКОМУ.. В этом примере, мы хотим использовать, прерывает включение светодиода при обнаружении движения и выключение его снова.
Когда сигнал датчика становится НИЗКИМ., Мы собираемся использовать два прерывания. . Мы собираемся прервать один раз, когда состояние сигнала от датчика изменится с НИЗКОГО на ВЫСОКИЙ, чтобы включить светодиод, и мы собираемся использовать другое прерывание, чтобы выключить светодиод, когда сигнал от датчика переходит с ВЫСОКОГО на ВЫСОКИЙ. НИЗКИЙ. Подключаем Vcc датчика к 5V GND к GND, и сигнальный контакт к цифровому контакту 2 и цифровой контакт 3.. Оба этих вывода используют аппаратные прерывания.. Теперь в коде, первое прерывание сработает, когда сигнал перейдет с НИЗКОГО на ВЫСОКИЙ. Итак, мы используем слово Восход.. Когда это произойдет, будет вызвана функция ISR turnLEDOn.. Второе прерывание имеет идентификатор 1, что соответствует цифровому контакту 3.. Мы будем использовать слово ПАДЕНИЕ в качестве триггера, и оно будет вызывать функцию turnLEDOff при срабатывании триггера.. ISRoutines очень простые и короткие.. Мы просто включаем или выключаем светодиод. Это оно.. Проект готов., Мы добавляем команду к функции цикла, чтобы перевести Arduino в спящий режим для экономии энергии.
, Для этого мы используем библиотеку LowPower.. Эта команда навсегда усыпит Arduino.. Прерывания могут разбудить Arduino, выполнить функцию ISR и сразу вернуться в режим сна.. Итак, в этом примере, Arduino все время спит, когда он обнаруживает движение, запускается прерывание, поэтому Arduino просыпается и выполняет функцию turnLEDOn.
Когда эта функция завершит свое выполнение. Arduino сразу же снова переходит в спящий режим, когда сигнал от датчика переходит с ВЫСОКОГО на НИЗКИЙ.. Сработало прерывание. Функция ISR этого прерывания выключает светодиод, и Arduino возвращается в спящий режим.. Это здорово. Мы не теряем времени зря. Давайте протестируем проект, чтобы убедиться, что все работает должным образом.. Теперь Arduino спит, и датчик PIR не обнаружил никакого движения.. Если я поднесу руку к датчику, датчик вызовет прерывание, и программа обслуживания прерывания, при первом прерывании загорится светодиод, и Arduino вернется в спящий режим.. Если мы подождем 10 секунд, не двигаясь перед датчиком, выходной сигнал датчика станет НИЗКИМ. . Arduino снова проснется, чтобы выполнить вторую процедуру обслуживания прерывания., который выключит светодиод. После выключения светодиода. Arduino снова засыпает.. Как вы видете, мы можем значительно снизить энергопотребление наших проектов с помощью прерываний. Этот трюк очень полезен, и я собираюсь часто использовать его в будущем, чтобы снизить энергопотребление наших проектов и продлить срок их службы от батарей.. Как всегда, Вы можете найти код обоих проектов в описании видео ниже. Это оно.. Теперь, когда мы создали несколько простых проектов, в которых используются прерывания, мы можем использовать эту очень полезную функцию для более сложных проектов.
. Это позволит нам строить более сложные проекты, потребляющие меньше энергии.. Это видео было быстрой демонстрацией того, как использовать аппаратные прерывания с Arduino.. Есть еще много вещей, которые можно обсудить по поводу прерываний, но то, что мы узнали сегодня, мы собираемся использовать больше всего.. Я хотел бы услышать ваши мысли о прерываниях. . Собираетесь ли вы использовать прерывания в каком-либо из ваших проектов теперь, когда знаете, как они работают?? пожалуйста, оставьте свои комментарии ниже и не забудьте лайкнуть видео. Если сочтете полезным., Кроме того, рассмотреть подписавшись на канал и сделать кнопку, что колокол или YouTube может не показать вам обновления, по мере выхода новых видео. Если вы собираетесь делать покупки для частей проверить партнерскую ссылку из описания видео. Это на сегодня.
[mam_video id = QtyOiTw0oQc]
[mam_tag id = 5902]
Приложения Интернета вещей и искусственный интеллект на пограничном уровне – Eetasia.com
Опубликовано во вторник, декабрь 24, 2019
Приложения Интернета вещей и искусственный интеллект на пограничном уровне Eetasia.
com … Продолжить чтение »
Ваш домашний помощник знает, когда вы спите? – hackaday
Отправлено в среду, сентябрь 11, 2019
Ваш домашний помощник знает, когда вы спите? hackaday … Продолжить чтение »
Arduino: иди спать крошечный ATtiny – Электроника Еженедельно
Опубликовано в понедельник, август 14, 2017
Arduino: спать крошечный ATtiny Electronics Weekly … Продолжить чтение »
ТомиславНиколов
Пн окт 28 15:11:42 +0000 2019
Прошлой ночью я плохо спал, поэтому, пока я крутился в постели, полусон, полусон, я думал про себя: “Мне нужно спать, но как я могу, когда моторы работают от моего ноутбука, а не от аккумулятора. ” Подходит для того, чтобы зря потратить отпуск на работу над проектом #Arduino
AllArduino
Вс июн 15 16:42:59 +0000 2014
#arduino https://t.co/W28OjuTp7M Сохранение данных во время глубокого сна без использования EEPROM
HTTPS://t.co/W28OjuTp7M
Ардуино — Прерывания. Прерывание — это сигнал, который сообщает… | Адити Шах | Vicara Hardware University
Прерывание — это сигнал, сообщающий процессору о немедленной остановке текущей задачи и выполнении другой высокоприоритетной обработки. Эта высокоприоритетная обработка называется обработчиком прерывания/программой обслуживания прерывания. Почти каждое электронное устройство сталкивается со сценарием, когда прерывание необходимо «прервать» обычный процесс и выполнить важную задачу. Таким образом, технически прерывания — это механизм, с помощью которого ввод-вывод или инструкция могут приостановить нормальное выполнение процессора и получить обслуживание, поскольку оно имеет высокий приоритет. Как только эта задача завершена, она возвращается к выполнению первоначальной задачи.
Как работают прерывания?
Прерывания вызывают внешнюю функцию, которая обычно называется подпрограммой обслуживания прерываний (ISR), поэтому при возникновении внешнего прерывания процессор сначала выполняет код, присутствующий в ISR, а затем возвращается в состояние, в котором он прекратил нормальное выполнение.
ISR имеет следующий синтаксис в Arduino: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
digitalPinToInterrupt(pin ): В Arduino Uno для прерывания используются контакты 2 и 3. Вам нужно указать здесь находится входной контакт, который используется для внешнего прерывания.
ISR : Это функция, которая вызывается при выполнении внешнего прерывания.
Режим : Тип перехода для срабатывания прерывания, например, падение, рост и т. д.
- Рост — для запуска прерывания, когда контакт переходит из LOW в HIGH.
- Падение — Для запуска прерывания, когда контакт переходит из ВЫСОКОГО в НИЗКИЙ.
- Change — Для запуска прерывания, когда контакт переходит из LOW в HIGH или HIGH в LOW.
- НИЗКИЙ — для запуска прерывания, когда на выводе НИЗКИЙ уровень.
Типы прерываний
Существует два типа прерываний:
- Аппаратные прерывания — они возникают в ответ на внешнее событие, такое как переход внешнего прерывания в высокий или низкий уровень.
- Программные прерывания — они происходят в ответ на команду, отправленную программным обеспечением. Прерывания по таймеру — это программные прерывания.
Теперь давайте посмотрим, как использовать прерывания Arduino, используя функции, доступные в Arduino IDE. Мы будем использовать функцию прерывания присоединения, чтобы инициализировать прерывание и указать вывод Arudino, который будет использоваться для этого. Функция принимает два аргумента в качестве входных данных: один — это контакт, который используется для запуска внешнего прерывания, а второй аргумент — это имя функции, которую вы хотите вызывать при каждом прерывании. Последний аргумент относится к режиму прерывания, который вы используете.
Мы будем использовать пример мигания светодиода, чтобы понять, как работает функция прерывания. Сделайте подключения в соответствии со следующей диаграммой:
Требуется компоненты:
- Arduino Uno
- Глепота
- проволоки джемпер
- 2 светодиоды
- Punch
- 1KESTOR 9007
- Как работают прерывания в Arduino?
- Как работают прерывания ЦП чипа AVR ATmega328p?
- Какие существуют источники прерываний в ATmega328p?
- В чем разница между внутренними и внешними прерываниями в ATmega328p?
- Как прерывания включаются или отключаются в Arduino/ATmega328p?
- Бит 0 — IVCE: Разрешить изменение прерывания вектора
Бит IVCE должен быть записан в логическую единицу, чтобы разрешить изменение бита IVSEL. IVCE очищается аппаратно через четыре цикла после записи или при записи IVSEL. - Бит 7: 4 — Зарезервированный
Неиспользуемый и всегда будет чтение как ноль - бит 3, 2 — ISC11, ISC10: Interrupt Sense Control 1 и Bit 0 11
333333333330 901
3333330 901
333330
330
330
330
30
30
30
.1 активируется внешним выводом INT1, если установлены I-флаг SREG и соответствующая маска прерывания. Значение на выводе INT1 замеряется перед обнаружением фронтов. Если выбрано прерывание по фронту или переключению, импульсы длительностью более одного тактового периода будут генерировать прерывание. Не гарантируется, что более короткие импульсы вызовут прерывание. Если выбрано прерывание низкого уровня, низкий уровень должен поддерживаться до завершения текущей выполняемой команды, чтобы сгенерировать прерывание.
- Бит 1, 0 – ISC01, ISC00: управление прерыванием 0, бит 1 и бит 0
Внешнее прерывание 0 активируется внешним выводом INT0, если установлены I-флаг SREG и соответствующая маска прерывания. Значение на выводе INT0 замеряется перед обнаружением фронтов. Если выбрано прерывание по фронту или переключению, импульсы длительностью более одного тактового периода будут генерировать прерывание. Не гарантируется, что более короткие импульсы вызовут прерывание.Если выбрано прерывание низкого уровня, низкий уровень должен поддерживаться до завершения текущей выполняемой команды, чтобы сгенерировать прерывание.
-
-
- .
- Бит 1 — INT1: Запрос внешнего прерывания 1 Разрешить
Когда бит INT1 установлен (единица) и бит I в регистре состояния (SREG) установлен (единица), прерывание внешнего вывода разрешено. - Бит 0 — INT0: Запрос внешнего прерывания 0 Разрешить
Когда бит INT0 установлен (один) и I-бит в регистре состояния (SREG) установлен (один), прерывание внешнего вывода разрешено.
EIFR – Регистр флагов внешних прерываний
Регистр флагов внешних прерываний содержит флаги INTF1 и INTF0.
Bit 7 6 5 4 3 2 1 0 Read/Write
Initial ValueR
0R
0R
0R
0R
0R
0R/W
0R/W
00x1C (0x3C) – – – – – – INTF1 INTF0 - Бит 7:2 – Зарезервировано
Эти биты всегда читаются как нули и всегда будут считываться как нули. - Бит 1 — INTF1: внешний флаг прерывания 1
Когда фронт или логическое изменение на выводе INT1 запускает запрос прерывания, INTF1 устанавливается (единица). Если бит I в SREG и бит INT1 в EIMSK установлены (единица), MCU перейдет к соответствующему вектору прерывания. Флаг сбрасывается при выполнении процедуры обработки прерывания. В качестве альтернативы флаг можно очистить, записав в него логическую единицу. Этот флаг всегда сбрасывается, когда INT1 настроен как прерывание по уровню. - Бит 0 — INTF0: Флаг внешнего прерывания 0
Когда фронт или логическое изменение на выводе INT0 запускает запрос на прерывание, INTF0 устанавливается (единица). Если бит I в SREG и бит INT0 в EIMSK установлены (единица), MCU перейдет к соответствующему вектору прерывания. Флаг сбрасывается при выполнении процедуры обработки прерывания. В качестве альтернативы флаг можно очистить, записав в него логическую единицу. Этот флаг всегда сбрасывается, когда INT0 настроен как прерывание по уровню.
PCICR — регистр управления прерыванием смены контакта
Регистр управления прерыванием смены контакта содержит включение или отключение PCI1, PCI2, PCI3.
Bit 7 6 5 4 3 2 1 0 Read/Write
Initial ValueR
0R
0Р
0Р
0Р
0R/W
0R/W
0R/W
0(0x68) – – – – – PCIE2 PCIE1 PCIE0 - Бит 7:3 — зарезервировано
Эти биты не используются и всегда будут считываться как нулевые. - Бит 2 — PCIE2: Разрешение прерывания по смене контакта 2
Когда бит PCIE2 установлен (один) и бит I в регистре состояния (SREG) установлен (один), прерывание 2 по смене контакта разрешено. Любое изменение на любом включенном выводе PCINT[23:16] вызовет прерывание. Соответствующее прерывание запроса прерывания смены контакта выполняется из вектора прерывания PCI2. Выводы PCINT[23:16] активируются индивидуально регистром PCMSK2. - Бит 1 — PCIE1: Разрешение прерывания смены контакта 1
Когда бит PCIE0 установлен (один) и I-бит в регистре состояния (SREG) установлен (один), прерывание смены контакта 0 разрешено. Любое изменение на любом включенном выводе PCINT[7:0] вызовет прерывание. Соответствующее прерывание запроса прерывания смены контакта выполняется из вектора прерывания PCI0. Выводы PCINT[7:0] активируются индивидуально регистром PCMSK0.
PCIFR — Регистр прерывания смены контакта
Регистр флагов прерывания смены контакта содержит флаги PCIF1, PCIF2, PCIF3.
Bit 7 6 5 4 3 2 1 0 R0139Read/Write
Initial ValueR
0R
0R
0R
0R
0R/W
0R/W 3 2/W
00x1B (0x3B) – – – – – PCIE2 PCIE1 PCIE0 - Bit 7:3 – Reserved
These bits are неиспользуемые биты и всегда будут читаться как ноль. - Бит 2 — PCIF2: Флаг прерывания смены контакта 2
Когда логическое изменение на любом выводе PCINT[23:16] вызывает запрос на прерывание, PCIF2 устанавливается (единица). Если бит I в SREG и бит PCIE2 в PCICR установлены (единица), MCU перейдет к соответствующему вектору прерывания. Флаг сбрасывается при выполнении процедуры обработки прерывания. В качестве альтернативы флаг можно очистить, записав в него логическую единицу. - Бит 1 — PCIF1: флаг прерывания смены контакта 1
Когда логическое изменение на любом выводе PCINT[14:8] вызывает запрос на прерывание, PCIF1 устанавливается (единица). Если бит I в SREG и бит PCIE1 в PCICR установлены (единица), MCU перейдет к соответствующему вектору прерывания. Флаг сбрасывается при выполнении процедуры обработки прерывания. В качестве альтернативы флаг можно очистить, записав в него логическую единицу.
PCMSK2 – Регистр маски смены контакта 2
Bit 7 6 5 4 3 2 1 0 Read/Write
Initial ValueR/W
0R/W
0R/W
0R/W
0R/W
0R/W
0R/W
0R/W
0(0x6D) PCINT23 PCINT22 PCINT21 PCINT20 PCINT19 PCINT18 PCINT17 PCINT16 - BIT 7: 0–
- BIT 7: 0–
- .
-бит определяет, разрешено ли прерывание смены контакта на соответствующем выводе ввода-вывода. Если установлено значение PCINT[23:16] и установлен бит PCIE2 в PCICR, прерывание смены контакта разрешено на соответствующем контакте ввода/вывода. Если PCINT[23:16] сброшен, прерывание смены контакта на соответствующем выводе ввода-вывода отключено.
PCMSK1 – Pin Change Mask Register 1
Bit 7 6 5 4 3 2 1 0 Read/Write
Initial ValueR/W
0R/W
0R/W
0R/W
0R/W
0R/W
0R/W
0Ч/З
0(0x6C) – PCINT14 PCINT13 PCINT12 PCINT11 PCINT10 PCINT9 PCINT8 - Bit 6:0 – PCINT[14:8]: Pin Change Enable Маска 14…8
Каждый бит PCINT[14:8] определяет, разрешено ли прерывание смены контакта на соответствующем выводе ввода-вывода.Если установлено значение PCINT[14:8] и установлен бит PCIE1 в PCICR, прерывание смены контакта разрешено на соответствующем контакте ввода/вывода. Если PCINT[14:8] сброшен, прерывание смены контакта на соответствующем выводе ввода-вывода отключено.
PCMSK0 – Pin Change Mask Register 0
Bit 7 6 5 4 3 2 1 0 Read/Write
Initial ValueR/W
0R/W
0R/W
0R/W
0R/W
0R/W
0R/W
0Ч/З
0(0x6B) PCINT7 PCINT6 PCINT5 PCINT4 PCINT3 PCINT2 PCINT1 PCINT0 - Bit 6:0 – PCINT[7:0]: Pin Change Enable Маска 7…0
Каждый бит PCINT[7:0] определяет, разрешено ли прерывание смены контакта на соответствующем выводе ввода/вывода.
- .
- BIT 7: 0–
- .
-
927 Оказаться с помощью DeNnections Denections Once Once Whet с Densections Once When Office Use What Office Underse Unnion Whit Open с Densections Once Whe Office Underse Unnion Whit Open с Densections Once Once On The Connectiones. вы можете использовать следующий скетч и загрузить его на Arduino.
Светодиод подключен к контакту 13, а кнопка прикреплена к контакту прерывания 2. Таким образом, когда кнопка нажата, срабатывает прерывание и происходит изменение состояния. Но если его не подтолкнуть вверх, изменений не будет, и цикл продолжится. Функция ISR называется «мигание», а режим установлен на «изменение», так что всякий раз, когда происходит рост или падение, срабатывает прерывание. ISR используется для изменения состояния светодиода, поэтому всякий раз, когда нажимается кнопка или вызывается прерывание, светодиод светится.
В этом блоге мы узнали, что такое прерывания, их различные режимы, типы и функции, необходимые для их запуска. Мы также видели пример, чтобы понять, как запускается прерывание и как именно оно работает.
Прерывание AVR и внешнее прерывание : Arduino / ATmega328p
Примечание
Эта статья является частью Руководства по программированию микропрограммы Arduino / ATmega328p Embedded C . Подумайте о том, чтобы изучить домашнюю страницу курса и найти статьи на похожие темы.
Учебное пособие по Arduino Мастер-класс Arduino на уровне встроенного регистра C
Также посетите страницу выпуска .
Введение
В этом разделе описываются особенности обработки прерываний, выполняемой в ATmega328P. Также обсуждаются векторы прерываний, доступные в микросхеме, и то, как они используются.
Чему вы научитесь
Векторы прерываний ATmega328P
AVR предоставляет несколько различных источников прерываний. Каждое из этих прерываний и отдельный вектор сброса имеют отдельный программный вектор в памяти программ. Всем прерываниям назначаются отдельные биты разрешения, которые должны быть записаны в логическую единицу вместе с битом глобального разрешения прерывания в регистре состояния, чтобы разрешить прерывание.
Каждый вектор прерывания занимает два командных слова в ATmega328/328P. Этот список определяет уровни приоритета различных прерываний. Чем ниже адрес, тем выше уровень приоритета. Наименьшие адреса в памяти программ по умолчанию определены как векторы сброса и прерывания.
№ вектора | Программа Адрес | Источник | Определение прерывания | |||||
---|---|---|---|---|---|---|---|---|
1 | 0x0000 | RESET | External Pin, Power-on, Brown-out, Watchdog System Reset | |||||
2 | 0x0002 | INT0 | External Interrupt Request 0 | |||||
3 | 0x0004 | Int1 | Запрос на нарушение прерыва | |||||
5 | 0x0008 | PCINT1 | Pin Change Interrupt Request 1 | |||||
6 | 0x000A | PCINT2 | Pin Change Interrupt Request 2 | |||||
7 | 0x000C | WDT | Watchdog Time -out Interrupt | |||||
8 | 0x000E | TIMER2 COMPA | Timer/Counter2 Compare Match A | |||||
9 | 0x0138TIMER2 COMPB | Timer/Counter2 Compare Match B | ||||||
10 | 0x0012 | TIMER2 OVF | Timer/Counter2 Overflow | |||||
11 | 0x0014 | TIMER1 CAPT | Timer/Counter1 Capture Event | |||||
12 | 0x0016 | Timer1 Compa | Таймер/Сравнение 1 Сравнение A | |||||
13 | 0x0018 | 13 | 0x0018 | 13 | 0x0018 | 8 | 0x0018 | 0139 |
14 | 0x001A | TIMER1 OVF | Timer/Counter1 Overflow | |||||
15 | 0x001C | TIMER0 COMPA | Timer/Counter0 Compare Match A | |||||
16 | 0x001E | TIMER0 COMPB | Timer/Counter0 Compare Match B | |||||
17 | 0x0020 | TIMER0 OVF | Timer/Counter0 Overflow | |||||
18 | 0x0022 | SPI, STC | SPI Serial Transfer Complete | |||||
19 | 0x0024 | USART, RX | USART Rx Complete | |||||
20 | 0x0026 | USART, UDRE | USART, Data Register Empty | |||||
21 | 0x0028 | USART, TX | USART, Tx Complete | |||||
22 | 0x002A | ADC | ADC Conversion Complete | |||||
23 | 0x002C | EE READY | EEPROM Ready | |||||
24 | 0x002E | ANALOG COMP | Analog Comparator | |||||
25 | 0x0030 | TWI | 2-wire Serial Interface | |||||
26 | 0x0032 | SPM ГОТОВ | Сохранить готовность памяти программ |
При возникновении прерывания I-бит глобального разрешения прерывания очищается и все прерывания запрещаются. Программное обеспечение пользователя может записать логическую единицу в I-бит, чтобы разрешить вложенные прерывания. Все разрешенные прерывания могут прервать текущую процедуру прерывания. I-бит автоматически устанавливается, когда выполняется команда возврата из прерывания — RETI. Когда AVR выходит из прерывания, он всегда возвращается к основной программе и выполняет еще одну команду, прежде чем будет обслужено любое ожидающее прерывание.
Реакция на выполнение прерывания для всех разрешенных прерываний AVR составляет минимум четыре такта. После четырех тактов выполняется адрес вектора программы для фактической процедуры обработки прерывания. В течение этих четырех тактов счетчик команд помещается в стек. Вектор обычно представляет собой переход к процедуре прерывания, и этот переход занимает три такта. Если во время выполнения многоцикловой инструкции возникает прерывание, эта инструкция завершается до того, как прерывание будет обслужено. Если прерывание происходит, когда MCU находится в спящем режиме, время отклика на выполнение прерывания увеличивается на четыре такта. Это увеличение происходит в дополнение к времени запуска из выбранного спящего режима.
Возврат из процедуры обработки прерывания занимает четыре такта. В течение этих четырех тактов программный счетчик (два байта) извлекается из стека, указатель стека увеличивается на два, а бит I в SREG устанавливается.
Если программа никогда не активирует источник прерывания, векторы прерывания не используются, и в эти места могут быть помещены обычные программные коды. Это также имеет место, если вектор сброса находится в разделе приложения, а векторы прерывания — в разделе загрузки или наоборот.
BOOTRST | IVSEL | Reset Address | Interrupt Vectors Start Address | |||
---|---|---|---|---|---|---|
1 | 0 | 0x000 | 0x002 | |||
1 | 1 | 0x000 | Адрес сброса загрузки + 0x0002 | |||
0 | 0 | Адрес сброса загрузки | 0x002 | 38 01 | Адрес сброса загрузки | Адрес сброса загрузки + 0x0002 |
MCUCR – регистр управления MCU
Регистр управления MCU управляет размещением таблицы векторов прерываний.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Read/Write Initial Value | R 0 | R/W 0 | R/W 0 | R/W 0 | R 0 | R 0 | R/W 0 | R/W 0 |
0x35 (0x55) | — | BODS | BODSE | PUD | — | — | IVSEL | IVCE |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Read/Write Initial Value | R 0 | R 0 | Ч 0 | Ч 0 | Ч/З 0 | R/W 0 | R/W 0 | R/W 0 |
0x35 (0x55) | – | – | – | – | ISC11 | ISC10 | ISC01 | ISC00 |
ISC11 | ISC10 | Описание |
---|---|---|
0 | 9 | |
0 | 1 | Любое логическое изменение в INT1 генерирует запрос на прерывание. |
1 | 0 | Задний фронт INT1 генерирует запрос на прерывание. |
1 | 1 | Нарастающий фронт INT1 генерирует запрос на прерывание |
ISC01 | ISC00 | Описание |
---|---|---|
0 | 0 | |
0 | 0 | |
0 | 0 | |
0 | 0 | |
0 | 0 | |
.![]() | ||
0 | 1 | Любое логическое изменение в INT0 генерирует запрос на прерывание. |
1 | 0 | Задний фронт INT0 генерирует запрос на прерывание. |
1 | 1 | Нарастающий фронт INT0 генерирует запрос на прерывание |
EIMSK — регистр маски внешнего прерывания
Регистр маски внешнего прерывания содержит разрешение или запрет прерываний INT1 и INT0.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Read/Write Initial Value | R 0 | R 0 | R 0 | R 0 | R 0 | R 0 | R/W 0 | R/W 0 |
0x1D (0x3D) | – | — | — | — | — | — | INT1 | INT0 |