Апаратна затримка Robotic & Microcontroller Educational Knowledgepage - Network of Excellence
Необхідні знання: Kontrollermoodul, Loendurid/Taimerid, Sisend-väljundviigud, Viide, Taimerid, Tarkvaraline viide
Програмна затримка не єдиний спосіб створення пауз. Те саме можна зробити і за допомогою таймера. Таймер - це апаратний лічильник, що збільшується або зменшується з певною частотою. Тактовий сигнал лічильника, як правило, можна створити з робочого такту мікроконтролера або іншого зовнішнього такту. В цілому, частоту тактового сигналу можна поділити якимось помножувачем частоти для отримання меншої тактової частоти – це робиться тактовим дільником, який англійською мовою називається prescaler. Важливим фактом є те, що значення лічильника з фіксованою тактовою частотою перебуває у лінеарній залежності від часу. Час можна розрахувати, помноживши тактовий сигнал лічильника значення періоду лічильника.

AVR лічильник можна змусити повідомляти про переповнення лічильника (англійською overflow) або при досягненні певного значення (англійською compare match). Переповнення створюється в той момент, коли лічильник набув максимально можливого значення і починає заново рахувати від нуля. При досягненні конкретного значення в момент збільшення лічильника відбувається порівняння нового значення зі значенням, заданим користувачем. У момент виникнення події відповідні біти в регістрі стану AVR автоматично налаштовуються верхнім.
Щоб створити затримку таймером, достатньо лише налаштувати лічильник і очікувати досягнення верхнього значення розряду стану. На відміну від програмних затримок, робота таймера не залежить від компілятора, що робить їх використання надійнішим. Поряд з цим, через різноманітність (або складності) лічильників AVR їх налагодженняможе здатися скрутним. Залежно від сигналу такту мікроконтролера може також статися те, що він не ділиться на бажаний період затримки і затримка не точна.
Програмний код, що знаходиться нижче, є функцією затримки заснованої на таймері, яка трохи спрощена. Принцип зчитування такий самий, як і за програмної функції затримки – створюється бажане число затримок довжиною 1 мс. Для створення затримки використовується 8-бітний ATmega128 лічильник 0. Раніше вже було обчислено, що при тактовій частоті 14,7456 Mhz тактовий сигнал лічильника повинен бути розділений принаймні на 64, щоб протягом 1 мс 8-бітний лічильник не переповнився. Те, яким значенням повинен мати лічильник, щоб переповнення відбувалося через 1 мс, представлене у вигляді виразу та присвоєно змінній timer_start. F_CPU макро мовою є константою, яка показує тактову частоту в герцах. Що стосується згаданої тактової частоти значення лічильника має бути 25,6, але т.к. число з дробом використовувати не можна, початкове значення лічильника буде 26. На жаль, тут виникає помилка в часі затримки, але вона досить маленька (-1,7 μs).
У циклі відбувається ініціалізація лічильника та обнулення прапора переповнення (вписуючи туди 1). І тут очікується поки лічильник вважає початкове значення до 256, тобто. до переповнення. У момент переповнення прапор переповнення йде вгору і відбувається 1 мс затримка. Наприкінці функції таймер зупиняється.
Ця функція затримки використовує бібліотеку таймерів, вихідний код якого виглядає таким чином:
Далі наведена така ж програма, як і в прикладі програмної затримки. У короткому 100 мс напівперіоді спалахує LED, у довгому 900 мс напівперіоді він згасає. В результаті блимає LED через кожнусекунду. На жаль, і цей приклад період не дорівнює 1 секунді, тому що заповнення інших функцій програми в кожному циклі займає час. Для точного розрахунку часу доведеться використовувати 16-бітовий таймер разом із перервами.