ПРЕРЫВАНИЯ ПО ТАЙМЕРАМ НА ARDUINO

Прерывания таймера – мощный инструмент, который позволяет выполнять какое-то событие независимо от загруженности основного цикла и присутствия в нём задержек. Нужно генерировать сигнал – пожалуйста, сделать динамическую индикацию для матриц или дисплеев – вам сюда! На Arduino NANO три таймера: 0, 1 и 2. Настраивая прерывания на каждом из них вы теряете:

  • Timer 0 – перестают работать функции времени (delay(), millis()…), не работает генерация ШИМ на пинах D5 и D6, перестают работать все библиотеки, так или иначе завязанные на системном времени
  • Timer 1 – перестаёт работать ШИМ на пинах D9 и D10 и библиотеки, завязанные на 1 таймере (Servo и другие)
  • Timer 2 – перестаёт работать ШИМ на пинах D3 и D11, функции tone()/pulseIn()/pulseOut() и библиотеки, завязанные на 2 таймере

“Таймеры” на прерываниях таймера хороши тем, что не боятся загруженного главного цикла и работают параллельно ему, но таких таймеров можно создать ограниченное количество! А именно, максимум три, потеряв кучу функций микроконтроллера. Для задач, не требующих жёсткого тайминга, используйте таймер на millis(), как пример, вот эту мою библиотеку.

БИБЛИОТЕКА GYVERTIMER012

Лёгкая библиотека для управления всеми тремя таймерами ATmega328/ATmega168

  • Генерация прерываний по таймерам 0/1/2
  • Настройка частоты или периода прерываний
  • Остановка, сброс и продолжение счёта

Поддерживаемые платформы: платы на ATmega328/168 (Arduino Nano, UNO, Pro Mini и соответствующие им клоны)

ДОКУМЕНТАЦИЯ


// N - номер таймера (0, 1 или 2)
void timerN_ISR(void (*isr)());         // подключить прерывание
void timerN_setPeriod(uint32_t time);   // установить период (мкс)
void timerN_setFrequency(uint32_t hz);  // установить частоту (Гц)
void timerN_start(void);                // запустить
void timerN_stop(void);                 // остановить
void timerN_resume(void);               // продолжить
void timerN_restart(void);              // перезапустить

ПРИМЕРЫ


#include 

void setup() {
  Serial.begin(9600);
  timer1_setPeriod(500000);   // ставим период на 500 000 мкс (0.5 с)

  // то же самое, но в Герцах
  // timer1_setFrequency(2);    // ставим 2 герца

  timer1_ISR(handler);    // подключить прерывание
  timer1_start();         // запустить таймер

  // timer1_stop();       // остановить таймер
  // timer1_resume();     // продолжить таймер
  // timer1_restart();    // перезапустить таймер
}

void handler() {
  Serial.println("isr!");
}

void loop() {

}

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.