Разрядные таймеры-счетчики
16-разрядные таймеры-счетчики предназначены для точного задания временных интервалов, генерации прямоугольных импульсов и измерения временных характеристик импульсных сигналов.
Основные отличительные особенности:
- 16-разрядные счетчики (в т.ч. возможность организации 16-разрядного ШИМ).
- Три раздельных блока сравнения.
- Двойная буферизация регистров порога сравнения (OCR).
- Один блок захвата.
- Подавитель шума на входе блока захвата.
- Режим сброса таймера при совпадении с порогом сравнения (автоматическая перезагрузка).
- Широтно-импульсная модуляция без генерации ложных импульсов при записи нового порога сравнения в OCR (двойная буферизация) и фазовая коррекция (ФК).
- Переменный период ШИМ.
- Частотный генератор.
- Счетчик внешних событий.
- 10 самостоятельных источников прерываний (TOV1, OCF1A, OCF1B, OCF1C, ICF1, TOV3, OCF3A, OCF3B, OCF3C и ICF3).
В виду идентичности таймеров 1 и 3 в данном разделе используется общая форма записи. Так индекс “n” заменяет номер таймера-счетчика (1 или 3), а “x” заменяет наименование канала сравнения (A,B или C). Однако при программировании необходимо использовать фактические номера и наименования. Например, для записи нового состояния таймера-счетчика 1 в программе необходимо указывать TCNT1.
Регистры таймера-счетчика. Регистр таймера-счетчика (TCNTn, где n=1или 3), регистры порогов сравнения (OCRnA/B/C), a также регистр захвата (ICRn) являются 16-разрядными регистрами. В связи с этим, во время доступа к этим регистрам должна быть соблюдена специальная процедура Регистры управления таймером (TCCRnA/B/C) являются 8-разрядными регистрами, поэтому, доступ к ним со стороны CPU не связан с какими-либо ограничениями. Все сигналы запросов на прерывание представлены в регистре флагов прерываний таймеров (TIFR) и регистре флагов расширенных прерываний (ETIFR). Все прерывания индивидуально маскируются регистром макси прерываний таймеров (TIMSK) и регистром маски расширенных прерываний (ETIMSK).
Таймер-счетчик может тактироваться внутренне через предделитель или внешне тактовым источником, подключенным к выводу Tn. Блок выбора тактового источника позволяет выбрать тактовый источник и фронт, по которому будет изменяться состояние таймера-счетчика. Если тактовый источник не задан, то таймер-счетчик находится в неактивном состоянии. Сигнал на выходе блока выбора тактового источника является тактовым сигналом таймера (clkTn).
Значение регистров порогов сравнения (OCRnA/B/C) непрерывно сравнивается со значением счетчика. Результат сравнения может использоваться для генерации прямоугольных импульсов с ШИМ или с переменной частотой на выходах OCnA/B/C. В случае определения совпадения значений сравниваемых регистров устанавливается соответствующий флаг прерываний (OCFnA/B/C), который в свою очередь может служить источником прерывания.
Регистр захвата позволяет запомнить состояние таймера-счетчика при возникновении заданного внешнего события (фронт внешнего сигнала) на входе захвата фронта ICPn или на выводах аналогового компаратора. На входе захвата фронта предусмотрена схема цифровой фильтрации (подавитель шума) для снижения риска срабатывания схемы захвата от помехи. Верхний предел или максимальное значение таймера-счетчика в зависимости от режима работы таймера могут определяться значением в OCRnA, ICRn или иметь фиксированные значения. Если OCRnA задает верхний предел счета в режиме ШИМ, то он не может использоваться для генерации ШИМ-сигналов. Однако верхний предел в этом случае имеет двойную буферизацию, тем самым, допуская изменение его значения в произвольный момент времени. Если верхний предел счета является постоянным значением, то альтернативно можно использовать регистр ICRn, освобождая регистр OCRnA для функции широтно-импульсной модуляции.
Совместимость. По сравнению с предыдущими версиями 16-разрядных таймеров-счетчиков данные таймеры доработаны и улучшены. Совместимость этих таймеров соблюдается по следующим позициям:
· Адреса всех регистров, связанных с 16-разрядным таймером-счетчиком, в т.ч. регистры прерываний таймеров.
· Расположение бит внутри всех регистров 16-разрядных таймеров, в т.ч. регистры прерываний таймеров.
· Векторы прерываний.
У следующих управляющих бит изменены наименования, но сохранено назначение и расположение в регистре:
· PWMn0 заменен на WGMn0.
· PWMn1 заменен на WGMn1.
· CTCn заменен на WGMn2.
Ниже приведены регистры, которые были добавлены к 16-разрядному таймеру-счетчику:
· Регистр управления таймером-счетчиком С (TCCRnC).
· Регистр С порога сравнения, OCRnCH и OCRnCL (или OCRnC).
Следующие биты добавлены в регистры управления 16- разрядным таймером-счетчиком:
· COM1C1, COM1C0 добавлены в TCCR1A.
· FOCnA, FOCnB и FOCnC добавлены в новый регистр TCCRnC.
· WGMn3 добавлен в TCCRnB.
· Добавлены флаг прерываний и биты маски прерываний для канала сравнения С. Некоторые усовершенствования в ряде случаев затрагивают вопрос совместимости.
Доступ к 16-разрядным регистрам. Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разрядную шину данных AVR CPU может быть осуществлен с помощью двух инструкций чтения или записи. У каждого 16- разрядного таймера имеется свой 8-разрядный регистр для временного хранения старшего байта данных. Поэтому, во время доступа к 16- разрядным регистрам одного таймера используется один и тот же временный регистр. Чтение/запись младшего байта инициирует 16-разрядную операцию чтения/записи. Если выполняется запись младшего байта 16- разрядного регистра, то за один такт CPU одновременно записываются и младший байт, и старший байт из временного регистра. Если выполняется чтение младшего байта 16- разрядного регистра, то за один такт CPU параллельно с чтением младшего байта происходит копирование старшего байта 16- разрядного регистра во временный регистр.
Не все 16-разрядные регистры используют временный регистр для копирования старшего байта. Чтение 16-разрядных регистров OCRnA/B/C не связано с использованием временного регистра.
Таким образом, чтобы записать данные в 16-разрядный регистр, необходимо сначала записать старший байт, а затем младший. А при чтении 16- разрядного регистра, наоборот, сначала считывается младший байт, а затем старший.
Ниже приведен пример на Ассемблере, показывающий как осуществлять доступ к 16-разрядным регистрам таймера. В примере предполагается, что во время обновления временного регистра не возникает прерываний. Аналогично может быть выполнен доступ к регистрам OCRnA/B/C и ICRn.
Пример кода на Ассемблере; Установка TCNTn = 0x01FFldi r17,0x01ldi r16,0xFFout TCNTnH,r17out TCNTnL,r16; Чтение TCNTn в r17:r16in r16,TCNTnLin r17,TCNTnH...Примечание. При разработке примеров предполагалось, что подключен файл специфических заголовков. Если адресуемый регистр ввода-вывода расположен в расширенной памяти ввода-вывода, то инструкции “IN”, “OUT”, “SBIS”, “SBIC”, “CBI” и “SBI” необходимо заменить на инструкции доступа к расширенной памяти ввода-вывода “LDS” и “STS” совместно с инструкциями “SBRS”, “SBRC”, “SBR”, и “CBR”.
В примере на Ассемблере значение TCNTn возвращается парой регистров r17:r16. При этом следует обратить внимание на проблему, которая связана с необходимостью выполнения двух инструкций для получения доступа к 16-разрядному регистру. Если после выполнения первой инструкции доступа 16-разрядного регистра происходит прерывание и в процедуре обработки прерывания также происходит обновление этого же или другого регистра, но относящегося к тому же таймеру, то по завершении обработки прерывания изменяется содержимое временного регистра и выполнение второй инструкции приведет к некорректному результату. Таким образом, когда и в основной программе и в прерываниях происходит обновление временного регистра, то в основной программе перед инициацией доступа к 16-разрядному регистру необходимо запретить прерывания.
В следующем примере показано как корректно выполнить чтение регистра TCNTn без опасности изменения содержимого временного регистра в прерываниях. Аналогично данный пример следует распространять на доступ к регистрам OCRnA/B/C и ICRn.
Пример кода на Ассемблере TIM16_ReadTCNTn:; Запомнили состояние общего флага прерываний in r18,SREG; Запрет прерыванийcli; Чтение TCNTn в r17:r16in r16,TCNTnLin r17,TCNTnHout SREG,r18 ; Восстановили состояние общего ;флага прерываний retВ коде на Ассемблере значение регистра TCNTn возвращается парой регистров r17:r16. В следующем примере показано как избежать опасного влияния изменения содержимого временного регистра при возникновении прерывания во время записи в регистр TCNTn. На этом же принципе может быть выполнена запись в регистры OCRnA/B/C или ICRn.
Пример кода на АссемблереTIM16_WriteTCNTn:; Запомнили состояние общего флага прерываний in r18,SREG; Запрет прерыванийcli; Копирование TCNTn в r17:r16out TCNTnH,r17out TCNTnL,r16; Восстановили состояние общего флага прерываний out SREG,r18retВ примере на Ассемблере предполагается, что записываемое значение в TCNTn предварительно записано в пару регистров r17:r16.
Тактовые источники таймера-счетчика. Таймер-счетчик может использовать как внешний, так и внутренний тактовые сигналы. Источник тактового сигнала выбирается соответствующей схемой микроконтроллера под управлением бит выбора синхронизации (CSn2:0), которые находятся в регистре В управления таймером-счетчиком (TCCRnB).
Блок счетчика. Основным элементом 16-разрного таймера-счетчика является программируемый реверсивный 16-разрядный счетчик. На рисунке 2.23 представлена функциональная схема счетчика и окружающих его элементов.
Описание внутренних сигналов (рис. 2.23):
Счет – Инкрементирует или декрементирует состояние TCNTn на 1.
Направление – Задает прямой счет (инкрементирование) или обратный счет (декрементирование).
Сброс – Сброс TCNTn.
clkTn – Синхронизация таймера-счетчика.
Верхний предел – Сигнализирует о достижении TCNTn максимального значения.
Нижний предел – Сигнализирует о достижении TCNTn минимального значения (нуля).
Содержимое 16-разрядного счетчика разбито на две 8-разрядные ячейки, расположенных в памяти ввода-вывода: старший байт счетчика (TCNTnH), в котором хранятся старшие 8-разрядов счетчика, и младший байт счетчика (TCNTnL), в котором хранятся младшие 8-разрядов. CPU не имеет непосредственного доступа к регистру TCNTnH. Если CPU выполняет доступ к TCNTnH, то фактически обращение происходит к временному регистру. Во временный регистр копируется значение TCNTnH, если выполняется чтение регистра TCNTnL и в TCNTnH копируется содержимое временного регистра, если выполняется запись в TCNTnL. Такой механизм реализован для считывания/записи 16-разрядного значения счетчика за один такт CPU в условиях 8-разрядной шины данных. Следует обратить внимание, что в некоторых случаях запись в регистр TCNTn во время счета счетчиком будет давать непредсказуемый результат.
В зависимости от используемого режима работы каждый такт синхронизации таймера clkTn счетчик будет сбрасываться, инкрементироваться или декрементироваться. Сигнал clkTn может быть внешним или внутренним, что задается битами выбора синхронизации (CSn2:0). Если тактовый источник не задан (CSn2:0 = 0), то таймер останавливается. Однако содержимое TCNTn остается доступным CPU независимо от наличия синхронизации на clkTn. Если CPU выполняет запись в TCNTn, то тем самым блокируется (запись имеет более высокий приоритет) любое действие счетчика: сброс или счет.
Алгоритм счета определяется значением битов режима работы таймера (WGMn3:0), расположенных в регистрах А и В управления таймером-счетчиком (TCCRnA и TCCRnB). Имеется четкая связь между алгоритмом счета счетчика и формой генерируемого на выходе OCnx сигнала.
Установка флага переполнения таймера-счетчика (TOVn) происходит в зависимости от выбранного с помощью битов WGMn3:0 режима работы. Флаг TOVn может использоваться для генерации прерывания CPU.
Блок захвата. Таймер-счетчик содержит блок захвата, который запоминает состояние счетчика при возникновении внешнего события, тем самым, определяя время его возникновения. В качестве события/событий выступает внешний сигнал, подключенный к выводу ICPn. Для таймера-счетчика 1 альтернативно может использоваться аналоговый компаратор в качестве источника внешнего события[4]. Результат захвата состояния таймера может использоваться для вычисления частоты, скважности импульсов и других параметров импульсных сигналов. Альтернативно это значение может использоваться для создания журнала событий.
Символ “n” в наименованиях битов и регистров заменяет номер таймера-счетчика.
Если на входе захвата (ICPn) или альтернативно на выходе аналогового компаратора (ACO) возникает изменение логического уровня (событие), которое соответствует установкам детектора фронта, то выполняется захват состояния таймера. При этом 16-разрядное значение содержимого таймера (TCNTn) помещается в регистр захвата (ICRn). Флаг захвата (ICFn) устанавливается на том же такте CPU, на котором произошло копирование значения TCNTn в ICRn. Установка бита TICIEn =1 разрешает прерывание по установке флага захвата. Флаг ICFn автоматически сбрасывается при переходе на вектор прерывания. Альтернативно флаг ICFn сбрасывается программно, если записать в него 1. Считывание 16-разрядного значения регистра захвата (ICRn) выполняется чтением сначала младшего байта (ICRnL), а затем старшего байта (ICRnH). При выполнении команды чтения младшего байта значение старшего байта автоматически копируется во временный регистр. Если CPU выполняет команду чтения регистра ICRnH, то фактически считывается содержимое временного регистра. Запись в регистр ICRn возможна только в том случае, если битами задания режима работы таймера выбран режим, в котором значение регистра ICRn задает верхний предел счета. В этом случае необходимо выполнить соответствующую установку битов режима работы (WGMn3:0), а только затем выполнить запись значения верхнего предела в регистр ICRn. Запись 16-разрядного значения в регистр ICRn выполняется путем записи сначала старшего байта в ICRnH, а только затем младшего байта в ICRnL .
Источник срабатывания механизма захвата. Основным источником, инициирующим захват состояния таймер-счетчика, является вывод захвата (ICPn). Таймер-счетчик 1 также альтернативно может использовать выход аналогового компаратора в качестве источника инициации захвата. Для этого необходимо установить бит разрешения захвата аналоговым компаратором (ACIC) в регистре состояния и управления аналогового компаратора (ACSR). Учтите, что изменение источника инициации захвата может привести к возникновению захвата. Поэтому, после изменения источника должен быть сброшен флаг захвата.
Захват можно инициировать программно путем управления настройками порта на выводе ICPn.
Режимы работы. Под режимом работы 16-разрядного таймера понимается его алгоритм счета и поведение связанного с ним выхода формирователя импульсов, что определяется комбинацией бит, задающих режим работы таймера (WGMn3-0) и режим формирования выходного сигнала (COMnx1:0). При этом биты задания режима формирования выходного сигнала не влияют на алгоритм счета, т.к. алгоритм счета зависит только от состояния бит задания режима работы таймера. В режимах с ШИМ биты COMnx1:0 позволяют включить/отключить инверсию на генерируемом ШИМ-выходе (т.е. выбрать ШИМ с инверсией или ШИМ без инверсии). Для режимов без ШИМ биты COMnx1:0 определяют, какое действие необходимо выполнить при возникновении совпадения: сбросить, установить или инвертировать выход
Нормальный режим работы (см. табл. 2.41). Самым простым режимом работы является нормальный режим (WGMn3-0=0b0000). В данном режиме счетчик работает как суммирующий (инкрементирующий), при этом сброс счетчика не выполняется. Переполнение счетчика происходит при переходе через максимальное 16-разрядное значение (0xFFFF) к нижнему пределу счета (0x0000). В нормальном режиме работы флаг переполнения таймера-счетчика TOVn будет установлен на том же такте синхронизации, когда TCNTn примет нулевое значение.
Таблица 2.41. Режимы работы таймера-счетчика
Режим | WGMn3 | WGMn2 (CTCn) | WGMn1 (PWMn1) | WGMn0 (PWMn0) | Режим работы таймера-счетчика | Верхний предел | Обновление OCRnx | Установка флага TOVn на: |
Нормальный | 0xFFFF | сразу после записи | МАКС | |||||
8-разрядный ШИМ ФК | 0x00FF | на вершине счета | нижнем пределе | |||||
9- разрядный ШИМ ФК | 0x01FF | на вершине счета | нижнем пределе | |||||
10- разрядный ШИМ ФК | 0x03FF | на вершине счета | нижнем пределе | |||||
CTC (сброс OCxx при совпадении) | OCRnA | сразу после записи | МАКС | |||||
8- разрядный быстрая ШИМ | 0x00FF | на вершине счета | на вершине счета | |||||
9- разрядный быстрая ШИМ | 0x01FF | на вершине счета | на вершине счета | |||||
10- разрядный быстрая ШИМ | 0x03FF | на вершине счета | на вершине счета | |||||
ШИМ ФЧК | ICRn | на нижнем пределе | нижнем пределе | |||||
ШИМ ФЧК | OCRnA | на нижнем пределе | нижнем пределе | |||||
ШИМ ФК | ICRn | на вершине счета | нижнем пределе | |||||
ШИМ ФК | OCRnA | на вершине счета | нижнем пределе | |||||
ICRn | сразу после записи | МАКС. | ||||||
(резерв) | – | - | - | |||||
Быстрая ШИМ | ICRn | на вершине счета | на вершине счета | |||||
Быстрая ШИМ | OCRnA | на вершине счета | на вершине счета |
Фактически, флаг переполнения TOVn является 17-ым битом таймера-счетчика за тем исключением, что он только устанавливается и не сбрасывается. Однако программно это свойство может быть использовано для повышения разрешающей способности таймера, если использовать прерывание по переполнению таймера, при возникновении которого флаг TOVn сбрасывается автоматически. Для нормального режима работы не существует каких-либо особых ситуаций, поэтому запись нового состояния счетчика может быть выполнена в любой момент.
В нормальном режиме можно использовать блок захвата. Однако при этом следует соблюдать, чтобы максимальный интервал времени между возникновениями внешних событий не превысил периода переполнения счетчика. Если такое условие не соблюдается, необходимо использовать прерывание по переполнению таймера-счетчика или предделитель.
Блок сравнения может использоваться для генерации прерываний. Не рекомендуется использовать выход OCnx для генерации сигналов в нормальном режиме работы, т.к. в этом случае будет затрачена значительная часть процессорного времени.