Переривання від таймера (або Звук із Arduino
33 цифрові цифрові вироби з використанням Arduino
Переривання від таймера (або Звук із Arduino. Частина 2)
Зазвичай майстри «не виносять» Arduino. І в числі основних претензій, як правило, наводять бібліотеки та приклади програм, які їх використовують. Справді, програми часто пишуться «по-дитячому», використовуються програмні затримки та інші «ліниві» методи… В результаті процесор більшу частину часу займається чим завгодно, тільки не корисними речами. Одним із способів вивільнити час процесора для виконання корисних функцій є використання системи переривань.
У статті коротко розглядається механізм використання переривань від таймера.
За основу взято цей перекладний матеріал. У наведеному прикладі використовуються переривання по переповненню Таймера2 ATmega. У мікроконтролері три таймери: Таймер 0 «краще не чіпати», т.к. він задіяний у відпрацюванні функції millis(), а ось два інших цілком можна «підкорити собі», пожертвувавши ШИМ на деяких виходах.
При роботі з таймером потрібно спочатку його запустити в потрібному режимі (у програмі використано найпростіший режим 0), і включити відпрацювання переривання від нього (у програмі займається процедура SetupTimer2()).
Процедура обробки переривання прописується за допомогою конструкції ISR() (Interrupt Service Routine), де в якості аргументу вказується вектор переривання. Гарна табличка з усіма перериваннями у Arduino наведена тут. У прикладі використовується переривання Таймера 2 по переповненню (TIMER2_OVF_vect).
Програма формує «звуковий» сигнал на виводі 8 із частотою 2,4КГц (0,4 сек), потім 1,5КГц (0,8 сек) з одночасним включенням контрольного світлодіода на виводі 13.


Приклад демонстраційний: процедура включення звуку (VoiceOn) включає формування прямокутника з частотою близькою до значення першого аргументу (Гц) та тривалістю мс - другий аргумент.
При роботі з таймером використано «ручне» завантаження наступного відліку (правильніше було б використовувати інший спосіб). Від прапора flVoiceOn можна було б відмовитися (його функцію успішно виконує time_end), але… «так надійніше» і легше відстежувати закінчення звучання.
За такої побудови програми (на відміну першої частини статті) процесор після запуску процесу формування звуку — «вільний» до виконання корисних дій (див цикли while…)