Что такое прерывание
Прерывание — механизм, позволяющий микроконтроллеру мгновенно отреагировать на событие, прервав основную программу, выполнив специальный обработчик и вернувшись обратно. Это избавляет от постоянного «опроса» (polling) и делает систему отзывчивой и экономичной: процессор занимается делом, а не крутится в ожидании события.
Как это работает
Источник (таймер, вывод, UART, АЦП) при событии выставляет флаг. Если прерывания разрешены глобально и для этого источника, процессор завершает текущую инструкцию, сохраняет контекст, переходит по вектору прерывания к обработчику (ISR), выполняет его и возвращается. Ключевые правила ISR:
- обработчик должен быть максимально коротким;
- переменные, разделяемые с основным кодом, объявляют
volatile; - долгие операции и задержки в ISR недопустимы.
У многих МК прерывания имеют приоритеты: более важное прерывает менее важное (вложенные прерывания).
Таймеры-счётчики
Таймер — аппаратный счётчик, инкрементируемый тактовыми импульсами. Он работает независимо от ядра и решает массу задач: отсчёт интервалов, генерация ШИМ, захват момента события, тактирование периодических действий. Основные элементы:
- Предделитель (prescaler) — делит тактовую частоту, задавая шаг счёта.
- Переполнение — при достижении максимума генерируется прерывание.
- Сравнение (compare) — прерывание/действие при совпадении с заданным значением.
- Захват (capture) — фиксация значения счётчика по внешнему событию.
Расчёт интервала
t = (предделитель × N) / F_такт
N — число отсчётов до срабатывания
F_такт — тактовая частота МК
Подбором предделителя и предела счёта получают нужный период — от микросекунд до секунд. Точные интервалы обычно строят на прерывании по совпадению (CTC у AVR).
Частые вопросы
Прерывания или опрос (polling)?
Опрос прост, но тратит процессорное время и может пропустить короткое событие. Прерывания реагируют мгновенно и экономят ресурсы, но усложняют код. Для редких и критичных по времени событий — прерывания, для простых опросов состояния — polling.
Почему переменную в ISR объявляют volatile?
Компилятор может «закэшировать» переменную в регистре и не заметить её изменения в обработчике. volatile заставляет читать её из памяти каждый раз, обеспечивая корректный обмен между ISR и основным кодом.
Итоги
Прерывания дают мгновенную реакцию на события без постоянного опроса, а таймеры генерируют точные интервалы, ШИМ и метки времени независимо от ядра. Вместе они — основа отзывчивых и эффективных встраиваемых программ. Обработчик держат коротким, общие переменные — volatile.
Смотрите также: ШИМ · AVR на C · АЦП и ЦАП · Конструктор регистра.