Таймери Arduino UNO — Частина 2. Робота з перериваннями таймерів

Теорія

Що таке переривання і навіщо воно потрібне

Переривання — це спеціальний механізм мікроконтролера, який дозволяє при виникненні певної події миттєво призупинити виконання основного коду і виконати спеціальну функцію — обробник переривання (ISR, Interrupt Service Routine).

Переривання використовуються для завдань, які потребують високої точності за часом, наприклад, вимірювання інтервалів, генерація сигналів, опитування датчиків, прийом даних по UART.

Налаштування апаратного таймера на переривання

У мікроконтролері ATmega328P можна налаштувати таймер так, щоб він викликав переривання через задані інтервали часу. Для цього потрібно:

  1. Вибрати режим роботи таймера (наприклад, CTC — скидання за збігом).
  2. Встановити значення порівняння у регістрі OCRnA (Output Compare Register).
  3. Дозволити переривання у регістрі TIMSKn.
  4. Дозволити глобальні переривання командою sei().

Регістр TIMSKx і вектори переривань

  • TIMSK0, TIMSK1, TIMSK2 — регістри дозволу переривань для відповідних таймерів.
  • Вектор переривання — це адреса функції, яку викличе контролер при спрацюванні події. Наприклад, для таймера 1 у режимі CTC це TIMER1_COMPA_vect.

Практика

Налаштування Timer1 для виклику переривання кожні 1 мс


#include <avr/interrupt.h>

volatile unsigned long counter = 0; // Лічильник мілісекунд

void setup() {
  pinMode(13, OUTPUT);

  // Налаштування Timer1
  noInterrupts();           // Вимикаємо переривання
  TCCR1A = 0;               // Регістр керування A
  TCCR1B = 0;               // Регістр керування B
  TCNT1  = 0;               // Скидання лічильника

  OCR1A = 15999;            // 16 МГц / 1000 Гц / 1 = 16000 - 1
  TCCR1B |= (1 << WGM12);   // Режим CTC
  TCCR1B |= (1 << CS10);    // Дільник 1 (prescaler 1)
  TIMSK1 |= (1 << OCIE1A);  // Дозволяємо переривання за збігом

  interrupts();             // Увімкнення переривань
}

ISR(TIMER1_COMPA_vect) {
  counter++;
  digitalWrite(13, !digitalRead(13)); // Мигаємо світлодіодом
}

void loop() {
  // Основний код може виконуватись паралельно
}
  

Мерехтіння світлодіода в обробнику переривання

У наведеному прикладі вбудований світлодіод на піні 13 блимає кожні 1 мс. Але на практиці так часто блимати немає сенсу — людське око цього не побачить.

Проєкт: Точний секундомір з використанням переривань

Створимо секундомір, який рахує час з точністю до мілісекунди, використовуючи переривання Timer1.


#include <avr/interrupt.h>

volatile unsigned long millisCounter = 0;

void setup() {
  Serial.begin(9600);

  // Налаштування Timer1
  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;

  OCR1A = 249;              // 16 МГц / 64 / 1000 Гц = 250 - 1
  TCCR1B |= (1 << WGM12);   // Режим CTC
  TCCR1B |= (1 << CS11) | (1 << CS10); // Дільник 64
  TIMSK1 |= (1 << OCIE1A);  // Дозволяємо переривання

  interrupts();
}

ISR(TIMER1_COMPA_vect) {
  millisCounter++;
}

void loop() {
  static unsigned long lastPrint = 0;
  if (millisCounter - lastPrint >= 1000) { // Кожну секунду
    lastPrint = millisCounter;
    Serial.print("Секунд пройшло: ");
    Serial.println(millisCounter / 1000);
  }
}
  

Тепер секундомір працює незалежно від основного коду завдяки перериванням, а точність не залежить від функцій delay().

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Корпус пластиковий 100x60x25мм

Корпус пластиковий 100x60x25мм

Універсальний бокс з чорного пластику під саморобні електронні пристроїArduino UNO та Leonardo якраз..

74.20грн.

Відправка даних у Google Sheets за таймером (ESP32 кожні 5 хвилин пише дані)

Відправка даних у Google Sheets за таймером (ESP32 кожні 5 хвилин пише дані)

ESP32 → Google Sheets: відправка даних у таблицю кожні 5 хвилин У цьому прикладі ESP32 автомати..

Гвинт М2х20мм оцинкований

Гвинт М2х20мм оцинкований

Гвинт оцинкований з різьбою М2 для кріплення елементів любительських проектівДовжина різьби 20 мм..

3.68грн.

Розробка друкованих плат на замовлення — професійне проєктування PCB для бізнесу

Розробка друкованих плат на замовлення — професійне проєктування PCB для бізнесу

Розробка друкованих плат на замовлення — професійне проєктування PCB для бізнесу Розробка друко..

Фільтрація шумів аналогового сигналу

Фільтрація шумів аналогового сигналу

Шум аналогового входу Будь-який аналоговий датчик, з'єднувальні дроти, та і сам аналоговий вхід кон..