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

Глава 9. Программирование таймеров 243 с помощью определения периода. Этот же режим подходит для фиксации редких событий (например, прохождения частиц через счетчик Гейгера) - тогда подсчет времени между событиями пригодится, например, для статистики. Пример исполь­ зования этого режима приведен также в программе работы с ультразвуковым дат­ чиком в главе 1 6. Рассмотрим, как это можно осуществить на практике для измерения периода. В ре­ жиме работы с «захватом» может функционировать 1 6-разрядный Timer 1 . Внешний импульс следует при этом подавать на специальный вывод ICP l (совпадающий в АTmega8 с выводом РВО, в АTtiny23 l 3 - с выводом PD6). «Захват» фронта или спада выбирается установкой бита ICESl (бит б) в регистре управления тссюв. При этом в системе «захвата» действует нечто вроде «антидребезга» - установкой бита ICNCl (бит 7) в том же регистре можно включить схему «подавления шума», кото­ рая после прихода фронта или, соответственно, спада, 4 раза определяет уровень сигнала и принимает решение о «захвате» только в том случае, если все четыре из­ мерения одинаковы. Заметим, что для Timer l всех моделей AVR источником сиг­ нала «захвата» вместо вывода ICP I может служить аналоговый компаратор (см. главу 1 1) . Собственно событие «захвата» состоит в том, что в момент, когда оно происходит, содержимое счетных регистров Тimer 1 переносится в специальный 1 6-разрядный регистр rсюн : ICRlL. Поэтому для таймера режим «захвата» специально включать не требуется (только установить режим по фронту или спаду) - ни на счет, ни на другие функции таймера он никак не влияет. Для того чтобы можно было обнару­ жить, что «захват» произошел, имеется соответствующее прерывание Timer l Capture, которое разрешается установкой бита тrcrEl регистра тrмsк. При проведении точных измерений следует учесть, что между «захватом» и копи­ рованием счетного регистра имеется задержка около трех тактов («захват» проис­ ходит синхронно с тактовым сигналом, потому разброс может составлять один такт). Включение схемы «подавления шума» увеличивает задержку еще на четыре такта. Следует отметить, что на практике такая схема малоэффективна: «настоя­ щий» дребезг длится десятки микросекунд, так что схема его не «отловит», и таким образом можно фильтровать только очень короткие «иголки», встречающиеся до­ вольно-таки редко. В результате схема действий при измерении периода такова: разрешается прерыва­ ние «захвата», и таймер запускается на счет с нужной частотой . Измеряемый сиг­ нал подается на вывод ICP I (у ATmega8 это вывод 1 4, его необходимо оставить сконфигурированным на вход). В прерывании с содержимым регистров «захвата» ICRlН и ICRlL производятся нужные операции. Вопрос, однако: что при этом делать с самим таймером? Оrвет зависит от необхо­ димой методики измерения . Если необходимо измерение не периода (т. е. проме­ жутка времени между фронтами или между спадами), а интервала времени (т. е . промежутка времени между фронтом и спадом или между спадом и фронтом, что более частая задача), в прерывании «захвата» нужно переключать активный уро­ вень с помощью установки или сброса бита ICESl в регистре тссRlВ. Тогда упро­ щаются также и последующие действия - мы имеем запас времени до прихода

RkJQdWJsaXNoZXIy MTExODQxMg==