Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

240 Часть 111. Практическое программирование микроконтроллеров АVR сировать число импульсов, сосчитанное к тому времени в регистрах Timer l . Но если кварцевый резонатор идеально точный, то секунда получится чуть меньше настоящей (неучтенные 0,07 Гц дадут ошибку 576 мкс в сторону уменьшения). Дr�я компенсации этой недостачи перед чтением значений мы введем задержку, с по­ мощью которой наш частотомер можно еще дополнительно калибровать (т. е. учесть исходную неточность кварца). В начале и в конце интервала будем пере­ ключать разряд 6 порта D (вывод 1 2), чтобы контролировать измерительный интер­ вал в процессе калибровки. На рис . 9 . 1 представлен МК ATmega8 с обозначением выводов для нашей цели. 8 МГц c:::J U3NlepR8/tlltR частота 11-4МГц 1 Reset РС5 28 2 RXD РС4 27 З ТХD РС3 26 4 1NTO РС2 25 5 1NT1 РС1 24 6 PD4 РСО 23 7 Vcc GND 22 8 GND AREF 21 9 XTAL1 AVCC 20 1 0 XTAL2 SCK 1 9 11 PDS (Т1 ) MISO 1 8 1 2 PD6 MOSI 1 7 1 3 PD7 РВ2 1 6 14 PBO (ICP1 ) (0С1А) РВ1 1 5 ATmega8 ГL.. контроль интерсела Рис. 9.1 . Подключение ATmega8 для измерения частоты Листинг 9 . 6 содержит фрагмент кода программы частотомера, относящийся к ини­ циализации таймеров (определение регистров я опускаю, в нашем случае их потре­ буется всего три: ternp, countЗ и count_sek ) . В секции прерываний введем прерыва­ ния ТimerO и Timer l по переполнению (по меткам: тrмo_OVF и тrм1_ovF ) . Инициали­ зация таймеров в секции начальной загрузки сводится к разрешению прерываний и запуску, но обязательно здесь же нужно очистить счетные регистры таймеров и все дополнительные регистры, а также предделитель TimerO и Timer l , и только потом запускать TimerO (для АТtiny23 l 3 почему-то регистр управления предделителем SFIOR решили переименовать в GTCCR, но в «правильном» INС-файле присутствуют оба эти названия как синонимы) . ldi temp , ( l«TOIEO ) 1 ( l«TOIEl ) ; разр . прер . TimerO и Timerl out TIMSK, temp

RkJQdWJsaXNoZXIy MTExODQxMg==