Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 9. Программирование таймеров c l r temp out TCNTlH, temp out TCNTlL , temp ; очищаем Timerl out TCNTO , temp ; очищаем TimerO ldi temp , ( 1 << РSRl О ) ; для очистки предделителя надо записать лог . 1 out SFIOR, temp ; в бит PSRlO регистра SFIOR ( GTCCR ) c l r countЗ clr count_sek ; очищаем счетчик прерываний ldi temp , ObO O O O O l O O ; out ТССRОВ , tеmр ; запускаем TimerO div 1 : 2 5 6 ldi tеmр , ОЬ0 0 0 0 0 1 1 1 ; внешний сигнал Tl ( выв . 9 ) по фронту out TCCRlB, temp ; запускаем Timerl sei 24 1 Листинг 9 . 7 иллюстрирует прерывание Timer l , которое состоит из единственной команды . TIМl OVF : inc countЗ reti Самое главное прерывание TimerO показано в листинге 9 . 8 . TIMO_OVF : ; переполнение TimerO 122 , 07 Гц inc count sek cpi count_sek , 122 ; получаем 0 . 9 9 9 4 2 4 с breq corr_l ; если секунда пpollll1 a , то на коррекцию счета reti ; иначе на выход corr_l : ; 1 сек + коррекция clr temp out TCCRO , temp ; останавливаем TimerO ; ==== задержка на 600 мкс для коррекции интервала ldi ZH, high ( l2 0 0 ) ; 8 МГЦ, 4 такта по 1 2 5 нс , 600 мкс ldi ZL , low ( l2 0 0 ) loop : sbiw ZL , l ; 2 такта brne loop ; 2 такта cbi PortD , 6 ; выключение контр . выв 12 PD6 длит . 1 с ; === конец измерения clr temp out TCCRlB , temp ; останавливаем Timerl ; читаем данные in temp, TCNTlL <пишем младший байт в память > 1 2 0 0 тактов
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==