Прост брояч на таймера на AVR

Този пример е предназначен най-вероятно за начинаещи радиолюбители. Показва как да настроите прост таймер/брояч в микроконтролер Atmega8.

Микроконтролерът Atmega8 има прост нулев таймер. Което просто чете и съхранява стойността в регистъра TCNT0. За да настроите този таймер, е необходимо да запишете определени битови стойности в регистрите. Първо, настройваме предскалера, за това има 3 бита CS0, CS1, CS2. Комбинациите от тези битове задават определена "скорост" на регистъра за броене TCNT0.

Да приемем, че нашият микроконтролер работи на честота 1000000 Hz. Избрахме 64 като прескалер.Това означава, че регистърът TCNT0 ще брои при честота 1000000/64=15625Hz. Периодът на броене е 1/152625=64µs (микросекунди). Тоест на всеки 64 микросекунди стойността на броячния регистър TCNT0 се увеличава с единица. Максималната стойност на този регистър е 255. Когато се препълни, възниква прекъсване при препълване и регистърът се нулира на 0. Времето, необходимо за препълване на брояча, се определя чрез умножаване на периода на броене и броя на итерациите на таймера 64μs * 256 = 16384 μs или 16,384 ms (милисекунди).

Основните регистри на таймера Timer0 на микроконтролера

Фигурата показва основните регистри на укротителя Atmega8. За да го конфигурирате, просто трябва да запишете определени стойности в два регистъра TCCR0 и TIMSK. Как да намерите периода на прекъсване е казано по-горе.

прост

Можете да промените този период на прекъсване от 16,384 ms с помощта на прескалер и да получите желаната честота на прекъсване.

брояч

И ако искаме нашият светодиод да светне за една секунда. След това трябва да въведем друга променлива в метода за прекъсване и да обърнем изхода при достигане на определеностойности. Има 1000ms в една секунда, периодът ни е известен също като 16,384ms. 1000/16.384=61.035. Добавете условие, ако нашата променлива е достигнала стойност 61, тогава обръщаме изхода.

прекъсване

Ако въведете такова условие, тогава 1 секунда ще бъде равна на 0,999447 s. За един ден грешката ще бъде 47,7 секунди.