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

244 Часть 111. Практическое программирование микроконтропперов АVR следующего фронта/спада, и за это время можем совершить достаточно много опе­ раций (в предположении, что частота внешних событий невелика) . В этом случае порядок действий такой (предположим, что мы «ловим» положи­ тельные импульсы) : сначала устанавливаем «захват» по фронту (установкой бита rcEsl), разрешаем прерывание «захвата», но таймер не запускаем, только обнуляем его счетные регистры. В наступившем прерывании немедленно запускаем таймер и переключаем «захват» на реакцию по спаду (сбросом бита rcEsl) . В следующем прерывании фиксируем содержимое регистра захвата ICRlН : rсю1, производим с ним необходимые действия, останавливаем таймер, очищаем его и переключаем опять «захват» на реакцию по фронту. При измерении именно периода переключать фронт/спад не нужно, а вот регистры таймера очищать все равно требуется . Поскольку кроме задержки собственно «за­ хвата» имеется еще задержка возникновения прерывания (6-7 тактов, в зависимо­ сти от модели), и на выполнение команд очистки также необходимо время (не ме­ нее двух тактов на каждую), то общая ошибка может составлять около 1 2 тактов, что при точных измерениях бывает недопустимо. Эту ошибку можно учесть (про­ сто прибавляя 1 2 тактов к числу, зафиксированному в счетчике таймера), а для пе­ риодических сигналов поступить более радикально: проводить измерения лишь каждый второй период. Разумеется, если частота заполнения счетчика 1 / 8 от такто­ вой и ниже, то эта ошибка становится незначимой (чтобы ее снизить дополнитель­ но, следует использовать возможность очистки регистров предделителя, имею­ щуюся в большинстве Mega) . Листинг 9 . 9 иллюстрирует процесс измерения периода в простейшем случае «лов­ ли» редких событий без учета всех этих нюансов («подавление шума» также не включаем- редкие события могут проявлять себя достаточно короткими импуль­ сами). RESET : ldi temp , ( 1<< TICIEl ) 1 ( l<<TOIEl ) ; разр . прер . "захвата" и ; переполнения Timerl out TIMSK, temp clr temp out TCNTlH, temp out TCNTlL , temp ; очищаем Timerl clr countO ; регистры ДJIЯ сохранения числа в счетчике clr countl clr count2 ; старший разряд счетчика ldi temp , Ob0 1 0 0 00 1 0 ; "захват " по фронту, частота 1 / 8 ldi temp , ( 1<< PSRl O ) ; ДJiя очистки предделителя надо записать лог . 1 out SFIOR, temp ; в бит PSRl O регистра S FIOR ( GTCCR ) out TCCRlB , temp ; запускаем Timerl sei

RkJQdWJsaXNoZXIy MTExODQxMg==