Блоки сравнения
16-разрядный цифровой компаратор непрерывно сравнивает значение TCNTn со значением регистра порога сравнения (OCRnx). Если значение TCNT равно OCRnx, то компаратор формирует сигнал совпадения (равенства). Следующий за совпадением такт ЦПУ устанавливает флаг сравнения (OCFnx). Если бит OCIEnx = 1, то установка флага сравнения приведет к генерации прерывания по результату сравнения. Флаг OCFnx автоматически сбрасывается после перехода на вектор обработки прерывания. Альтернативно флаг OCFnx сбрасывается программно, если записать в него лог. 1. Сигнал совпадения используется формирователем выходного сигнала, результирующая форма которого зависит от выбранного с помощью бит WGMn3:0 режима работы таймера и режима формирования импульсов (биты COMnx1:0). Сигналы ВЕРХНИЙ ПРЕДЕЛ и НИЖНИЙ ПРЕДЕЛ используются формирователем импульсов для отработки особых случаев задания экстремальных значений в некоторых режимах работы (см. “Режимы работы 16-разр. таймеров-счетчиков”). У канала сравнения А имеется своя отличительная особенность, которая позволяет задать верхний предел счета (т.е. разрешающую способность счетчика). В дополнение к разрешающей способности верхний предел определяет период формируемых импульсов. На рисунке 49 показана функциональная схема блока сравнения. Символ “n” в наименованиях бит и регистров заменяет номер таймера (1 и 3), а “x” заменяет наименование канала сравнения (A/B/C). Те блоки на функциональной схеме, которые не относятся к блоку сравнения, залиты серым цветом.
Рисунок 49 – Функциональная схема блока сравнения
Если задан любой из 12 режимов широтно-импульсной модуляции (ШИМ), то в этом случае регистр OCRnx содержит двойную буферизацию. Если таймер работает в нормальном режиме или режиме сброса при совпадении (CTC), то двойная буферизация отключается. Двойная буферизация синхронизирует обновление регистра порога сравнения OCRnx по достижении верхнего или нижнего предела счета в зависимости от выбранного режима работы (алгоритма счета). Такая синхронизация предотвращает возможность возникновения несимметричных ШИМ-импульсов нечетной длины, тем самым гарантируя отсутствие сбоев при генерации прямоугольных импульсов.
Доступ к регистру OCRnx хоть и кажется сложным, но выполнен таким образом не случайно. Если двойная буферизация разрешена, то ЦПУ фактически осуществляет доступ к буферному регистру OCRnx. Если же двойная буферизация отключена, то ЦПУ обращается к регистру OCRnx непосредственно. Содержимое регистра OCR1x (в т.ч. и буферного) может измениться только путем непосредственной записи в него (таймер-счетчик не обновляет содержимое данного регистра автоматически аналогично регистрам TCNTn и ICRn). Таким образом, OCRnx считывается напрямую, а не через временный регистр старшего байта. Запись регистров OCRnx происходит через временный регистр, т.к. все 16 разр. участвуют в сравнении непрерывно. Первым необходимо записать старший байт OCRnxH. Если выполняется запись по адресу старшего байта, то содержимое временного регистра обновляется записываемым значением. Если выполняется запись младшего байта (OCRnxL), то параллельно копируется содержимое временного регистра в старшие 8-разрядов буферного регистра OCRnx или регистра порога сравнения OCRnx, тем самым обновляя все 16 разрядов за один такт ЦПУ (см. также "Доступ к 16-разр. регистрам").
Принудительная установка результата сравнения
В режимах генерации импульсов без ШИМ в формирователе импульсов результат сравнения может быть установлен непосредственно через бит принудительной установки результата сравнения FOCnx. Принудительная установка результата сравнения не приводит к установке флага OCFnx или сбросу/перезагрузке таймера, но влияет на состояние вывода OCnx, который будет устанавливаться, сбрасываться или переключаться (инвертироваться) в зависимости от выбранной установки бит COMnx.
Результат сравнения блокируется записью в TCNTn
Если ЦПУ осуществляет запись в регистр TCNTn, то результат сравнения будет игнорироваться на следующем такте синхронизации таймера, даже если таймер остановлен. Данная функция позволяет установить в регистре OCRnx то же значение, что и в TCNTn без генерации запроса на прерывание, если разрешено тактирование таймера-счетчика.
Использование блока сравнения
Поскольку запись в TCNTn в любом из режимов работы блокирует отработку совпадения на один такт синхронизации таймера, то имеются некоторые опасные ситуации при изменении TCNTn во время использования любого из каналов сравнения, независимо работает таймер-счетчик или нет. Если в TCNTn записано значение равное OCRnx, то возникающее совпадение игнорируется, тем самым вызывая некорректную генерацию импульсов. Следует избегать записи в TCNTn значения равного верхнему пределу в ШИМ-режимах с переменным значением верхнего предела. В этом случае совпадение по достижении верхнего предела игнорируется и счет продолжится до 0xFFFF. Аналогично, следует избегать записи в TCNTn значения равного нижнему пределу, если счетчик работает как вычитающий (обратный счет). Прежде чем настроить вывод OCnx на вывод в регистре направления данных необходимо выполнить инициализацию регистра OCnx. Самым простым способом решения этой задачи является использование бита принудительной установки результата сравнения (FOCnx) при работе таймера в нормальном режиме. Регистр OCnx сохраняет свое состояние даже при изменении режима работы таймера.
Учтите, что биты COMnx1:0 не содержат схемы двойной буферизации и любые их изменения вступают в силу мгновенно.
|