AFON // радиотехник affonya@mail.ru
← Радиотехника

Прерывания и таймеры

Как МК мгновенно реагирует на события: механизм прерываний и обработчик ISR, приоритеты, таймеры-счётчики (предделитель, сравнение, захват) и расчёт интервалов.

Что такое прерывание

Прерывание — механизм, позволяющий микроконтроллеру мгновенно отреагировать на событие, прервав основную программу, выполнив специальный обработчик и вернувшись обратно. Это избавляет от постоянного «опроса» (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 · АЦП и ЦАП · Конструктор регистра.