m08-05 теория 6 мин

Таймеры и прерывания

Таймер — счётчик внутри микроконтроллера, который тикает с заданной частотой. Он умеет: отсчитывать время, генерировать ШИМ, считать внешние импульсы, вызывать прерывания.

Прерывание — событие, которое останавливает основной цикл и запускает обработчик. Такты, кнопки, UART, АЦП, таймеры — всё это источники прерываний.

Зачем: без таймеров и прерываний микроконтроллер только опрашивает входы в цикле, и точность зависит от того, чем он занят. С таймером — точность от кварца, независимо от кода.

Пример: мигание раз в секунду через delay(1000) работает плохо (цикл блокируется), а через таймер — точно и без блокировки.

Типичные задачи: считать время между событиями (измерение длительности импульса), генерировать ШИМ на нескольких каналах, опрашивать АЦП с фиксированной частотой, программные часы, антидребезг, watchdog (сброс при зависании).

Правила обработчика прерывания:

— Коротко. Микросекунды, не миллисекунды.
— Никаких delay и Serial.print внутри (они сами на прерываниях).
— Общие переменные с основным циклом помечать volatile.
— Не вызывать тяжёлые функции и не работать с памятью, если можно отложить.
— Менять только флаг или счётчик, а логику делать в loop().

Тонкость: у ESP32 прерывания на всех пинах, но обработчик выполняется в отдельной задаче, и есть ограничения FreeRTOS. У AVR — классические ISR, где даже millis() внутри может не тикать.

И ещё: watchdog — это тоже таймер. Если основной цикл завис и не «покормил» его, микроконтроллер перезагрузится. Для устройств, которые работают месяцами без присмотра, это обязательно.

Зачем

Без таймеров и прерываний не сделать ни точных измерений, ни отзывчивого интерфейса.

Сделай сейчас

Сделай мигание светодиодом на таймере без delay: настрой прерывание на 1 Гц и переключай пин в обработчике. Основной цикл при этом свободен.

Проверь себя

Почему нельзя ставить delay() внутрь обработчика прерывания?

Обработчик блокирует всё остальное, включая другие прерывания и основной цикл. delay на 100 мс означает, что 100 мс система не реагирует ни на что. Кроме того, некоторые функции Arduino внутри используют прерывания и просто зависнут.

Пройти тест 5 заданий
0 из 102 · 0%
Источники
  1. Wikipedia: Timer
    таймеры
  2. ESP-IDF: GPIO и прерывания
    прерывания и их обработка