Attachinterrupt()
Содержание:
- Volatile
- About Interrupt Service Routines
- Проблемы с несколькими аргументами в Serial.print
- Using Interrupts
- Обработка обработчика прерываний
- Вы, вероятно, используете прерывания …
- Выполнение следующей команды после включения прерываний
- Пустые прерывания
- Критические разделы (доступ к атомной переменной)
- Step 4: Writing a External Interrupt Code( Void Setup()) (step-2)
- Цикл WHILE и бесконечный цикл в Ардуино
- volatile
- Функция attachInterrupt()
- Отключение глобально и отключение одного прерывания
- Что такое приоритет прерывания?
- Возможны ли прерывания при отключении прерываний?
- Как вы используете прерывания?
- Мы прерываем нашу передачу…
- Описание
- Использование функции arduino delay
- Using Interrupts
- Внешние прерывания
- Просыпаться процессор
- Включение /выключение прерываний
- Использование прерываний
Volatile
Еще один момент, на который стоит указать: наш обработчик прерывания использует переменную для хранения состояния вывода. Проверьте определение : вместо типа , мы определили его, как тип . В чем же здесь дело? является ключевым словом языка C, которое применяется к переменным. Оно означает, что значение переменной находится не под полным контролем программы. То есть значение может измениться и измениться на что-то, что сама программа не может предсказать – в этом случае, пользовательский ввод.
Еще одна полезная вещь в ключевом слове заключается в защите от любой случайной оптимизации. Компиляторы, как выясняется, выполняют еще несколько дополнительных задач при преобразовании исходного кода программы в машинный исполняемый код. Одной из этих задач является удаление неиспользуемых в исходном коде переменных из машинного кода. Так как переменная не используется или не вызывается напрямую в функциях или , существует риск того, что компилятор может удалить её, как неиспользуемую переменную. Очевидно, что это неправильно – нам необходима эта переменная! Ключевое слово обладает побочным эффектом, сообщая компилятору, что эту переменную необходимо оставить в покое.
Удаление неиспользуемых переменных из кода – это функциональная особенность, а не баг компиляторов. Люди иногда оставляют в коде неиспользуемые переменные, которые занимают память. Это не такая большая проблема, если вы пишете программу на C для компьютера с гигабайтами оперативной памяти. Однако, на Arduino оперативная память ограничена, и вы не хотите тратить её впустую! Даже C компиляторы для компьютеров будут поступать точно так же, несмотря на массу доступной системной памяти. Зачем? По той же причине, по которой люди убирают за собой после пикника – это хорошая практика, не оставлять после себя мусор.
About Interrupt Service Routines
ISRs are special kinds of functions that have some unique limitations most other functions do not have. An ISR cannot have any parameters, and they shouldn’t return anything.
Generally, an ISR should be as short and fast as possible. If your sketch uses multiple ISRs, only one can run at a time, other interrupts will be executed after the current one finishes in an order that depends on the priority they have. relies on interrupts to count, so it will never increment inside an ISR. Since requires interrupts to work, it will not work if called inside an ISR. works initially but will start behaving erratically after 1-2 ms. does not use any counter, so it will work as normal.
Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as .
For more information on interrupts, see Nick Gammon’s notes.
Syntax
(recommended) (not recommended) (Not recommended. Additionally, this syntax only works on Arduino SAMD Boards, Uno WiFi Rev2, Due, and 101.)
Parameters
: the number of the interrupt. Allowed data types: .: the Arduino pin number.: 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.: defines when the interrupt should be triggered. Four constants are predefined as valid values:
-
LOW to trigger the interrupt whenever the pin is low,
-
CHANGE to trigger the interrupt whenever the pin changes value
-
RISING to trigger when the pin goes from low to high,
-
FALLING for when the pin goes from high to low.
The Due, Zero and MKR1000 boards allow also:
Проблемы с несколькими аргументами в Serial.print
Проблема при объединении текста и чисел и выводе в print в одной строке
Часто для отладки программы требуется вывести несколько значений, снабдив их каким-то комментарием. Например, такой текст: «Sensor’s value is: 15». Если вы просто используете такой код:
Serial.print(“Sensor’s value is: 15”);
,то все отобразится правильно. Но если вы попытаетесь вместо подстроки «15» вставить реальное показание датчика, объединив строку и числовое значение, то увидите, что строка выводится некорректно.
Serial.print(“Sensor’s value is: ” + analogRead (A0));
Этот код даст непредсказуемый результат, в мониторе порта вы не увидите или пустоту или случайный набор символов. Причина ошибки в механизме конвертации типов данных. При объединении строк «на лету», как в нашем примере, ардуино не знает, как интерпретировать типы данных для аргументов при операторе суммирования. В процессе такой непредсказуемой конвертации и результат может быть непредсказуемым.
Для решения этой проблемы вы можете использовать два способа:
Первый вариант. Объявить предварительно переменную типа String, инициализировать ее константой-строкой и использовать в аргументе print. Такой вот пример будет работать:
String str = “Sensor’s value is: “;
Serial.println(str + analogRead(A0));
Второй, более предпочтительный и удобный вариант: использование функции print несколько раз:
Serial.print(“Sensor’s value is: “);
Serial.println(analogRead(A0));
Более подробно прочитать об особенностях работы со строками при выводе информации в монитор порта можно на официальной странице Ардуино.
Проблема объединения нескольких строк в аргументе функции print
Попробуйте загрузить скетч с таким фрагментом:
Serial.print(“Sensor’s value is: ” + analogRead (A0) + “15 cm”);
В данном случае ошибка возникнет уже на стадии компиляции программы: оператор «+» не может использовать больше, чем два аргумента. Вам придется разбить одно действие на несколько составляющих, создав предварительно готовые «заготовки» строк.
Using Interrupts
Interrupts are useful for making things happen automatically in microcontroller programs, and can help solve timing problems. Good tasks for using an interrupt may include reading a rotary encoder, or monitoring user input.
If you wanted to insure that a program always caught the pulses from a rotary encoder, so that it never misses a pulse, it would make it very tricky to write a program to do anything else, because the program would need to constantly poll the sensor lines for the encoder, in order to catch pulses when they occurred. Other sensors have a similar interface dynamic too, such as trying to read a sound sensor that is trying to catch a click, or an infrared slot sensor (photo-interrupter) trying to catch a coin drop. In all of these situations, using an interrupt can free the microcontroller to get some other work done while not missing the input.
Обработка обработчика прерываний
Обработчик прерывания должен будет решить, какой вывод вызвал прерывание, если маска указывает более одного (например, если вы хотите прерывания на D8 /D9 /D10). Для этого вам нужно будет сохранить предыдущее состояние этого вывода и выполнить работу (с помощью digitalRead или аналогичного), если этот конкретный контакт изменился.
Вы, вероятно, используете прерывания …
«Обычная» среда Arduino уже использует прерывания, даже если вы лично не пытаетесь сделать это. В вызовах функций millis () и micros () используется функция «переполнение таймера». Один из внутренних таймеров (таймер 0) настроен на прерывание примерно 1000 раз в секунду и увеличивает внутренний счетчик, который эффективно становится счетчиком millis (). Для этого есть немного больше, чем при настройке для точной тактовой частоты.
Также аппаратная последовательная библиотека использует прерывания для обработки входящих и исходящих последовательных данных. Это очень полезно, так как ваша программа может делать другие вещи, в то время как прерывания запускаются и заполняют внутренний буфер. Затем, когда вы проверяете Serial.available (), вы можете узнать, что, если что-либо, было помещено в этот буфер.
Выполнение следующей команды после включения прерываний
После небольшого обсуждения и исследования на форуме Arduino мы четко выяснили, что происходит после включения прерываний. Есть три основных способа, которыми я могу думать, что вы можете включить прерывания, которые ранее не были включены:
Во всех случаях процессор гарантирует, что команда next после включения прерываний (если они были ранее отключены) всегда будет выполняться, даже если событие прерывания находится в ожидании. (Под «следующим» я подразумеваю следующий в последовательности программ, не обязательно тот, который физически следует. Например, инструкция RETI возвращается обратно туда, где произошло прерывание, а затем выполняет еще одну инструкцию).
Это позволяет вам писать код следующим образом:
Если не для этой гарантии, прерывание может перед процессор спал, а затем он никогда не может быть разбужен.
Пустые прерывания
Если вы просто хотите, чтобы прерывание разбудило процессор, но не делало ничего в частности, вы можете использовать определение EMPTY_INTERRUPT, например.
Это просто генерирует инструкцию reti (return from interrupt). Поскольку он не пытается сохранять или восстанавливать регистры, это будет самый быстрый способ получить прерывание, чтобы разбудить его.
Критические разделы (доступ к атомной переменной)
Есть некоторые тонкие проблемы в отношении переменных, которые разделяются между процедурами обслуживания прерываний (ISR) и основным кодом (т. е. кодом не в ISR).
Поскольку ISR может срабатывать в любое время, когда прерывания разрешены, вам нужно быть осторожными в доступе к таким общим переменным, поскольку они могут обновляться в тот момент, когда вы обращаетесь к ним.
Step 4: Writing a External Interrupt Code( Void Setup()) (step-2)
In void setup() we have to initialized the digital 13 pin as output and interrupt function attatchInterrupt().
void setup()
{
pinMode(13, OUTPUT);
attachInterrupt(0, blink, FALLING);
}
Here, Pin 13 is declared as output.In attachInterrupt() function first parameter is «0».This is zero because we will use digital pin 2 as external interrupt.Here «blink» is an interrupt function.You can give any name if you want.There are four state in mode they are LOW,CHANGE,RISING,FALLING and an extra one for arduino due HIGH.We use FALLING.Arduino works in digital signal.In the digital signal has four state.They are showed in figure.We use FALLING ,it mean whenever in pin 2 sense a falling edge signal, it will go to interrupt function.And complete the task.
Цикл WHILE и бесконечный цикл в Ардуино
Если вы пока еще начинающий программист и хотите понять, что вообще такое цикл и зачем он нужен – посмотрите следующий раздел этой статьи с подробным описанием.
Оператор WHILE используется в C++ и Ардуино для организации повтора одних и тех команд произвольное количества раз. По сравнению с FOR цикл WHILE выглядит проще, он обычно используется там, где нам не нужен подсчет числа итераций в переменной, а просто требуется повторять код, пока что-то не изменится, не наступит какие-то событие.
Синтаксис WHILE
while(<условие или список условий>)
{
<программный блок, который будет повторяться>
}
В качестве условий может использоваться любая конструкция языка, возвращающая логическое значение. Условиями могут быть операции сравнения, функции, константы, переменные. Как и при любых других логических операциях в Ардуино любое значение, кроме нуля будет восприниматься как истина (true), ноль – ложь (false).
Пример:
// Бесконечный цикл while(true){ Serial.println("Waiting…"); } // Цикл, выполняющийся до изменения значения функции checkSignal() while( !checkSignal() ){ Serial.println("Waiting…"); }
Обратите внимание, что оператор while может использоваться без выделения блока фигурными скобками, в этом случае повторяться будет первая команда, встреченная после цикла. Крайне не рекомендуется использовать while без фигурных скобок, т.к
в этом случае можно очень легко допустить ошибку. Пример:
while(true) Serial.print("Waiting for interruption"); delay(1000);
В данном случае надпись будет выводиться в бесконечном цикле без пауз, потому что команда delay(1000) повторяться не будет. Вы можете потратить много времени, выявляя такие ошибки – гораздо проще использовать фигурную скобку.
Пример использования цикла while
Чаще всего while используется для ожидания какого-либо события. Например, готовности объекта Serial к работе.
Serial.begin(9600); while (!Serial) { ; // Для некоторых плат ардуино требуется ждать, пока не освободится последовательный порт }
Пример ожидания прихода символа от внешних устройств по UART:
while(Serial.available()){ int byteInput = Seria.read(); // Какие-то другие действия }
В данном случае мы будем считывать значения до тех пор, пока Serial.available() будет возвращать не нулевое значение. Как только все данные в буфере закончатся, цикл остановится.
volatile
volatilevolatile
byte A = ; byte B; void loop() { A++; B = A + 1; }
- Загрузить из памяти значение A в регистр Р1
- Загрузить в регистр Р2 константу 1
- Сложить значение Р2 с Р1 (результат в Р2)
- Сохранить значение регистра Р2 в памяти по адресу A
- Сложить содержимое регистра Р1 с константой 2
- Сохранить значение регистра Р1 в памяти по адресу B
loopvolatilevolatilevolatilevolatile
#define interruptPin 2 volatile byte f = ; void setup() { pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), buttonPressed, FALLING); } void loop() { while (f == ) { } } void buttonPressed() { f = 1; }
loopvolatilevolatileinterruptsnoInterruptsатомарно исполняемый блок кода
Функция attachInterrupt()
Функция attachInterrupt() позволяет назначить функцию для обработки внешнего прерывания. Синтаксис функции:
attachInterrupt(прерывание, функция, режим);
- прерывание — это номер обрабатываемого прерывания;
- функция — имя функции обработки прерываний;
- режим — указывает условие вызова прерывания.
Допустимые значения условия вызова прерывания приведены в таблице ниже:
Ниже приведен пример использования внешнего прерывания:
#define pin 13 volatile int stat = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, stat); } void blink() // функция обработки прерывания { stat = !stat; }
Как видно из примера, прерывание int.0 используется для управления выводом 13. Функция blink() назначена для обработки прерывания с параметром CHANGE, а это означает, что любое изменение состояния вывода, ответственного за прерывание int.0, вызовет функцию.
В результате переменная «stat» изменит свое значение на противоположное
Следует обратить внимание на использование декларации переменной типом volatile. Данный тип сообщает компилятору о том, что необходимо обновить значение переменной «stat» после завершения работы обработчика прерываний (подробнее см
статью тип данных).
Отключение глобально и отключение одного прерывания
Если вы используете , вы отключите прерывания all (включая прерывания таймера, последовательные прерывания и т. д.).
Однако, если вы просто хотите отключить прерывание конкретного , тогда вы должны очистить флаг включения прерывания для этого конкретного источника прерываний. Например, для внешних прерываний вызовите .
Что такое приоритет прерывания?
Так как существует 25 прерываний (кроме сброса), возможно, что более одного события прерывания могут возникать сразу или, по крайней мере, произойти до того, как предыдущий будет обработан. Также может произойти событие прерывания, когда прерывания отключены.
Порядок приоритетов — это последовательность, в которой процессор проверяет события прерывания. Чем выше список, тем выше приоритет. Так, например, запрос внешнего прерывания 0 (контакт D2) будет обслуживаться до запроса внешнего прерывания 1 (контакт D3).
Возможны ли прерывания при отключении прерываний?
Прерывания событий (то есть, замечание события) могут возникать в любое время, и большинство из них запоминаются установкой флага «interrupt event» внутри процессора. Если прерывания отключены, то это прерывание будет обработано, когда они будут включены снова, в порядке приоритета.
Как вы используете прерывания?
- Вы пишете ISR (процедура обслуживания прерываний). Это вызывается, когда происходит прерывание.
- Вы сообщаете процессору, когда вы хотите, чтобы прерывание срабатывало.
Мы прерываем нашу передачу…
Как выясняется, существует отличный (но недостаточно часто используемый) механизм, встроенный во все Arduino, который идеально подходит для отслеживания событий в режиме реального времени. Данный механизм называется прерыванием. Работа прерывания заключается в том, чтобы убедиться, что процессор быстро отреагирует на важные события. При обнаружении определенного сигнала прерывание (как и следует из названия) прерывает всё, что делал процессор, и выполняет некоторый код, предназначенный для реагирования на вызвавшую его внешнюю причину, воздействующую на Arduino. После того, как этот код будет выполнен, процессор возвращается к тому, что он изначально делал, как будто ничего не случилось!
Что в этом удивительного, так это то, что прерывания позволяют организовать вашу программу так, чтобы быстро и эффективно реагировать на важные события, которые не так легко предусмотреть в цикле программы. И лучше всего это то, что прерывания позволяют процессору заниматься другими делами, а тратить время на ожидание события.
Описание
Цифровые выводы с прерываниями
Первый параметр – это номер прерывания. Как правило, вы должны использовать для перевода реального цифрового вывода в конкретный номер прерывания. Например, если вы подключаетесь к выводу 3, используйте в качестве первого параметра .
Плата | Цифровые выводы, используемые для прерываний |
---|---|
Uno, Nano, Mini, other 328-based | 2, 3 |
Uno WiFi Rev.2 | все цифровые выводы |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
Zero | все цифровые выводы, кроме 4 |
MKR Family boards | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Due | все цифровые выводы |
101 | все цифровые выводы (Выводы 2, 5, 7, 8, 10, 11, 12, 13 работают только с CHANGE) |
Использование функции arduino delay
Синтаксис
Ардуино delay является самой простой командой и её чаще всего используют новички. По сути она является задержкой, которая приостанавливает работу программы, на указанное в скобках число миллисекунд. (В одной секунде 1000 миллисекунд.) Максимальное значение может быть 4294967295 мс, что примерно ровняется 50 суткам. Давайте рассмотрим простой пример, наглядно показывающий работу этой команды.
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // подаем высокий сигнал на 13 пин delay(10000); // пауза 10000мс или 10 секунд digitalWrite13, LOW); // подаем низкий сигнал на 13 пин delay(10000); // пауза 10000мс или 10 секунд }
В методе setup прописываем, что пин 13 будет использоваться, как выход. В основной части программы сначала на пин подается высокий сигнал, затем делаем задержку в 10 секунд. На это время программа как бы приостанавливается. Дальше подается низкий сигнал и опять задержка и все начинается сначала. В итоге мы получаем, что на пин поочередно подается, то 5 В, то 0.
Нужно отчетливо понимать, что на время паузы с помощью delay работа программы приостанавливается, приложение не будет получать никаких данных с датчиков. Это является самым большим недостатком использования функции delay в Arduino. Обойти это ограничения можно с помощью прерываний, но об этом мы поговорим в отельной статье.
Пример delay с миганием светодиодом
Пример схемы для иллюстрации работы функции delay.
Можно построить схему со светодиодом и резистором. Тогда у нас получится стандартный пример – мигание светодиодом. Для этого на пин, который мы обозначили как выходной, необходимо подключить светодиод плюсовым контактом. Свободную ногу светодиода через резистор приблизительно на 220 Ом (можно немного больше) подключаем на землю. Определить полярность можно, если посмотреть на его внутренности. Большая чашечка внутри соединена с минусом, а маленькая ножка с плюсом. Если ваш светодиод новый, то определить полярность можно по длине выводов: длинная ножка – плюс, короткая – минус.
Using Interrupts
Interrupts are useful for making things happen automatically in microcontroller programs and can help solve timing problems. Good tasks for using an interrupt may include reading a rotary encoder, or monitoring user input.
If you wanted to ensure that a program always caught the pulses from a rotary encoder, so that it never misses a pulse, it would make it very tricky to write a program to do anything else, because the program would need to constantly poll the sensor lines for the encoder, in order to catch pulses when they occurred. Other sensors have a similar interface dynamic too, such as trying to read a sound sensor that is trying to catch a click, or an infrared slot sensor (photo-interrupter) trying to catch a coin drop. In all of these situations, using an interrupt can free the microcontroller to get some other work done while not missing the input.
Внешние прерывания
Прерывание (interrupt) — это сигнал, сообщающий процессору о наступлении некоторого события, требующего немедленной обработки. Процессор приостанавливает текущую активность, сохраняя свое состояние, передает управление обработчику прерывания, после чего возвращает управление в прерванный код.
Для работы с прерываниями в Arduino есть 2 функции:
- attachInterrupt()
- detachInterrupt()
Функция attachInterrupt()
Описание
Задает функцию, которая будет вызвана по внешнему прерыванию. Если функция уже была задана, то она будет заменена на новую. Рекомендуется использовать функцию digitalPinToInterrupt(pin) для перевода номера пина в номер прерывания. Например, если вы подключены к пину 3, используйте digitalPinToInterrupt(3) в качестве первого параметра attachInterrupt().
Плата Arduino | Пины, используемые для прерываний |
---|---|
Arduino Uno, Arduino Nano, Arduino Mini и остальные на ATmega328 | 2, 3 |
Arduino Mega, Arduino Mega2560 | 2, 3, 18, 19, 20, 21 |
Arduino Micro, Arduino Leonardo и остальные на ATmega32U4 | 0, 1, 2, 3, 7 |
Arduino Zero | все цифровые пины кроме 4 |
Arduino Due | все цифровые пины |
Прерывания полезны, когда нужно читать значения с некоторых датчиков или обслуживать ввода пользователя.
ISR (Interrupt Service Routine) — это особые функции, которые имеют некоторые уникальные ограничения, которых нет у большинства других функций. ISR не может иметь никаких параметров, и они не должны ничего возвращать.
Как правило, функция ISR должна быть максимально короткой и быстрой. Если в одной программе задано несколько ISR-функций, то одновременно выполняться может только одна, остальные будут выполняться после завершения текущей в порядке, заданным приоритетом. Функция millis() использует прерывания для подсчета, поэтому возвращаемое ей значение не будет увеличиваться внутри ISR. Поскольку функции delay() для работы требуются прерывания, он тоже не будет работать. micros() сначала будет работает, но через 1-2 мс начнет возвращать неверный беспорядочный результат. delayMicroseconds() не использует счетчик, поэтому она будет работать как обычно.
Обычно для передачи данных между функциями ISR и основной программой используются глобальные переменные. Чтобы быть уверенными, что переменные, общие для ISR и основной программы, будут работать правильно, следует объявить их как volatile.
Синтаксис
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) — правильное использование
attachInterrupt(interrupt, ISR, mode) — так использовать не рекомендуется
attachInterrupt(pin, ISR, mode) — так использовать не рекомендуется (только для плат Arduino SAMD, Arduino Uno WiFi Rev2, Arduino Due, Arduino 101)
Параметры
interrupt — номер прерывания
pin — номер пина
ISR — функция для вызова при возникновении прерывания; эта функция не должна принимать никаких параметров и ничего не должна возвращать; эту функцию иногда называют процедурой обработки прерываний
mode — определяет, когда прерывание должно быть запущено
Допустимые значения параметра mode:
- LOW — вызов прерывания когда на пине значение LOW
- CHANGE — вызов прерывания когда на пине меняется значение
- RISING — вызов когда значение переходит от LOW к HIGH
- FALLING — вызов когда значение переходит от HIGH к LOW
- HIGH (доступно только для Arduino Due, Arduino Zero) — вызов прерывания когда на пине значение HIGH
Возвращаемое значение
нет
Пример
Зажигаем и гасим встроенный светодиод при изменении сигнала на 2 пине:
Примечания
Внутри функции, вызываемой по прерыванию, функции delay() работать не будет, а возвращаемое функцией millis() значение не будет увеличиваться. Последовательные данные, полученные во время использования функции, могут быть потеряны. Вы должны объявить как volatile любые переменные, которые вы изменяете в функции.
Функция detachInterrupt()
Описание
Отключает прерывание.
Синтаксис
detachInterrupt(digitalPinToInterrupt(pin)) — правильное использование
detachInterrupt(interrupt) — так использовать не рекомендуется
detachInterrupt(pin) — так использовать не рекомендуется (только для плат Arduino SAMD, Arduino Uno WiFi Rev2, Arduino Due, Arduino 101)
Параметры
interrupt — номер прерывания, которое нужно отключить
pin — номер пина прерывания для отключения
Возвращаемое значение
нет
Просыпаться процессор
Внешние прерывания, прерывания смены контактов и прерывание сторожевого таймера также могут использоваться для разбухания процессора. Это может быть очень удобно, так как в спящем режиме процессор может быть настроен на использование намного меньшей мощности (например, около 10 микроампер). Прерывание восходящего, падающего или низкого уровня может использоваться для пробуждения гаджета (например, если вы нажмете на него кнопку), или прерывание «сторожевого таймера» может периодически разбудить его (например, для проверки времени или температура).
Пин-переменные прерывания могут использоваться для разбухания процессора, если клавиша нажата на клавиатуре или аналогичной.
Процессор также может быть разбужен прерыванием таймера (например, таймер, достигающий определенного значения или переполнение) и некоторые другие события, такие как входящее сообщение I2C.
Включение /выключение прерываний
Прерывание «сброса» не может быть отключено. Однако другие прерывания можно временно отключить, очистив флаг глобального прерывания.
Использование прерываний
Прерывания полезны для того, чтобы всё в программах микроконтроллеров происходило автоматически, и могут помочь решить проблемы с синхронизацией. Подходящие задачи для использования прерываний включают в себя считывание поворотного энкодера или мониторинг пользовательского ввода данных.
Если вы хотите обеспечить, чтобы программа всегда будет захватывать импульсы от поворотного энкодера, так чтобы она никогда не пропускала их, было бы сложно написать последовательно выполняемую программу, которая делала бы что-либо еще, потому что программе необходимо было бы постоянно выполнять опрос линий датчика, идущих от энкодера, чтобы отлавливать импульсы при их появлении. Другие датчики также имеют аналогичную динамику интерфейса, например, попытка прочитать звуковой датчик, который пытается отловить щелчок, или инфракрасный датчик (фотопрерыватель), который пытается отследить падение монеты. Во всех этих ситуациях использование прерывания может освободить микроконтроллер для выполнения какой-либо другой работы, не пропуская ввода данных.