Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 9 . Программирование таймеров 225 вого отсчета регистры TCNTx следует принудительно обнулить . Например, для 1 6-разрядного Timer 1 эта процедура выглядит так: c l r temp out TCNTlH, temp ; не забываем про порядок записи out TCNТlL , temp Если далее используется прерывание по переполнению (или с обнулением счетчика по достижении заданного числа), то каждый раз обнулять таймер необязательно. Однако при этом следует учесть, что вовремя не остановленный таймер продолжа ет считать (в том числе и в течение времени, необходимого для его остановки). По тому для точного измерения интервалов времени между событиями необходимо таймер остановить, очистить его счетные регистры и по наступлению нужного начального события запустить «в работу» заново. При необходимости следует также очищать предделитель таймеров - иначе может возникать ошибка в пределах одного периода заданной частоты на входе таймера (например, при коэффициенте 1 : 8 может возникнуть ошибка в пределах 8 периодов тактовой частоты) . Очистка осуществляется записью логической единицы в биты PSR2 или PSRlO регистра SFIOR, в некоторых моделях (ATtiny23 1 3 ) называемого так же GTCCR (бит PSRl O относится к Timer l и TimerO, а бит PSR2 - к Timer2, который может работать в асинхрон.ном режиме отдельно от первых двух). ПОДРОБНОСТИ Заметим , что в старших моделях (ATmega88/1 68/328 , например) останавливать тай меры можно не только очисткой соответствующих битов регистра управления (о чем далее), но и остановкой предделителя, - при этом прекратят счет все таймеры , кото рые в текущий момент работают от предделителя. Для остановки нужно записать ло гическую единицу в бит тsм того же регистра GTCCR, для запуска - в этот бит записы вается логический нуль . Таким способом таймеры можно синхронизировать : при сбро се тsм аппаратно сбрасываются PSR2 и Рsюо (которые в этих моделях зачем-то переименованы в PSRASY и PSRSYNC ) , и все таймеры начинают работать одновременно. В «наших» контроллерах такой удобной «фичи» , к сожалению, не имеется. Регистры управления ( тссRО и TCCR2 для 8-разрядных таймеров и тссюА и тссюв для 1 6-разрядного) используются, как ясно из их названия, для установки нужного режима таймера. В пр остейшем случае для 8-разрядного TimerO регистр управле ния тссRО только запускает таймер и устанавливает тактовую частоту счета. Все нули в разрядах этого регистра (по умолчанию) означают остановленный таймер, а комбинация трех младших битов cso2-cso o от 0 0 1 до 1 1 1 запускает таймер, одно временно задавая источник тактового сигнала. Значения от 1 до 5 этого регистра означают, что таймер будет работать от тактовой частоты МК с учетом преддели теля (коэффициент деления которого может принимать величину 1 , 1 /8, 1 / 6 4, 1 / 2 56 и 1 / 1 0 2 4, в зависимости от значения cso2-cso o). Значения тссRО, равные 6 и 7 ( 1 1 0 и 1 1 1 в младших разрядах) означают работу TimerO от внешнего источника импульсов, подаваемых на вывод ТО МК, - от падающего или нарастающего фронта этих им пульсов, соответственно. Таким простейшим режимом обходится в некоторых моделях семейства Tiny, а также в ATmega8, только TimerO . Во всех остальных моделях AVR, как и в до-
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==