Ревич, Ю.В. Программирование микроконтроллеров 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
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==