Таймеры-счетчики ATmega2560 Печать
Добавил(а) microsin   

В составе ATmega2560 имеется 6 аппаратных таймеров-счетчиков. Из них два 8-битные, остальные 16-битные. Таймеры связаны со многими функциональными возможностями кристалла. В таблице ниже приведена общая информация по таймерам и их функциям.

Имя Бит Асинхр Предделитель PWM Захват Прерывания Регистры Порты
Timer/Counter0 8   Есть Да   TOV0, OCF0A, OCF0B TCCR0A, TCCR0B, TCNT0, OCR0A, OCR0B, TIMSK0, TIFR0 PG5, PB7, PD7
Timer/Counter1 16   Есть Да Да TOV1, OCF1A, OCF1B, OCF1C, ICF1 TCCR1A, TCCR1B, TCCR1C, TCNT1H, TCNT1L, OCR1AH, OCR1AL, OCR1BH, OCR1BL, OCR1CH, OCR1CL, ICR1H, ICR1L, TIMSK1, TIFR1 PB5, PB6, PD4, PD6, PB7
Timer/Counter2 8 Да Есть Да   TOV2, OCF2A, OCF2B TCCR2A, TCCR2B, TCNT2, OCR2A, OCR2B, ASSR, TIMSK2, TIFR2, GTCCR PH6, PB4, PG3, PG4
Timer/Counter3 16   Есть Да Да TOV3, OCF3A, OCF3B, OCF3C, ICF3 TCCR3A, TCCR3B, TCCR3C, TCNT3H, TCNT3L, OCR3AH, OCR3AL, OCR3BH, OCR3BL, OCR3CH, OCR3CL, ICR3H, ICR3L, TIMSK3, TIFR3 PE3, PE4, PE5, PE6, PE7
Timer/Counter4 16   Есть Да Да TOV4, OCF4A, OCF4B, OCF4C, ICF4 TCCR4A, TCCR4B, TCCR4C, TCNT4H, TCNT4L, OCR4AH, OCR4AL, OCR4BH, OCR4BL, OCR4CH, OCR4CL, ICR4H, ICR4L, TIMSK4, TIFR3 PH3, PH4, PH5, PH7, PL0
Timer/Counter5 16   Есть Да Да TOV5, OCF5A, OCF5B, OCF5C, ICF5 TCCR5A, TCCR5B, TCCR5C, TCNT5H, TCNT5L, OCR5AH, OCR5AL, OCR5BH, OCR5BL, OCR5CH, OCR5CL, ICR5H, ICR5L, TIMSK5, TIFR5 PL1, PL2, PL3, PL4, PL5

Примечание: PWM расшифровывается как Pulse Width Modulation, это английская аббревиатура для ШИМ (Широтно-Импульсная Модуляция).

Вот краткое описание того, что могут таймеры/счетчики:

• Освобождают процессор микроконтроллера от лишней работы по генерированию ШИМ и сигнала заданной частоты, измерению длительностей сигналов. Это упрощает синтез сигналов произвольной частоты и формы (звуков, например), генерацию тактовых импульсов.
• Позволяют точно отсчитывать реальное время, измерять частоту и длительность импульсов.
• Позволяют подсчитывать внешние события (количество пришедших импульсов).
• Сигналы ШИМ можно сформировать на строго определенных ножках корпуса микроконтроллера.

Например, если тактовая частота, на которой работает микроконтроллер ATmega2560, равна 16 МГц, то Вы можете аппаратно получить следующие сигналы:

• ШИМ с несущей частотой от 0.1 Гц до 62.5 кГц.
• Сигнал прямоугольной формы (скважность 50%) частотой от 0.1 Гц до 8 МГц, импульсы с частотой от 0.2 Гц до 16 МГц. Частоту можно регулировать, причем плавной регулировка будет только в области низких частот.
• К Timer/Counter2 есть возможность подключить внешний часовой кварц и организовать точный подсчет секунд, минут, и т. д. (получить часы, RTC).
• Всего имеется 6 каналов для формирования ШИМ и частот, каналы работают независимо друг от друга.

[Timer/Counter0: 8-битный таймер/счетчик]

Основные возможности таймера:

• Два независимых узла для проверки совпадения счетчика с заданной величиной, которые могут выдавать изменение выходного уровня - Output Compare Units (применяется для ШИМ, PWM).
• Выходные регистры сравнения (Output Compare Registers) с двойной буферизацией.
• Очистка таймера при событии совпадения (Compare Match), т. е. автоматическая перезагрузка таймера (Auto Reload).
• Широтно-импульсный модулятор с точным, без скачков, изменением фазы выходных импульсов - Phase Correct Pulse Width Modulator (PWM).
• Регулируемый период ШИМ.
• Функция генератора частоты.
• 3 независимых источника прерывания (TOV0, OCF0A и OCF0B).

Timer0 в программе обычно применяют для формирования точных и коротких интервалов времени (управление событиями), генерации сигналов. Упрощенная диаграмма таймера показана на рис. 16-1.

ATmega2560 TC0 8bit Block Diagram fig16 1

Рис. 16-1. Блок-диаграмма внутреннего устройства Timer/Counter0.

Ниже показана привязка ножек микроконтроллера к таймеру.

ATmega2560 TC0 pins

Таймер/счетчик состоит из регистра счета TCNT0 и выходных регистров сравнения (Output Compare Registers, OCR0A и OCR0B). Сигналы запросов на прерывание доступны в регистре TIFR0 (Timer Interrupt Flag Register). Все прерывания могут быть индивидуально маскированы (т. е. разрешены) битами регистра TIMSK0 (Timer Interrupt Mask Register). На рис. 16-1 регистры TIFR0 и TIMSK0 не показаны.

Таймер/счетчик может тактироваться от внутренней тактовой частоты, которая может опционально делиться прескалером, либо от внешнего тактового сигнала, поданного на ножку T0. Блок логики управления определяет источник тактового сигнала и тактовый перепад, которые использует таймер/счетчик для счета (инкремента или декремента своего значения с каждым таковым импульсом). Таймер/счетчик не активен, когда не выбран источник тактового сигнала. На рис. 16-1 выходной сигнал логики выбора тактов, который тактирует счетчик, показан как clkT0. Источник тактового сигнала выбирается полем бит CS02:0 регистра TCCR0B (Timer/Counter Control Register).

Регистры сравнения с двойной буферизацией OCR0A и OCR0B постоянно сравниваются с значением таймера счетчика TCNT0. Результат сравнения может использоваться для генерирования на выводах OC0A и OC0B сигнала ШИМ или изменяемой частоты. Также при возникновении события сравнения устанавливаются флаги OCF0A или OCF0B, которые могут использоваться для генерации запроса на прерывание Output Compare.

Блок счета. Это основной программируемый узел Timer/Counter0, который может считать в прямом (инкремент) и обратном (декремент) направлениях.

ATmega2560 TC0 Counter Unit Block Diagram fig16 2

Рис. 16-2. Диаграмма внутреннего устройства блока счета.

Пояснения к сигналам на диаграмме: Count - сигнал, импульсы которого считает счетчик (с каждым тактовым перепадом значение регистра счетчика TCNT0 увеличивается или уменьшается, в зависимости от выбранного направления счета). Direction - выбор направления счета. Clear - сигнал сброса в 0 содержимого TCNT0 (все биты этого регистра становятся равными 0). clkT0 - тактовый сигнал, который поступает с блока выбора тактов. TOP - сигнализирует, что счетчик достиг максимального значения. BOTTOM - сигнализирует, что счетчик достиг минимального значения.

BOTTOM. Это нижнее (минимальное) значение счетчика, 0x00 для 8-разрядных таймеров.

MAX. Это максимальное значение счетчика, 0xFF для 8-разрядных таймеров (десятичное число 255).

TOP. Это установленное предельное верхнее значение для счетчика. Оно может быть установлено равным MAX, либо установлено значением специального регистра (к примеру, для Timer0 это регистр OCR0A). Назначение зависит от режима работы счетчика.

В зависимости от выбранного режима работы счетчик очищается, инкрементируется или декрементируется по каждому тактовому перепаду clkT0. Сигнал clkT0 может быть сгенерирован из внешнего или внутреннего источника тактов, в зависимости от значения бит CS02:0. Когда не выбран ни один из источников тактирования (CS02:0 == 0), то таймер остановлен. Однако к значению TCNT0 есть доступ со стороны CPU, независимо от того, генерируется clkT0, или нет. Операция записи со стороны CPU имеет приоритет перед всеми другими операциями над содержимым счетчика (очистка или счет могут быть отменены операцией записи).

Последовательность счета задается битами WGM01 и WGM00, расположенными в регистре TCCR0A (Timer/Counter Control Register), и WGM02, расположенным в регистре TCCR0B (WGM02:0). Имеется прямая зависимость между тем, как считает счетчик, и тем, как будет формироваться сигнал на выходах OC0A и OC0B.

Флаг переполнения счетчика TOV0 (Timer/Counter Overflow Flag) устанавливается в зависимости от режима работы, выбранного битами WGM02:0. Установка флага TOV0 может использоваться для генерации прерывания.

Блок сравнения. Это 8-разрядный компаратор (Output Compare Unit), который постоянно сравнивает содержимое TCNT0 с содержимым регистров OCR0A и OCR0B. Всякий раз, когда TCNT0 равен OCR0A или OCR0B, компаратор сигнализирует о совпадении. Событие совпадения установит флаг OCF0A или OCF0B (Output Compare Flag) в следующем тактовом цикле. Если разрешено соответствующее прерывание, то Output Compare Flag генерирует прерывание Output Compare. Output Compare Flag автоматически очищается, когда запускается обработчик прерывания. Альтернативно флаг может быть очищен программно путем записи лог. 1 в место размещения бита. Генератор сигналов (Waveform Generator) использует сигнал совпадения для генерации выхода в соответствии с режимом, установленным битами WGM02:0 (Waveform Generation mode) и COM0x1:0 (Compare Output mode, здесь x соответствует A или B). Сигналы MAX и BOTTOM используются генератором сигналов для обработки специальных ситуаций в некоторых режимах.

ATmega2560 TC0 Output Compare Unit Block Diagram fig16 3

Рис. 16-3. Блок-схема Output Compare Unit.

Регистры OCR0A и OCR0B имеют двойная буферизация, когда они работают в режимах PWM (Pulse Width Modulation, Широтно-Импульсная Модуляция, ШИМ). Для обычного режима (Normal mode) и режима очистки при сравнении (Clear Timer on Compare, CTC) двойная буферизация запрещена. Двойная буферизация синхронизирует обновление регистров сравнения OCR0A и OCR0B в моменты достижения верхней или нижней границ счета. Синхронизация защищает от появления импульсов ШИМ нечетной длины (с асимметрией), таким образом выходной сигнал ШИМ получается чистый, без провалов и сбоев.

Может показаться, что доступ к регистрам OCR0x сложен, но это не так. Двойная буферизация работает прозрачно - и когда оно разрешено, и когда отключено. Когда буферизация работает, то ядро CPU получает доступ к OCR0x через аппаратный буфер, а когда отключено, то напрямую.

Force Output Compare. В не-PWM режимах событие совпадения может быть сгенерировано принудительно путем записи лог. 1 в бит FOC0x (Force Output Compare). Принудительно сгенерированное событие не установит флаг OC0x, не будут произведены сброс/перезагрузка счетчика, однако выходное состояние ножки порта OC0x обновится, как если бы произошло реальное событие Compare Match (обновление произойдет в соответствии с настройками бит COM0x1:0, независимо от того, установлен ли лог. уровень выхода OC0x, сброшен или переключен в противоположное состояние).

Блокировка события сравнения записью в TCNT0. Все операции записи регистра TCNT0 со стороны ядра CPU заблокируют любое событие Compare Match, которое возникло бы в следующем такте таймера, даже когда таймер остановлен. Эта возможность позволяет инициализировать OCR0x тем же самым значением, как и TCNT0, без срабатывания прерывания, когда тактирование таймера/счетчика разрешено.

Использование блока сравнения. Поскольку запись TCNT0 в любом режиме запретит все события совпадения Compare Match на 1 такт таймера, есть риск при изменении TCNT0 при использовании блока сравнения, независимо от того, работает таймер/счетчик или нет. Если записываемое в TCNT0 значение равно OCR0x, то событие Compare Match будет потеряно, в результате чего может быть неправильно сгенерирован выходной сигнал. Наподобие не записывайте в TCNT0 значение, равное BOTTOM, когда счетчик считает вниз.

Настройка OC0x должна быть выполнена перед установкой регистра направления работы порта (Data Direction Register, DDR), чтобы ножка порта работала как выход. Самый простой путь установки состояния порта OC0x - использовать биты стробирования Force Output Compare (FOC0x) в нормальном (Normal) режиме работы таймера/счетчика. Регистры OC0x сохраняют свои значения даже когда изменяются режимы работы генератора сигналов.

Имейте в виду, что биты COM0x1:0 не имеют двойной буферизации, как это сделано для величин сравнения. Поэтому изменения битов COM0x1:0 приводят к немедленному результату.

Блок выходного сигнала сравнения (Compare Match Output Unit). Биты управления режимом выхода сравнения (Compare Output mode, COM0x1:0) имеют 2 функции. Генератор сигналов использует COM0x1:0 для определения состояния выхода OC0x при следующем событии Compare Match. Также COM0x1:0 управляют источником выхода для выводов OC0x. На рис. 16-4 показана упрощенная схема логики, на которую влияет управление установкой бит COM0x1:0. Регистры I/O, биты I/O и выводы I/O показаны на картинке жирным шрифтом. Показаны только те регистры портов GPIO (DDR и PORT), на которые влияют биты COM0x1:0. Когда ссылаются на состояние OC0x, то нужно смотреть на внутренний регистр OC0x, не вывод OC0x. Если произошел системный сброс, регистр OC0x сбрасывается в 0.

ATmega2560 TC0 Compare Match Output fig16 4

Рис. 16-4. Схема вывода блока сравнения (Compare Match Output Unit).

Обычные функции порта ввода/вывода GPIO переназначаются Output Compare (OC0x) из генератора сигналов, если установлен любой из битов COM0x1:0. Однако направление работы порта вывода OC0x (т. е. вход это или выход) все еще зависит от регистра DDR для нужной ножки порта. Таким образом, соответствующий бит регистра DDR для нужного вывода OC0x (DDR_OC0x) должен быть установлен до того, как значение OC0x будет видимо на этом порте. Функция переназначения порта не зависит от режима работы генератора сигналов.

Дизайн логики Output Compare позволяет инициализировать состояние OC0x до разрешения работы выхода. Имейте в виду, что некоторые комбинации бит COM0x1:0 зарезервированы для определенных режимов работы.

Режимы сравнения и генерация сигналов. Генератор сигналов (Waveform Generator) по-разному использует биты COM0x1:0 для режимов Normal, CTC и PWM. Для всех режимов COM0x1:0 = 0 говорит для Waveform Generator, что при следующем событии Compare Match не должно быть никаких действий с регистром OC0x. Для выходных действий в режимах не-PWM, Fast PWM, Phase Correct PWM см. соответствующие таблицы 16-2, 16-3, 16-4.

Изменение состояния битов COM0x1:0 даст эффект на первом событии Compare Match после того, как биты были записаны. Для режимов не-PWM действие может быть реализовано немедленно с использованием битов стробирования FOC0x.

Режимы работы определяют поведение выходных выводов Output Compare таймера счетчика, как это задано комбинацией настроечных бит Waveform Generation mode (WGM02:0) и Compare Output mode (COM0x1:0). Биты COM0x1:0 не влияют на последовательность счета, в то время как WGM02:0 влияют. Биты COM0x1:0 определяют, как будет генерироваться сигнал ШИМ - инвертированный или нет (inverted PWM или non-inverted PWM). В не-PWM режимах биты COM0x1:0 определяют, должен ли быть выход установлен, сброшен или переключен в противоположное состояние, когда наступило событие Compare Match.

[Нормальный режим (Normal mode)]

Это самый простой режим, когда WGM02:0 = 0. В этом режиме направление счета всегда прямое (инкремент), и не выполняется очистка счетчика. Счетчик просто переваливает за верхнюю границу счета MAX (0xFF), и снова начинает счет с нулевого значения (0x00). В нормальном режиме будет установлен флаг переполнения Timer/Counter Overflow Flag (TOV0) в том же самом такте таймера, когда TCNT0 обнуляется. Таким образом, бит TOV0 ведет себя как 9-й бит счетчика, за исключением того, что он всегда устанавливается и сам не очищается. Однако в комбинации с прерыванием переполнения таймера (timer overflow interrupt) флаг TOV0 автоматически очищается, и разрядность счетчика может быть увеличена уже программно. Новое значение счетчика может быть записано программно в TCNT0 в любой момент времени.

Output Compare Unit может использоваться для генерации прерываний в определенные моменты времени. Использование Output Compare для генерации сигналов в режиме Normal не рекомендуется, потому что будет слишком много расходоваться времени CPU.

[Режим очистки при совпадении (CTC mode)]

В режиме Clear Timer on Compare или CTC mode (WGM02:0 = 2) регистр OCR0A используется для управления разрешающей способностью счетчика. Счетчик автоматически сбрасывается в 0, когда значение счетчика TCNT0 совпадет с OCR0A. Поэтому OCR0A определяет верхний предел, до которого работает счетчик, что влияет на его разрешение. Этот режим дает большие возможности по управлению выходной частотой Compare Match. Это также упрощает алгоритм подсчета внешних событий.

Диаграмма времени CTC mode показана на рис. 16-5. Значение счетчика (TCNT0) увеличивается до тех пор, пока не произойдет событие Compare Match между TCNT0 и OCR0A, и тогда TCNT0 очищается.

ATmega2560 TC0 CTC Mode Timing Diagram fig16 5

Рис. 16-5. Диаграмма работы режима CTC.

Каждый раз, когда значение счетчика достигает значения TOP, может быть сгенерировано прерывание по флагу OCF0A. Если прерывание разрешено, то обработчик прерывания может использоваться для обновления значения TOP (регистр OCR0A). Однако изменение значения TOP так, что оно станет близким к BOTTOM, когда счетчик работает без прескалера или с малым коэффициентом деления, должно делаться с осторожностью, потому что CTC mode не имеет двойной буферизации. Если новое записанное в регистр OCR0A значение будет меньше, чем текущее значение TCNT0, то счетчик пропустит событие Compare Match, и счетчик будет считать до значения MAX (0xFF), затем перевалит в 0x00, и только после этого может возникнуть очередное событие Compare Match.

Для генерации импульсов определенной частоты в CTC mode выход OC0A может быть установлен на переключение логического уровня на каждом Compare Match путем установки бито Compare Output mode в режим переключения (toggle mode, COM0A1:0 = 1). Значение OC0A не появится на выходной ножке порта, пока регистр DDR не будет настроен соответствующим образом (чтобы нужный вывод порта работал как выход). Максимальная частота получаемых импульсов fOC0 = fclk_I/O/2, когда OCR0A установлен в 0 (0x00). Общая формула для определения выходной частоты:

                      fclk_I/O
fOC0x = --------------------------
              2 * N * (1 + OCR0x)

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Точно так же, как и в Normal mode, флаг TOV0 устанавливается в том же такте таймера, когда счетчик переваливает от MAX до 0x00.

[Быстрый ШИМ (Fast PWM Mode)]

Этот режим предоставляет возможность генерации ШИМ на высокой частоте (WGM02:0 = 3 или 7). Режим Fast PWM отличается от других режимов PWM тем, что период ШИМ формируется за один проход счетчика. Счетчик считает от BOTTOM до TOP, затем начинает считать заново от BOTTOM. TOP определен как 0xFF при WGM2:0 = 3, и как значение OCR0A при WGM2:0 = 7. В non-inverting Compare Output mode бит Output Compare (OC0x) очищается, когда происходит событие Compare Match между TCNT0 и OCR0x, и устанавливается в момент, когда счетчик равен BOTTOM. В inverting Compare Output mode наоборот, выход устанавливается при событии Compare Match, и очищается при BOTTOM. Поскольку полный цикл переключения выхода осуществляется за один проход счетчика, то рабочая частота Fast PWM может быть в 2 раза выше, чем в Phase Correct PWM mode, когда используется цикл ШИМ в 2 проходах счетчика. Высокая частота делает Fast PWM хорошо подходящим для управления источником питания, выпрямителем, и в приложениях DAC (ЦАП, цифро-аналоговый преобразователь). Высокая частота позволяет упростить схему фильтра ШИМ, использовать для фильтра внешние детали меньшего размера (это относится к дросселям и конденсаторам), что также снижает общую стоимость системы.

В Fast PWM mode счетчик инкрементируется, пока его значение не достигнет значения TOP. Затем счетчик очищается на следующем тактовом цикле таймера. Диаграмма времени для Fast PWM mode показана на рис. 16-6. Значение TCNT0 на этой диаграмме показано как гистограмма для иллюстрации работы ШИМ по одному циклу. На диаграмме показаны не-инвертируемые (non-inverted) и инвертируемые (inverted) выходы ШИМ. Маленькие горизонтальные линии помечают циклы TCNT0, представляющие события Compare Match между OCR0x и TCNT0.

ATmega2560 TC0 Fast PWM Mode Timing Diagram fig16 6

Рис. 16-6. Диаграмма работы Fast PWM mode.

Флаг переполнения Timer/Counter Overflow (TOV0) устанавливается каждый раз, когда счетчик достигает TOP. Если разрешено прерывание, для обновления величины сравнения может быть использован обработчик прерывания.

В режиме Fast PWM блок сравнения позволяет генерировать сигналы с помощью ШИМ на выводах портов OC0x. Установка битов COM0x1:0 в 2 будет производить неинверсный ШИМ, и выход инверсного ШИМ может быть сгенерирован установкой битов COM0x1:0 в значение 3. Установка битов COM0A1:0 в 1 позволяет выводу OC0A переключаться в противоположное состояние на событиях Compare Match, если установлен бит WGM02. Эта опция не доступна для вывода OC0B (см. таблицу 16-3). Действительное значение OC0x будет отображаться на выходном порте, если он настроен как выход с помощью соответствующего разряда регистра DDR. Сигнал ШИМ генерируется путем установки (или очистки) регистра OC0x при событиях Compare Match между OCR0x и TCNT0, и очистки (или установки) регистра OC0x на тактовом цикле таймера при очистке счетчика (когда его значение переходит от TOP к BOTTOM). Частота выходных импульсов ШИМ может быть вычислена по следующей формуле:

                    fclk_I/O
fOC0xPWM = -----------
                    N * 256

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCR0A представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Fast PWM. Если OCR0A установлен равным BOTTOM, то выходной сигнал будет выглядеть как короткие иголки для каждого MAX+1 цикла таймера. Установка OCR0A равным MAX приведет к постоянному выходному уровню лог. 1 или лог. 0 (в зависимости от установленной полярности выхода, которая устанавливается битами COM0A1:0).

Частота (прямоугольный сигнал со скважностью 50%, т. е. длительность 0 равна длительности 1) на выходе в Fast PWM mode может быть получена путем установки OC0x на переключение логического уровня при каждом событии Compare Match (COM0x1:0 = 1). В этом случае максимальная частота получится fOC0 = fclk_I/O/2, когда OCR0A установлен в 0. Эта функция аналогична переключению OC0A в режиме CTC, за исключением того, что в Fast PWM mode разрешена двойная буферизация узла Output Compare.

[Режим корректной фазы ШИМ (Phase Correct PWM Mode)]

Phase Correct PWM mode (WGM02:0 = 1 или 5) предоставляет для генерации сигналов высокоточный ШИМ, когда при регулировке выхода сохраняется корректность фазы. Этот режим основан на двойном проходе счетчика по одному периоду ШИМ. Счетчик постоянно считает от BOTTOM до TOP, и затем считает от TOP к BOTTOM, формируя один полный период фазы ШИМ. Граница счета TOP определена как 0xFF при WGM2:0 = 1, и как OCR0A при WGM2:0 = 5. В неинверирующем режиме (non-inverting Compare Output mode), выход (Output Compare, OC0x) очищается при совпадении (Compare Match) между TCNT0 и OCR0x во время счета вверх, и устанавливается при совпадении (Compare Match) во время счета вниз. В инверсном режиме (inverting Output Compare mode), все работает аналогично, но выходной сигнал инвертируется. Двойной проход для одного периода ШИМ имеет в 2 раза меньше выходную рабочую частоту ШИМ по сравнению с режимом, когда счетчик формирует период ШИМ за 1 проход. Однако симметрия при формировании ШИМ, когда счетчик работает в 2 прохода, позволяет осуществить точное регулирование, что желательно для приложений регулирования двигателей.

В Phase Correct PWM mode счетчик инкрементируется, пока его значение не достигнет TOP, при этом формируется первая часть периода ШИМ. Когда счетчик достиг TOP, он меняет направление счета, и начинается формирование второй части периода ШИМ. Значение TCNT0 будет равно TOP в течение одного тактового цикла таймера. Диаграмма времени работы Phase Correct PWM mode показана на рис. 16-7. Значение TCNT0 на диаграмме показано в виде гистограммы, иллюстрирующей работу счетчика за 2 прохода. На диаграмме показаны не инвертирующий и инвертирующий выходы ШИМ. Маленькие горизонтальные линии помечают циклы TCNT0, представляющие события Compare Match между OCR0x и TCNT0.

ATmega2560 TC0 Phase Correct PWM Mode Timing Diagram fig16 7

Рис. 16-7. Диаграмма работы Phase Correct PWM Mode.

Флаг переполнения Timer/Counter Overflow (TOV0) устанавливается каждый раз, когда счетчик достигает BOTTOM. Флаг прерывания может использоваться для генерации прерывания каждый раз, когда счетчик достигает значения BOTTOM. Сравните с Fast PWM mode: там флаг TOV0 устанавливается, когда счетчик достигает значения TOP.

В Phase Correct PWM mode узел сравнения позволяет генерировать сигналы с помощью ШИМ на выводах OC0x. Установка COM0x1:0 в значение 2 даст неинверсный ШИМ (non-inverted PWM). Инверсный ШИМ генерируется установкой COM0x1:0 в значение 3. Если установить бит COM0A0 в 1, то это даст переключение OC0A в противоположный уровень при каждом событии Compare Match, если установлен бит WGM02. Эта опция не доступна для вывода OC0B (см. таблицу 16-4). Действительное значение OC0x будет отображаться на выходном порте, если он настроен как выход с помощью соответствующего разряда регистра DDR. Сигнал ШИМ генерируется путем очистки (или установки) регистра OC0x при событиях Compare Match между OCR0x и TCNT0 когда счетчик считает вверх, и установки (или очистки) регистра OC0x на событии Compare Match между OCR0x и TCNT0 когда счетчик считает вниз. Частота выходных импульсов ШИМ может быть вычислена по следующей формуле:

                        fclk_I/O
fOC0xPCPWM = -----------
                        N * 510

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCR0A представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Phase Correct PWM. Если OCR0A установлен равным BOTTOM, то на выходе будет постоянно лог. 0, и если установлен равным MAX, то на выходе будет постоянно лог. 1 (для non-inverted PWM; если работает inverted PWM, то выходные уровни меняются на противоположные).

В самом начале периода 2 на рис. 16-7 сигнал OC0x переходит от лог. 1 к лог. 0, даже если здесь нет события Compare Match. Точка этого перехода гарантирует симметрию сигнала относительно BOTTOM. Имеется 2 случая, когда происходит переход без события Compare Match:

• OCR0A меняет свое значение от MAX, как на рис. 16-7. Когда значение OCR0A равно MAX, тогда значение вывода OC0 то же самое, как получается в результате счета вниз при событии Compare Match. Чтобы гарантировать симметрию сигнала относительно BOTTOM, значение OC0 при MAX должно соответствовать результату счета вверх при Compare Match.
• Таймер начинает считать от значения, которое больше чем значение в OCR0A, и по этой причине пропускается событие Compare Match, и следовательно пропускается изменение OC0, которое произошло бы на этом пути.

Таймер/счетчик разработан как синхронный. Тактовый сигнал clkT0, показанный на диаграммах, является разрешающим функционирование счетчика (если такты присутствуют, работа таймера/счетчика разрешена, если такты отключены, то запрещена). На рисунках диаграмм показаны события, когда устанавливается флаги прерывания. На рис. 16-8 содержатся данные тактирования для базового функционирования таймера/счетчика. Показана последовательность счета, когда значение счетчика близко к MAX во всех режимах, отличающихся от Phase Correct PWM mode.

ATmega2560 TC0 Timing Diagram no Prescaling fig16 8

Рис. 16-8. Диаграмма тактирования счетчика, прескалер отключен.

На рис. 16-9 показана та же самая диаграмма, но в этом случае включен прескалер с коэффициентом деления 8.

ATmega2560 TC0 Timing Diagram Prescaling8 fig16 9

Рис. 16-9. Диаграмма тактирования счетчика, прескалер включен (fclk_I/O/8).

На рис. 16-10 показана установка OCF0B во всех режимах и OCF0A во всех режимах, за исключением CTC mode и PWM mode, когда OCR0A является границей TOP.

ATmega2560 TC0 Timing Diagram OCF0x Prescaling8 fig16 10

Рис. 16-10. Диаграмма тактирования счетчика с установкой OCF0x, прескалер включен (fclk_I/O/8).

На рис. 16-11 показана установка OCF0A и очистка TCNT0 в CTC mode и Fast PWM mode, когда OCR0A является границей TOP.

ATmega2560 TC0 Timing Diagram CTC Prescaling8 fig16 11

Рис. 16-11. Диаграмма тактирования счетчика с очисткой таймера на событии Compare Match, прескалер включен (fclk_I/O/8).

TCCR0A – Timer/Counter Control Register A

Адрес 0x24 (0x44)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
Чтение/запись rw rw rw rw r r rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:6 – COM0A1:0: Compare Match Output A Mode

Эти биты управляют поведением вывода Output Compare A (OC0A). Если один или оба бита COM0A1:0 установлены, то выход OC0A переназначает нормальное поведение порта ввода/вывода, к которому привязан OC0A (это порт PB7). Однако имейте в виду, что бит Data Direction Register (DDR), соответствующий выводу OC0A, должен быть установлен в лог. 1, чтобы заработал выходной драйвер порта (DDRB7).

Когда OC0A подключен к порту, функционал COM0A1:0 зависит от состояния бит WGM02:0. В таблице 16-2 показан функционал COM0A1:0, когда биты WGM02:0 установлены в режим Normal или CTC (режимы не-PWM).

Табл. 16-2. Compare Output Mode, non-PWM Mode.

COM0A1 COM0A0 Описание
0 0 Обычная работа порта как GPIO, функционал OC0A отключен.
0 1 Переключение OC0A в противоположное состояние при Compare Match.
1 0 Очистка OC0A при Compare Match.
1 1 Установка OC0A при Compare Match.

В таблице 16-3 показан функционал бит COM0A1:0, когда биты WGM01:0 установлены в Fast PWM mode.

Табл. 16-3. Compare Output Mode, Fast PWM Mode(1).

COM0A1 COM0A0 Описание
0 0 Обычная работа порта как GPIO, функционал OC0A отключен.
0 1 WGM02=0: обычная работа порта как GPIO, функционал OC0A отключен. WGM02=1: переключение OC0A в противоположное состояние при Compare Match.
1 0 Очистка OC0A при Compare Match, установка при BOTTOM (не инверсный ШИМ).
1 1 Установка OC0A при Compare Match, очистка при BOTTOM (инверсный ШИМ).

Примечание (1): имеется специальная ситуация, когда OCR0A равен TOP, и установлен COM0A1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Fast PWM.

В таблице 16-4 показан функционал бит COM0A1:0, когда биты WGM02:0 установлены для Phase Correct PWM mode.

Табл. 16-4. Compare Output Mode, Phase Correct PWM Mode(1).

COM0A1 COM0A0 Описание
0 0 Обычная работа порта как GPIO, функционал OC0A отключен.
0 1 WGM02=0: обычная работа порта как GPIO, функционал OC0A отключен. WGM02=1: переключение OC0A в противоположное состояние при Compare Match.
1 0 Очистка OC0A на событии Compare Match при счете вверх. Установка на событии Compare Match при счете вниз.
1 1 Установка OC0A на событии Compare Match при счете вверх. Сброс на событии Compare Match при счете вниз.

Примечание (1): имеется специальная ситуация, когда OCR0A равен TOP, и установлен COM0A1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Phase Correct PWM.

• 5:4 – COM0B1:0: Compare Match Output B Mode

Эти биты управляют поведением вывода Output Compare B (OC0B). Если один или оба бита COM0A1:0 установлены, то выход OC0B переназначает нормальное поведение порта ввода/вывода, к которому привязан OC0B (это PG5). Однако имейте в виду, что бит Data Direction Register (DDR), соответствующий выводу OC0B (бит DDRG5), должен быть установлен в лог. 1, чтобы заработал выходной драйвер порта.

Когда OC0B подключен к порту, функционал COM0B1:0 зависит от состояния бит WGM02:0. В таблице 16-5 показан функционал COM0B1:0, когда биты WGM02:0 установлены в режим Normal или CTC (режим не-PWM).

Табл. 16-5. Compare Output Mode, non-PWM Mode.

COM0B1 COM0B0 Описание
0 0 Обычная работа порта как GPIO, функционал OC0B отключен.
0 1 Переключение OC0B в противоположное состояние при Compare Match.
1 0 Очистка OC0B при Compare Match.
1 1 Установка OC0B при Compare Match.

В таблице 16-6 показан функционал бит COM0B1:0, когда биты WGM02:0 установлены в Fast PWM mode.

Табл. 16-6. Compare Output Mode, Fast PWM Mode(1).

COM0B1 COM0B0 Описание
0 0 Обычная работа порта как GPIO, функционал OC0B отключен.
0 1 Зарезервировано.
1 0 Очистка OC0B при Compare Match, установка при BOTTOM (не инверсный ШИМ).
1 1 Установка OC0B при Compare Match, очистка при BOTTOM (инверсный ШИМ).

Примечание (1): имеется специальная ситуация, когда OCR0B равен TOP, и установлен COM0B1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Fast PWM.

В таблице 16-7 показан функционал бит COM0B1:0, когда биты WGM02:0 установлены для Phase Correct PWM mode.

Табл. 16-7. Compare Output Mode, Phase Correct PWM Mode(1).

COM0B1 COM0B0 Описание
0 0 Обычная работа порта как GPIO, функционал OC0B отключен.
0 1 Зарезервировано.
1 0 Очистка OC0B на событии Compare Match при счете вверх. Установка на событии Compare Match при счете вниз.
1 1 Установка OC0B на событии Compare Match при счете вверх. Сброс на событии Compare Match при счете вниз.

Примечание (1): имеется специальная ситуация, когда OCR0B равен TOP, и установлен COM0B1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Phase Correct PWM.

• 3, 2 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 1:0 – WGM01:0: Waveform Generation Mode

В комбинации с битом WGM02, который находится в регистре TCCR0B, эти биты управляют последовательностью счета, источником для максимального значения (TOP) счетчика, и типом используемой генерации сигнала, см. таблицу 16-8. Поддерживаются следующие режимы работы: Normal mode (счетчик), очистка при событии совпадения CTC mode, и два типа генерации ШИМ.

Табл. 16-8. Описание бит Waveform Generation Mode.

Mode WGM2 WGM1 WGM0 Режим работы TOP Обновл. OCR0x TOV установится при значении(1)
0 0 0 0 Normal 0xFF Немедленно MAX
1 0 0 1 Phase Correct PWM 0xFF TOP BOTTOM
2 0 1 0 CTC OCR0A Немедленно MAX
3 0 1 1 Fast PWM 0xFF TOP MAX
4 1 0 0 Зарезервировано - - -
5 1 0 1 Phase Correct PWM OCR0A TOP BOTTOM
6 1 1 0 Зарезервировано - - -
7 1 1 1 Fast PWM OCR0A BOTTOM TOP

Примечание (1): MAX=0xFF, BOTTOM=0x00.

TCCR0B – Timer/Counter Control Register B

Адрес 0x25 (0x45)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит FOC0A FOC0B - - WGM02 CS02 CS01 CS00
Чтение/запись w w r r rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7 – FOC0A: Force Output Compare A

Бит FOC0A активен только тогда, когда биты WGM задают режим не-PWM.

Однако для обеспечения совместимости с микроконтроллерами, которые возможно появятся в будущем, этот бит должен быть установлен в 0, когда TCCR0B записывается при работе в режиме PWM. Когда записывается лог. 1 в бит FOC0A, то немедленно и принудительно срабатывает событие Compare Match в модуле генерации сигнала (Waveform Generation unit). Выход OC0A поменяет свое состояние в соответствии с настройками бит COM0A1:0. Имейте в виду, что бит FOC0A реализован как строб. Таким образом значение бит COM0A1:0 определяет эффект от принудительного наступления события сравнения.

Строб FOC0A не будет генерировать любое прерывание, и при этом не будет очищен таймер в режиме CTC при использовании OCR0A в качестве значения TOP.

Бит FOC0A всегда читается как 0.

• 6 – FOC0B: Force Output Compare B

Бит FOC0B активен только тогда, когда биты WGM задают режим не-PWM.

Однако для обеспечения совместимости с микроконтроллерами, которые возможно появятся в будущем, этот бит должен быть установлен в 0, когда TCCR0B записывается при работе в режиме PWM. Когда записывается лог. 1 в бит FOC0B, то немедленно и принудительно срабатывает событие Compare Match в модуле генерации сигнала (Waveform Generation unit). Выход OC0B поменяет свое состояние в соответствии с настройками бит COM0B1:0. Имейте в виду, что бит FOC0B реализован как строб. Таким образом значение бит COM0B1:0 определяет эффект от принудительного наступления события сравнения.

Строб FOC0B не будет генерировать любое прерывание, и при этом не будет очищен таймер в режиме CTC при использовании OCR0B в качестве значения TOP.

Бит FOC0B всегда читается как 0.

• 5, 4 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 3 – WGM02: Waveform Generation Mode

См. описание TCCR0A – Timer/Counter Control Register A.

• 2:0 – CS02:0: Clock Select

Эти 3 бита выбирают источник тактирования для таймера/счетчика, см. таблицу 16-9.

Табл. 16-9. Описание бит выбора тактирования для таймера.

CS02 CS01 CS00 Описание
0 0 0 Нет источника для тактирования (таймер/счетчик остановлен).
0 0 1 clkI/O (прескалер отключен).
0 1 0 clkI/O/8 (работает прескалер).
0 1 1 clkI/O/64 (работает прескалер).
1 0 0 clkI/O/256 (работает прескалер).
1 0 1 clkI/O/1024 (работает прескалер).
1 1 0 Внешний источник тактов, подключенный к ножке T0. Тактовый перепад от 1 к 0.
1 1 1 Внешний источник тактов, подключенный к ножке T0. Тактовый перепад от 0 к 1.

Если для тактирования используется T0, то любой активный тактовый переход уровня на ножке порта T0 (это порт PD7) будет срабатывать как тактовый, даже если ножка T0 настроена как выход и управляется программно. Это позволяет программно управлять счетом.

TCNT0 – Timer/Counter Register

Адрес 0x26 (0x46)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит TCNT0[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Этот регистр дает прямой доступ на чтение и запись к содержимому 8-битного счетчика. Запись в TCNT0 блокирует (устраняет) событие Compare Match на следующий такт таймера. Модификация TCNT0, когда счетчик работает приводит к риску пропуска события Compare Match между регистрами TCNT0 и OCR0x.

OCR0A – Output Compare Register A

Адрес 0x27 (0x47)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит OCR0A[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Регистр содержит 8-битное значение, которое постоянно сравнивается со значением счетчика (TCNT0). Совпадение (Compare Match) может использоваться для генерации прерывания Output Compare, или для генерации сигнала на выходе OCR0A.

OCR0B – Output Compare Register B

Адрес 0x28 (0x48)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит OCR0B[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Регистр содержит 8-битное значение, которое постоянно сравнивается со значением счетчика (TCNT0). Совпадение (Compare Match) может использоваться для генерации прерывания Output Compare, или для генерации сигнала на выходе OCR0B.

TIMSK0 – Timer/Counter0 Interrupt Mask Register

Адрес (0x6E)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - - - - OCIE0B OCIE0A TOIE0
Чтение/запись r r r r r rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:3 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 2 – OCIE0B: Timer/Counter0 Output Compare Match B Interrupt Enable

Когда в бит OCIE0B записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/Counter Compare Match B. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFR0) установлен флаг OCF0B.

• 1 – OCIE0A: Timer/Counter0 Output Compare Match A Interrupt Enable

Когда в бит OCIE0A записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/Counter Compare Match A. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFR0) установлен флаг OCF0A.

• 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable

Когда в бит TOIE0 записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/Counter0 Overflow. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло переполнение. Прерывание возникает, когда устанавливается бит TOV0 в регистре Timer/Counter0 Interrupt Flag Register (TIFR0).

TIFR0 – Timer/Counter0 Interrupt Flag Register

Адрес 0x15 (0x35)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - - - - OCF0B OCF0A TOV0
Чтение/запись r r r r r rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:3 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 2 – OCF0B: Timer/Counter0 Output Compare B Match Flag

Бит OCF0B устанавливается, когда происходит событие Compare Match (совпадение) между счетчиком и OCR0B (Output Compare Register0 B). OCF0B очищается аппаратно, когда выполняется соответствующий обработчик прерывания. Альтернативно OCF0B может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит OCIE0B (Timer/Counter Compare B Match Interrupt Enable), и установился бит OCF0B, выполнится обработчик прерывания Timer/Counter Compare Match.

• 1 – OCF0A: Timer/Counter0 Output Compare A Match Flag

Бит OCF0A устанавливается, когда происходит событие Compare Match (совпадение) между счетчиком и OCR0B (Output Compare Register0 A). OCF0A очищается аппаратно, когда выполняется соответствующий обработчик прерывания. Альтернативно OCF0A может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит OCIE0A (Timer/Counter Compare A Match Interrupt Enable), и установился бит OCF0A, выполнится обработчик прерывания Timer/Counter Compare Match.

• 0 – TOV0: Timer/Counter0 Overflow Flag

Бит TOV0 устанавливается, когда произошло переполнение в Timer/Counter0. TOV0 очищается аппаратно, когда выполняется соответствующий обработчик прерывания. Альтернативно TOV0 может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит TOIE0 (Timer/Counter0 Overflow Interrupt Enable), и установился бит TOV0, выполнится обработчик прерывания Timer/Counter0 Overflow.

Установка этого флага зависит от настроек бит WGM02:0, см. таблицу 16-8.

[Timer/Counter1, 3, 4 и 5: 16-битный таймер/счетчик]

Основные возможности таймера:

• Честные 16 бит (что позволяет формировать точный 16-разрядный ШИМ).
• 3 независимых друг от друга компаратора, используемые для формирования выходного сигнала (Output Compare Units)
• Регистры сравнения с двойной буферизацией (Output Compare Registers).
• 1 блок захвата входного сигнала (Input Capture Unit).
• Подавитель помех на входе захвата (Input Capture Noise Canceler).
• Очистка таймера при событии совпадения цифрового компаратора (Compare Match, Auto Reload).
• Широтно-импульсный модулятор с точным, без скачков, изменением фазы выходных импульсов (Glitch-free, Phase Correct Pulse Width Modulator).
• Изменяемый период ШИМ (PWM).
• Генератор частоты.
• Счетчик внешних событий (External Event Counter).
• 12 независимых источников прерывания (флаги TOV1, OCF1A, OCF1B, OCF1C, ICF1, TOV3, OCF3A, OCF3B, OCF3C, ICF3, TOV4, OCF4A, OCF4B, OCF4C, ICF4, TOV5, OCF5A, OCF5B, OCF5C и ICF5).

16-битный Timer/Counter позволяет точно отслеживать время выполнения программы (event management, управление событиями), генерировать сигналы (wave generation), измерять длительности сигналов (signal timing measurement). Большинство имен регистров и названия их бит записаны в этом руководстве в общей форме. Т. е. маленькая буква n должна быть заменена на номер таймера счетчика (т. е. 1, 3, 4 или 5), а маленькая буква x обозначает канал таймера (т. е. должна быть заменена на A, B, C). Само собой, когда Вы используете действительные имена регистров и бит в программе, должна быть использована уточненная форма именования. Например, TCNT1 будет означать доступ к значению счетчика Timer/Counter1 (т. е. n заменена на 1), и т. п.

Упрощенная схема 16-битного таймера/счетчика показана на рис. 17-1. Регистры I/O, доступные для программы, включая биты I/O и порты I/O показаны на рисунке жирным шрифтом.

ATmega2560 TCn 16bit Block Diagram fig17 1

Рис. 17-1. Блок-диаграмма внутреннего устройства 16-битных Timer/Counter1, 3, 4, 5.

Ниже на картинке разными цветами показана привязка ножек 16-битных таймеров к портам GPIO микроконтроллера ATmega2560 (Timer/Counter1, Timer/Counter3, Timer/Counter4, Timer/Counter5):

ATmega2560 TC 16bit pins

Следует обратить внимание на то, что ножка PB7 сделана общей для выходов таймера Timer/Counter0 (OC0A) и Timer/Counter1 (OC1C). Это сделано не случайно, потому что может использоваться для работы Output Compare Modulator (OCM1C0A), см. соответствующий раздел.

Регистры таймера/счетчика (TCNTn), цифрового компаратора (Output Compare Registers, OCRnx), захвата по входу (Input Capture Register, ICRn) являются 16-битными. Внутренняя шина AVR 8-битная, поэтому для доступа к 16-битным регистрам со стороны программы должна быть выполнена специальная процедура [4]. Регистры управления (Timer/Counter Control Registers, TCCRnx) 8-битные, и для них нет ограничений по доступу со стороны программы для CPU. Сигналы запросов на прерывание отображаются в регистре флагов прерываний таймера (Timer Interrupt Flag Register, TIFRn). Все прерывания могут индивидуально разрешаться или запрещаться (маскироваться) с помощью регистра маски прерываний (Timer Interrupt Mask Register, TIMSKn). На рис. 17-1 регистры TIFRn и TIMSKn не показаны, поскольку они являются общими с другими узлами таймера.

Таймер/счетчик может тактироваться от внутренней тактовой частоты, которая может опционально делиться прескалером, либо от внешнего тактового сигнала, поданного на ножку Tn. Блок логики управления определяет источник тактового сигнала и тактовый перепад, которые использует таймер/счетчик для счета (инкремента или декремента своего значения с каждым таковым импульсом). Таймер/счетчик не активен, когда не выбран источник тактового сигнала. На рис. 17-1 выходной сигнал логики выбора тактов, который тактирует счетчик, показан как clkTn.

Регистры цифрового компаратора с двойной буферизацией (OCRnx) постоянно сравниваются с значением счетчика (TCNTn). Результат сравнения может быть использован для генератора сигналов (Waveform Generator), который может генерировать ШИМ или нужную частоту на выходах портов микроконтроллера (Output Compare pin, OCnx). Событие совпадения также устанавливает флаг Compare Match (OCFnx), который может быть использован для генерации запроса на прерывание.

Регистр захвата по входу (Input Capture Register, ICRn) может запоминать в себе (захватывать, capture) значения счетчика, срабатывая по выбранному перепаду сигнала либо на ножке порта Input Capture pin (ICPn), либо на выходе встроенного аналогового компаратора. Блок захвата по входу имеет входной цифровой фильтр помех (Noise Canceler), который снижает вероятность ложного захвата слишком коротких входных импульсов.

Предельное значение счета TOP в некоторых режимах может быть выбрано либо из значения регистра OCRnA, либо регистра ICRn, либо из набора фиксированных значений. Если OCRnA используется как TOP для режима PWM, то OCRnA нельзя использовать для генерации выходного сигнала ШИМ. Однако двойная буферизация OCRnA позволяет изменять значение TOP на лету, во время выполнения программы. Если для TOP используются фиксированные значения, то регистр ICRn может также использоваться как альтернативное значение для TOP, и это освободит OCRnA для формирования выходного сигнала ШИМ.

Для того, чтобы разрешить работу таймеров/счетчиков 1, 3, 4, 5, нужно не только подать на него тактовый сигнал, но и еще сбросить бит управления снижением энергопотребления PRTIM1, PRTIM3, PRTIM4, PRTIM5 соответственно.

Блок счета. Это основной 16-разрядный программируемый узел Timer/Countern, который может считать в прямом (инкремент) и обратном (декремент) направлениях.

ATmega2560 TC 16bit Counter Unit fig17 2

Рис. 17-2. Диаграмма внутреннего устройства блока счета.

Пояснения к сигналам на диаграмме: Count - сигнал, импульсы которого считает счетчик (с каждым тактовым перепадом значение регистра счетчика TCNTn увеличивается или уменьшается, в зависимости от выбранного направления счета). Direction - выбор направления счета. Clear - сигнал сброса в 0 содержимого TCNTn (все биты этого регистра становятся равными 0). clkTn - тактовый сигнал, который поступает с блока выбора тактов. TOP - сигнализирует, что счетчик достиг максимального значения. BOTTOM - сигнализирует, что счетчик достиг минимального значения.

BOTTOM. Это нижнее (минимальное) значение счетчика, 0x0000 для 16-разрядных таймеров.

MAX. Это максимальное значение счетчика, 0xFFFF для 16-разрядных таймеров (десятичное число 65535).

TOP. Это установленное предельное верхнее значение для счетчика. Оно может быть установлено в одно из фиксированных значений (0x00FF, 0x01FF или 0x03FF), либо установлено значением регистра OCRnA или ICRn. Назначение зависит от режима работы счетчика.

Поскольку счетчик TCNTn 16-битный, то он привязан к двум 8-разрядным регистрам I/O: TCNTnH содержит старшие 8 бит счетчика, TCNTnL младшие 8 бит. К регистру TCNTnH имеется только косвенный доступ со стороны CPU (подробнее про доступ см. [4]). Важно помнить, что есть специальные ситуации, при которых запись в 16-битный TCNTn, когда счетчик считает, может привести к непредсказуемым результатам. Эти специальные случаи описаны в секциях, где они имеют значение.

В зависимости от используемого режима работы счетчик очищается, инкрементируется или декрементируется на каждом такте входного сигнала таймера clkTn. Такты clkTn могут генерироваться от внешнего или внутреннего источника тактового сигнала, что выбирается битами выбора тактирования (Clock Select, CSn2:0). Когда тактовый сигнал не выбран (CSn2:0 = 0), таймер остановлен. При этом значение TCNTn может быть получено программно со стороны CPU, независимо от того, присутствует тактовый сигнал clkTn или нет. Программная запись со стороны CPU запрещает (имеет приоритет выше) все операции очистки или счета.

Последовательность счета определяется установкой битов режима генерации сигнала (Waveform Generation mode bits, WGMn3:0), которые находятся в регистрах Timer/Counter Control Registers A и B (TCCRnA и TCCRnB). Есть близкая взаимосвязь между тем, как счетчик считает, и какие при этом сигналы будут появляться на выходах Output Compare (OCnx).

Флаг переполнения Timer/Counter Overflow Flag (TOVn) устанавливается в соответствии с режимом работы, выбранным битами WGMn3:0. TOVn может использоваться для генерации прерывания CPU.

[Блок захвата по входу (Input Capture Unit)]

Этот модуль позволяет синхронизировать захват значения счетчика по внешнему событию, и таким образом давать привязанную к событию метку времени (time-stamp), регистрирующую время наступления события. Внешний сигнал, показывающий это событие (или несколько событий), может быть подан через вывод ICPn или альтернативно (только для таймера Timer/Counter1) через узел аналогового компаратора. Метки времени можно использовать для вычисления частоты, длительности и периода импульсов сигналов. Альтернативно метки времени могут использоваться для создания лога событий.

Внутреннее устройство Input Capture unit показано на блок-диаграмме рис. 17-3. Элементы диаграммы, которые не являются напрямую частями input capture unit, выделены серым цветом. Маленькая буква n в именах регистров и бит показывает наличие в этом месте порядкового номера таймера/счетчика (1, 3, 4 или 5).

ATmega2560 TC 16bit Input Capture Unit fig17 3

Рис. 17-3. Блок-диаграмма Input Capture Unit.

Примечание: выход аналогового компаратора (Analog Comparator Output, ACO) может давать срабатывание только для Timer/Counter1 ICP, но не для Timer/Counter3, 4 или 5.

Когда меняется логический уровень (это событие) на выводе Input Capture Pin (ICPn), или альтернативно на ACO, и это изменение соответствует настройке детектора перепада (Edge Detector), то сработает захват (capture). При этом 16-битное значение счетчика (TCNTn) будет записано в Input Capture Register (ICRn). Установится Input Capture Flag (ICFn) на том же самом тактовом цикле системы, когда произошло копирование значения TCNTn в регистр ICRn. Если это разрешено (TICIEn = 1), то будет сгенерировано прерывание input capture. Флаг ICFn автоматически очистится, когда запустится обработчик этого прерывания. Альтернативно флаг ICFn может быть очищен программно записью лог. 1 в этот бит I/O.

Аналоговый компаратор выбирается в качестве источника события для узла захвата ICP1, если установить бит ACIC в регистре Analog Comparator Control and Status Register (ACSR). Имейте в виду, что переключение источника события может привести к срабатыванию узла захвата, поэтому после смены источника захвата для Timer/Counter1 следует сбросить флаг ICF1.

Чтение 16-битного значения Input Capture Register (ICRn) выполняется путем первоначального чтения младшего байта (ICRnL), и затем чтения старшего байта (ICRnH). Регистр ICRn может быть записан только когда используется режим генерации сигнала (Waveform Generation mode), который задействует значение регистра ICRn в качестве значения TOP для счетчика. В этих случаях должны быть установлены биты Waveform Generation mode (WGMn3:0) до того, как значение TOP может быть записано в регистр ICRn. Когда происходит запись в ICRn, то сначала должен быть записан старший байт ICRnH, затем младший ICRnL.

Подробнее про доступ к 16-битным регистрам см. [4].

И вывод ICPn и выход компаратора ACO опрашиваются по тому же самому принципу, как и вывод Tn. Блок детектора перепада Edge Detector также идентичен. Однако когда разрешен подавитель помех Noise Canceler, перед детектором перепада вставляется дополнительная логика, которая увеличивает задержку на 4 системных такта. Имейте в виду, что входной подавитель помех и детектор перепада всегда разрешены, за исключением случаев, когда таймер/счетчик установлен в режим Waveform Generation, который использует ICRn для значения TOP.

Событие захвата можно генерировать программно, если настроить ножку ICPn как выход, и управлять состоянием из программы.

Подавитель помех (Noise Canceler). Подавитель помех улучшает защищенность системы со стороны внешних помех с помощью простой схемы цифровой фильтрации. Вход noise canceler мониторится по 4 выборкам, и все 4 выборки должны быть одинаковы, чтобы состояние выхода фильтра поменялось. Выход фильтра подключен ко входу детектора перепада.

Подавитель помех включается установкой бита Input Capture Noise Canceler (ICNCn) в регистре Timer/Counter Control Register B (TCCRnB). Когда подавитель помех разрешен, то он добавляет дополнительные 4 системных такта задержки передачи сигнала на вход узла захвата, когда обновляется регистр ICRn. Подавитель помех использует для своей работы системную частоту тактов, так что не его работу не влияет настройка прескалера.

Использование Input Capture Unit. Главная проблема при использовании Input Capture unit состоит в назначении достаточной вычислительной мощности для обработки входящих событий. Время между двумя событиями критично. Если процессор не прочитал захваченное значение в регистре ICRn до возникновения следующего события, то ICRn будет перезаписан новым значением. В этом случае результат захвата будет некорректным.

Когда используется прерывание Input Capture, регистр ICRn должен быть прочитан в обработчике прерывания настолько раньше, как это только возможно. Даже при том, что у прерывания Input Capture есть относительно высокий приоритет, максимальное время ответа на прерывание зависит от максимального количества системных тактовых циклов, которые могут быть затрачены на выполнение команд в других обработчиках прерываний.

Примечание: напомню, что у AVR нет полноценной системы приоритетов прерываний, есть только фиксированные уровни приоритетов, которые определяются положением вектора прерывания в таблице векторов. Причем работа обработчика прерывания с низким приоритетом не может быть прервана обработчиком прерывания с более высоким приоритетом (если конечно же не разрешить прерывание в обработчике прерывания с низким уровнем приоритета, но это уже колхоз).

Не рекомендуется активно менять значение TOP (разрешение, диапазон счета) при использовании Input Capture unit в любом режиме работы.

Измерение скважности (duty cycle) сигналов требует изменения настройки детектора перепада после каждого события захвата. Это изменение настройки должно быть сделано максимально быстрее, как только это возможно, сразу после чтения регистра ICRn. После смены перепада Input Capture Flag (ICFn) должен быть очищен программно (записью туда лог. 1). Если надо всего лишь измерять частоту, и используется обработчик прерывания, то очистка флага ICFn не требуется.

Блок сравнения. Это 16-разрядный компаратор (Output Compare Unit), который постоянно сравнивает содержимое TCNTn с содержимым регистров OCRnx (напомню, что n означает номер таймера 1, 3, 4 или 5, а x означает индекс регистра блока сравнения A, B или C). Всякий раз, когда TCNTn равен OCRnx, компаратор сигнализирует о совпадении. Событие совпадения установит флаг OCFnx (Output Compare Flag) в следующем тактовом цикле. Если разрешено соответствующее прерывание (OCIEnx=1), то Output Compare Flag генерирует прерывание Output Compare. Output Compare Flag автоматически очищается, когда запускается обработчик прерывания. Альтернативно флаг может быть очищен программно путем записи лог. 1 в место размещения бита. Генератор сигналов (Waveform Generator) использует сигнал совпадения для генерации выхода в соответствии с режимом, установленным битами WGMn3:0 (Waveform Generation mode) и COMnx1:0 (Compare Output mode). Сигналы MAX и BOTTOM используются генератором сигналов для обработки специальных ситуаций в некоторых режимах.

Для Output Compare unit A есть специальная возможность задать значение TOP для счетчика (и, таким образом, определить его диапазон счета, т. е. разрешающую способность). В дополнение к разрешающей способности счетчика значение TOP влияет на время периода генерируемых сигналов узлом Waveform Generator.

На рис. 17-4 показана блок-диаграмма Output Compare unit. Маленькая n в именах регистров и бит соответствует номеру таймера (n = n для Timer/Counter n), и x говорит от том, какой Output Compare unit (A/B/C). Те части диаграммы, которые не являются напрямую частью Output Compare unit, показаны серым цветом.

ATmega2560 TC 16bit Output Compare Unit fig17 4

Рис. 17-4. Блок-диаграмма Output Compare Unit.

Регистр OCRnx имеет двойную буферизацию, когда используется любой из 12 режимов генерации ШИМ. Для режимов работы Normal и Clear Timer on Compare (CTC) двойная буферизация запрещена. Двойная буферизация синхронизирует обновление регистра OCRnx по TOP или BOTTOM в последовательности счета. Эта синхронизация предотвращает возникновение импульсов нечетной длины, асимметричных импульсов ШИМ, что делает выходной сигнал ШИМ чистым.

Может показаться, что доступ к регистрам OCRnx сложен, но это не так. Двойная буферизация работает прозрачно - и когда оно разрешено, и когда отключено. Когда буферизация работает, то ядро CPU получает доступ к OCRnx через аппаратный буфер, а когда отключено, то напрямую. Содержимое OCR1x изменяется только операцией записи (таймер/счетчик не обновляет регистр автоматически, как регистр TCNT1 и ICR1). Таким образом, OCR1x не читается через старший байт временного регистра (TEMP). Однако хорошей практикой является читать сначала младший байт, как при доступе к другим 16-битным регистрам [4]. Запись регистров OCRnx должна выполняться через регистр TEMP, поскольку сравнение всех 16 бит происходит постоянно. Сначала пишется старший байт OCRnxH. Когда старший байт записан в байтовое пространство регистров I/O, регистр TEMP обновится записанным значением. Тогда должны быть записаны младшие 8 бит (OCRnxL), старший байт будет копироваться в верхнюю половину буфера OCRnx или напрямую в регистр OCRnx в одном и том же системном такте. Подробнее про работу с 16-разрядными регистрами см. [4].

Force Output Compare. В не-PWM режимах генерации сигналов событие совпадения может быть сгенерировано принудительно путем записи лог. 1 в бит FOCnx (Force Output Compare). Принудительно сгенерированное событие не установит флаг OCnx, не будут произведены сброс/перезагрузка счетчика, однако выходное состояние ножки порта OCnx обновится, как если бы произошло реальное событие Compare Match (обновление произойдет в соответствии с настройками бит COMn1:0, независимо от того, установлен ли лог. уровень выхода OCnx, сброшен или переключен в противоположное состояние).

Блокировка события сравнения записью в TCNT0. Все операции записи регистра TCNTn со стороны ядра CPU заблокируют любое событие Compare Match, которое возникло бы в следующем такте таймера, даже когда таймер остановлен. Эта возможность позволяет инициализировать OCRnx тем же самым значением, как и TCNTn, без срабатывания прерывания, когда тактирование таймера/счетчика разрешено.

Использование блока сравнения. Поскольку запись TCNTn в любом режиме запретит все события совпадения Compare Match на 1 такт таймера, есть риск при изменении TCNTn при использовании любого блока сравнения, независимо от того, работает таймер/счетчик или нет. Если записываемое в TCNTn значение равно OCRnx, то событие Compare Match будет потеряно, в результате чего может быть неправильно сгенерирован выходной сигнал. Не записывайте в TCNTn значение, равное TOP в режимах PWM, которые используют переменные значения TOP. Событие сравнение проигнорируется, и счетчик продолжит считать до 0xFFFF. Наподобие не записывайте в TCNTn значение, равное BOTTOM, когда счетчик считает вниз.

Настройка OCnx должна быть выполнена перед установкой регистра направления работы порта (Data Direction Register, DDR), чтобы ножка порта работала как выход. Самый простой путь установки состояния порта OCnx - использовать биты стробирования Force Output Compare (FOCnx) в нормальном (Normal) режиме работы таймера/счетчика. Регистры OCnx сохраняют свои значения даже когда изменяются режимы работы генератора сигналов.

Имейте в виду, что биты COMnx1:0 не имеют двойной буферизации, как это сделано для величин сравнения. Поэтому изменения битов COMnx1:0 приводят к немедленному результату.

Блок выходного сигнала сравнения (Compare Match Output Unit). Биты управления режимом выхода сравнения (Compare Output mode, COMnx1:0) имеют 2 функции. Генератор сигналов использует COMnx1:0 для определения состояния выхода OCnx при следующем событии Compare Match. Также COMnx1:0 управляют источником выхода для выводов OCnx. На рис. 17-5 показана упрощенная схема логики, на которую влияет управление установкой бит COMnx1:0. Регистры I/O, биты I/O и выводы I/O показаны на картинке жирным шрифтом. Показаны только те регистры портов GPIO (DDR и PORT), на которые влияют биты COMnx1:0. Когда ссылаются на состояние OCnx, то нужно смотреть на внутренний регистр OCnx, не вывод OCnx. Если произошел системный сброс, регистр OCnx сбрасывается в 0.

ATmega2560 TCn 16bit Compare Match Output Unit fig17 5

Рис. 17-5. Схема вывода блока сравнения (Compare Match Output Unit).

Обычные функции порта ввода/вывода GPIO переназначаются Output Compare (OCnx) из генератора сигналов, если установлен любой из битов COMnx1:0. Однако направление работы порта вывода OCnx (т. е. вход это или выход) все еще зависит от регистра DDR для нужной ножки порта. Таким образом, соответствующий бит регистра DDR для нужного вывода OC0x (DDR_OCnx) должен быть установлен до того, как значение OC0x будет видимо на этом порте. Функция переназначения порта обычно не зависит от режима работы генератора сигналов, но есть некоторые исключения, см. таблицы 17-3, 17-4, 17-5.

Дизайн логики Output Compare позволяет инициализировать состояние OCnx до разрешения работы выхода. Имейте в виду, что некоторые комбинации бит COMnx1:0 зарезервированы для определенных режимов работы.

Биты COMnx1:0 не влияют на Input Capture unit.

Режимы сравнения и генерация сигналов. Генератор сигналов (Waveform Generator) по-разному использует биты COMnx1:0 для режимов Normal, CTC и PWM. Для всех режимов COMnx1:0 = 0 говорит для Waveform Generator, что при следующем событии Compare Match не должно быть никаких действий с регистром OCnx. Для выходных действий в режимах не-PWM, Fast PWM, Phase Correct PWM см. соответствующие таблицы 17-3, 17-4, 17-5.

Изменение состояния битов COMnx1:0 даст эффект на первом событии Compare Match после того, как биты были записаны. Для режимов не-PWM действие может быть реализовано немедленно с использованием битов стробирования FOCnx.

Режимы работы определяют поведение таймера и выходных выводов Output Compare, как это задано комбинацией настроечных бит Waveform Generation mode (WGMn3:0) и Compare Output mode (COMnx1:0). Биты COMnx1:0 не влияют на последовательность счета, в то время как WGMn3:0 влияют. Биты COM0x1:0 определяют, как будет генерироваться сигнал ШИМ - инвертированный или нет (inverted PWM или non-inverted PWM). В не-PWM режимах биты COMnx1:0 определяют, должен ли быть выход установлен, сброшен или переключен в противоположное состояние, когда наступило событие Compare Match.

Табл. 17-2. Описание бит Waveform Generation Mode(1).

Mode WGMn3 WGMn2
(CTCn)
WGMn1
(PWMn1)
WGMn0
(PWMn0)
Режим работы TOP Обновл. OCRnx TOVn установится при значении
0 0 0 0 0 Normal 0xFFFF Немедленно MAX
1 0 0 0 1 Phase Correct PWM, 8 бит 0x00FF TOP BOTTOM
2 0 0 1 0 Phase Correct PWM, 9 бит 0x01FF TOP BOTTOM
3 0 0 1 1 Phase Correct PWM, 10 бит 0x03FF TOP BOTTOM
4 0 1 0 0 CTC OCRnA Немедленно MAX
5 0 1 0 1 Fast PWM, 8 бит 0x00FF BOTTOM TOP
6 0 1 1 0 Fast PWM, 9 бит 0x01FF BOTTOM TOP
7 0 1 1 1 Fast PWM, 10 бит 0x03FF BOTTOM TOP
8 1 0 0 0 Phase and Frequency Correct ICRn BOTTOM BOTTOM
9 1 0 0 1 Phase and Frequency Correct OCRnA BOTTOM BOTTOM
10 1 0 1 0 Phase Correct PWM ICRn TOP BOTTOM
11 1 0 1 1 Phase Correct PWM OCRnA TOP BOTTOM
12 1 1 0 0 CTC OCRnA Немедленно MAX
13 1 1 0 1 Зарезервировано - - -
14 1 1 1 0 Fast PWM ICRn BOTTOM TOP
15 1 1 1 1 Fast PWM OCRnA BOTTOM TOP

Примечание (1): Имена бит CTCn и PWMn1:0 устарели. Вместо них используйте имена WGMn2:0. Однако функционал и размещение этих бит совместим с предыдущей версией таймера.

[Нормальный режим (Normal mode)]

Это самый простой режим, когда WGMn3:0 = 0. В этом режиме направление счета всегда прямое (инкремент), и не выполняется очистка счетчика. Счетчик просто переваливает за верхнюю границу счета MAX (0xFFFF), и снова начинает счет с нулевого значения BOTTOM (0x0000). В нормальном режиме будет установлен флаг переполнения Timer/Counter Overflow Flag (TOVn) в том же самом такте таймера, когда TCNTn обнуляется. Таким образом, бит TOVn ведет себя как 17-й бит счетчика, за исключением того, что он всегда устанавливается и сам не очищается. Однако в комбинации с прерыванием переполнения таймера (timer overflow interrupt) флаг TOVn автоматически очищается, и разрядность счетчика может быть увеличена уже программно. Новое значение счетчика может быть записано программно в TCNTn в любой момент времени.

Input Capture unit просто использовать в Normal mode. Однако нужно избегать превышения максимального интервала между событиями, чтобы оно не было больше диапазона счета таймера/счетчика. Если интервал между событиями слишком велик, то либо должен быть использован обработчик прерывания переполнения таймера (для программного увеличения разрешающей способности счета интервала), либо должен быть задействован прескалер для снижения частоты тактирования счетчика.

Output Compare Unit может использоваться для генерации прерываний в определенные моменты времени. Использование Output Compare для генерации сигналов в режиме Normal не рекомендуется, потому что будет слишком много расходоваться времени CPU.

[Режим очистки при совпадении (CTC mode)]

В режиме Clear Timer on Compare или CTC mode (WGMn2:0 = 4 или 12) регистр OCRnA используется для управления разрешающей способностью счетчика. Счетчик автоматически сбрасывается в 0, когда значение счетчика TCNTn совпадет либо с OCRnA (WGMn3:0 = 4), либо с ICRn (WGMn3:0 = 12). Поэтому OCRnA или ICRn определяет верхний предел, до которого работает счетчик, что влияет на его разрешение. Этот режим дает большие возможности по управлению выходной частотой Compare Match. Это также упрощает алгоритм подсчета внешних событий.

Диаграмма времени CTC mode показана на рис. 17-6. Значение счетчика (TCNTn) увеличивается до тех пор, пока не произойдет событие Compare Match между TCNTn и OCRnA или ICRn, и тогда TCNTn очищается.

ATmega2560 TCn 16bit CTC Mode fig17 6

Рис. 17-6. Диаграмма работы режима CTC.

Каждый раз, когда значение счетчика достигает значения TOP, может быть сгенерировано прерывание по флагу OCFnA или ICFn, в зависимости от того, какой регистр был использован в качестве значения TOP. Если прерывание разрешено, то обработчик прерывания может использоваться для обновления значения TOP. Однако изменение значения TOP так, что оно станет близким к BOTTOM, когда счетчик работает без прескалера или с малым коэффициентом деления, должно делаться с осторожностью, потому что CTC mode не имеет двойной буферизации. Если новое записанное в регистр OCRnA (или ICRn) значение будет меньше, чем текущее значение TCNTn, то счетчик пропустит событие Compare Match, и счетчик будет считать до значения MAX (0xFFFF), затем перевалит в 0x0000, и только после этого может возникнуть очередное событие Compare Match. Во многих случаях это нежелательно. Альтернативно можно использовать Fast PWM mode с OCRnA в качестве TOP (WGMn3:0 = 15), поскольку в этом случае для OCRnA будет работать двойная буферизация.

Для генерации импульсов определенной частоты в CTC mode выход OC0A может быть установлен на переключение логического уровня на каждом Compare Match путем установки бито Compare Output mode в режим переключения (toggle mode, COMnA1:0 = 1). Значение OCnA не появится на выходной ножке порта, пока регистр DDR не будет настроен соответствующим образом (чтобы нужный вывод порта работал как выход). Максимальная частота получаемых импульсов fOCnA = fclk_I/O/2, когда OCRnA установлен в 0 (0x0000). Общая формула для определения выходной частоты:

                        fclk_I/O
fOCnA = --------------------------
              2 * N * (1 + OCRnA)

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Точно так же, как и в Normal mode, флаг TOVn устанавливается в том же такте таймера, когда счетчик переваливает от MAX до 0x0000.

[Быстрый ШИМ (Fast PWM Mode)]

Этот режим предоставляет возможность генерации ШИМ на высокой частоте (WGMn3:0 = 5, 6, 7, 14 или 15). Режим Fast PWM отличается от других режимов PWM тем, что период ШИМ формируется за один проход счетчика. Счетчик считает от BOTTOM до TOP, затем начинает считать заново от BOTTOM. В non-inverting Compare Output mode бит Output Compare (OCnx) очищается, когда происходит событие Compare Match между TCNTn и OCRnx, и устанавливается в момент, когда счетчик равен BOTTOM. В inverting Compare Output mode наоборот, выход устанавливается при событии Compare Match, и очищается при BOTTOM. Поскольку полный цикл переключения выхода осуществляется за один проход счетчика, то рабочая частота Fast PWM может быть в 2 раза выше, чем в Phase Correct PWM mode, когда используется цикл PWM в 2 проходах счетчика. Высокая частота делает Fast PWM хорошо подходящим для управления источником питания, выпрямителем, и в приложениях DAC (ЦАП, цифро-аналоговый преобразователь). Высокая частота позволяет упростить схему фильтра ШИМ, использовать для фильтра внешние детали меньшего размера (это относится к дросселям и конденсаторам), что также снижает общую стоимость системы.

Разрешающая способность ШИМ для Fast PWM может быть фиксированной в 8, 9 или 10 бит, или может задаваться через значение ICRn или OCRnA. Минимально допустимое разрешение составляет 2 бита (ICRn или OCRnA установлен в значение 0x0003), и максимальное разрешение 16 бит (OCRnA или ICRn установлено в значение MAX). Разрешающая способность может быть вычислена по формуле:

               log(TOP+1)
RFPWM = --------------
                  log(2)

В Fast PWM mode счетчик инкрементируется, пока его значение не достигнет значения либо фиксированных значений 0x00FF, 0x01FF, 0x03FF (WGMn3:0 = 5, 6, 7), либо значения ICRn (WGMn3:0 = 14), либо OCRnA (WGMn3:0 = 15). Затем счетчик очищается на следующем тактовом цикле таймера. Диаграмма времени для Fast PWM mode показана на рис. 17-7. Показан режим Fast PWM, когда OCRnA или ICRn используется в качестве TOP. Значение TCNTn на этой диаграмме показано как гистограмма для иллюстрации работы ШИМ по одному циклу. На диаграмме показаны не-инвертируемые (non-inverted) и инвертируемые (inverted) выходы ШИМ. Маленькие горизонтальные линии помечают циклы TCNTn, представляющие события Compare Match между OCRnx и TCNTn. При этом устанавливается флаг прерывания OCFnx.

ATmega2560 TCn 16bit Fast PWM Mode fig17 7

Рис. 17-7. Диаграмма работы Fast PWM mode.

Флаг переполнения Timer/Counter Overflow (TOVn) устанавливается каждый раз, когда счетчик достигает TOP. Дополнительно в том же самом цикле таймера, что и флаг TOVn, будут установлен флаг OCnA или ICFn, когда в качестве TOP используется OCRnA или ICRn. Если разрешено одно из прерываний, для обновления величины сравнения и величины TOP может быть использован обработчик прерывания.

Когда программно изменяется значение TOP, то программа должна убедиться, что новое значение TOP больше или равно значению всех регистров сравнения. Если это условие не выполнено, и новое значение TOP меньше любого из регистров сравнения, то событие Compare Match не произойдет для равенства величин TCNTn и OCRnx. Обратите внимание, что когда используются фиксированные значения для TOP, то неиспользуемые биты маскируются нулями, когда записывается любой из регистров OCRnx.

Процедура обновления ICRn отличается от обновления OCRnA, когда ICRn и OCRnA используются в качестве TOP. Регистр ICRn не имеет двойной буферизации. Это означает, что если ICRn изменен в малое значение, когда счетчик работает без прескалера или с малым коэффициентом деления прескалера, то есть риск, что новое записанное значение ICRn окажется меньше, чем текущее значение TCNTn. В результате может оказаться так, что будет пропущено событие Compare Match на значении TOP, и счетчик будет продолжать счет до MAX (0xFFFF) и снова обнулится, начав счет от 0x0000, и только после этого может произойти событие Compare Match. Однако регистр OCRnA имеет двойную буферизацию. Эта возможность позволяет в любое время записать I/O ячейку OCRnA. При двойной буферизации запись в I/O-ячейку OCRnA приведет к записи в буферный регистр OCRnA. Действительный регистр OCRnA будет обновлен значением буфера на следующем такте таймера после того как TCNTn достигнет TOP. Обновление будет выполнено в том же самом такте таймера, когда TCNTn очистится и будет установлен флаг TOVn.

Использование регистра ICRn для TOP хорошо работает, когда используются фиксированные значения для TOP (т. е. когда ICRn не меняется программно). При использовании ICRn для TOP регистр OCRnA освобождается для использовании в генерации выходного сигнала ШИМ на OCnA. Однако, если базовая частота ШИМ активно меняется (путем изменения значения TOP), то лучше использовать в качестве TOP значение регистра OCRnA из-за наличия двойного буфера.

В режиме Fast PWM блок сравнения позволяет генерировать сигналы с помощью ШИМ на выводах портов OCnx. Установка битов COMnx1:0 в 2 будет производить non-inverted PWM, и выход inverted PWM может быть сгенерирован установкой битов COMnx1:0 в значение 3. Действительное значение OCnx появится на внешнем выводе порта только тогда, когда соответствующий бит регистра DDR настроил этот порт как выход. Сигнал ШИМ формируется путем остановки (или очистки) регистра OCnx при событиях совпадения OCRnx и TCNTn, и путем очистки (или установки) регистра OCnx в том же такте таймера, когда счетчик очищается (меняет свое значение от TOP к BOTTOM). Частота выходных импульсов ШИМ может быть вычислена по следующей формуле:

                        fclk_I/O
fOCnxPWM = -----------------
                    N * (1+TOP)

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCRnA представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Fast PWM. Если OCRnA установлен равным BOTTOM, то выходной сигнал будет выглядеть как короткие иголки для каждого TOP+1 цикла таймера. Установка OCRnA равным TOP приведет к постоянному выходному уровню лог. 1 или лог. 0 (в зависимости от установленной полярности выхода, которая устанавливается битами COMnx1:0).

Установка битов COMnA1:0 в 1 позволяет выводу OCnA переключаться в противоположное состояние на событиях Compare Match, если OCR1A используется как значение TOP (WGM13:0 = 15). Максимальная получаемая при этом частота будет fOCnA = fclk_I/O/2, когда OCRnA установлен в 0 (0x0000). Эта возможность похожа на переключение в противоположное состояние OCnA в режиме CTC, за исключением того, что в режиме Fast PWM разрешена двойная буферизация Output Compare unit.

[Режим корректной фазы ШИМ (Phase Correct PWM Mode)]

Phase Correct PWM mode (WGMn3:0 = 1, 2, 3, 10 или 11) предоставляет для генерации сигналов высокоточный ШИМ, когда при регулировке выхода сохраняется корректность фазы. Phase Correct PWM mode, наподобие Phase and Frequency Correct PWM mode, основан на двойном проходе счетчика по одному периоду ШИМ. Счетчик постоянно считает от BOTTOM (0x0000) до TOP, и затем считает от TOP к BOTTOM, формируя один полный период фазы ШИМ. В неинверирующем режиме (non-inverting Compare Output mode), выход (Output Compare, OCnx) очищается при совпадении (Compare Match) между TCNTn и OCRnx во время счета вверх, и устанавливается при совпадении (Compare Match) во время счета вниз. В инверсном режиме (inverting Output Compare mode), все работает аналогично, но выходной сигнал инвертируется. Двойной проход для одного периода ШИМ имеет в 2 раза меньше выходную рабочую частоту ШИМ по сравнению с режимом, когда счетчик формирует период ШИМ за 1 проход. Однако симметрия при формировании ШИМ, когда счетчик работает в 2 прохода, позволяет осуществить точное регулирование, что желательно для приложений регулирования двигателей.

Разрешающая способность ШИМ для Phase Correct PWM mode может быть фиксирована на 8, 9, или 10 бит, или определена значениями регистров ICRn либо OCRnA. Минимально допустимая разрешающая способность 2 бита (ICRn или OCRnA установлен в 0x0003), и максимальная разрешающая способность 16 бит (ICRn или OCRnA установлен в MAX). Разрешающая способность в битах может быть вычислена по формуле:

                  log(TOP+1)
RPCPWM = ----------------
                     log(2)

В Phase Correct PWM mode счетчик инкрементируется, пока его значение не достигнет либо одной из фиксированных значений 0x00FF, 0x01FF, 0x03FF (WGMn3:0 = 1, 2, 3), либо значения ICRn (WGMn3:0 = 10), либо значения OCRnA (WGMn3:0 = 11). При этом формируется первая часть периода ШИМ. Когда счетчик достиг TOP, он меняет направление счета, и начинается формирование второй части периода ШИМ. Значение TCNTn будет равно TOP в течение одного тактового цикла таймера. Диаграмма времени работы Phase Correct PWM mode показана на рис. 17-8. Значение TCNTn на диаграмме показано в виде гистограммы, иллюстрирующей работу счетчика за 2 прохода. На диаграмме показаны не инвертирующий и инвертирующий выходы ШИМ. Маленькие горизонтальные линии помечают циклы TCNTn, представляющие события Compare Match между OCRnx и TCNTn.

ATmega2560 TCn 16bit Phase Correct PWM Mode fig17 8

Рис. 17-8. Диаграмма работы Phase Correct PWM Mode.

Флаг переполнения Timer/Counter Overflow (TOVn) устанавливается каждый раз, когда счетчик достигает BOTTOM. Когда либо OCRnA, либо ICRn используются в качестве TOP, флаги OCnA или ICFn будут установлены в том же такте таймера, когда регистры OCRnx будут обновлены с использованием двойного буфера (для TOP). Флаги прерывания может использоваться для генерации прерывания каждый раз, когда счетчик достигает значения TOP или BOTTOM.

Когда меняется значение TOP, программа должна предварительно удостовериться, что новое значение TOP больше или равно значению всех регистров сравнения. Если это не так, и значение TOP меньше, чем любой из регистров сравнения, то событие Compare Match при равенстве TCNTn и OCRnx не произойдет. Имейте в виду, что когда используются для TOP фиксированные значения, неиспользуемые биты маскируются нулями, когда записывается любой из регистров OCRnx. Как показано в третьем периоде рис. 17-8, активное изменение TOP когда счетчик работает в phase correct mode, может привести к появлению несимметричного выходного сигнала. Причина в времени обновления регистра OCRnx. Поскольку обновление OCRnx происходит в момент достижения TOP, период ШИМ начинается и заканчивается в момент TOP. Это подразумевает, что длина спада определяется по предыдущему значению TOP, в то время как длина нарастания определяется новым значением TOP. Когда эти две величины различаются, то две части периода будут отличаться по длине. Это даст несимметричный выходной сигнал.

Рекомендуется использовать Phase and Frequency Correct mode вместо Phase Correct mode, когда производится изменение значение TOP во время работы таймера/счетчика. Когда используется статическое значение TOP, то нет никакого практического различия в этих двух режимах работы.

В Phase Correct PWM mode узел сравнения позволяет генерировать сигналы с помощью ШИМ на выводах OCnx. Установка COMnx1:0 в значение 2 даст неинверсный ШИМ (non-inverted PWM). Инверсный ШИМ генерируется установкой COMnx1:0 в значение 3. Действительное значение OCnx будет отображаться на выходном порте, если он настроен как выход с помощью соответствующего разряда регистра DDR. Сигнал ШИМ генерируется путем установки (или очистки) регистра OCnx в момент совпадения OCRnx и TCNTn когда счетчик считает вверх, и очистки (или установки) регистра OCnx на событии совпадения OCRnx и TCNTn когда счетчик считает вниз. Частота выходных импульсов ШИМ может быть вычислена по следующей формуле:

                          fclk_I/O
fOCnxPCPWM = ---------------
                       2 * N * TOP

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCRnx представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Phase Correct PWM. Если OCRnx установлен равным BOTTOM, то на выходе будет постоянно лог. 0, и если установлен равным TOP, то на выходе будет постоянно лог. 1 (для non-inverted PWM; если работает inverted PWM, то выходные уровни меняются на противоположные). Если OCR1A используется для определения значения TOP (WGM13:0 = 11), и COM1A1:0 = 1, то выход OC1A будет переключаться со скважностью 50%.

[Режим корректной фазы и частоты ШИМ (Phase and Frequency Correct PWM Mode)]

Этот режим (WGMn3:0 = 8 или 9) предоставляет высокоточный ШИМ, когда при генерации сигнала сохраняется корректной и частота, и фаза. Как и в режиме Phase Correct PWM, здесь тоже используется формирование периода ШИМ на базе двух проходов счетчика. Счетчик считает от BOTTOM (0x0000) до TOP и затем от TOP до BOTTOM. В неинверсном режиме Output Compare (OCnx) очищается при совпадении TCNTn и OCRnx во время счета вверх, и устанавливается при совпадении во время счета вниз. В инверсном режиме все то же самое, просто выход инвертируется. Формирование периода ШИМ за 2 прохода дает в 2 раза меньше выходную частоту ШИМ в сравнении с режимом, когда период ШИМ формируется за 1 проход счетчика. Однако из-за симметрии полученного сигнала ШИМ Phase and Frequency Correct PWM Mode рекомендуется использовать в приложениях, требующих стабильного регулирования, например управление двигателями.

Основное отличие между режимом Phase Correct и режимом Phase and Frequency Correct PWM - время обновления регистра OCRnx буфером OCRnx, см. рис. 17-8 и рис. 17-9.

Разрешающая способность ШИМ для Phase and Frequency Correct PWM mode может быть задана значением ICRn или OCRnA. Минимально допустимая разрешающая способность 2 бита (ICRn или OCRnA установлен в 0x0003), и максимальная 16 бит (ICRn или OCRnA установлен в MAX). Разрешающая способность ШИМ в битах вычисляется по следующей формуле:

                  log(TOP+1)
RPFCPWM = --------------
                     log(2)

В режиме Phase and Frequency Correct PWM счетчик инкрементируется, пока значение счетчика не совпадет либо с ICRn (WGMn3:0 = 8), либо с OCRnA (WGMn3:0 = 9). Затем счетчик по достижении значения TOP меняет направление счета. Значение TCNTn остается равным TOP на один такт таймера. Диаграмма времени работы режима показана на рис. 17-9, когда OCRnA или ICRn используется в качестве TOP. Значение TCNTn на диаграмме показано как гистограмма для иллюстрации формирования периода ШИМ за 2 прохода счетчика. На диаграмме также показаны неинверсный и инверсный выходы ШИМ. Маленькие горизонтальные линии показывают периоды времени счета TCNTn, когда есть совпадения между OCRnx и TCNTn. Флаг прерывания OCnx будет установлен, когда происходит совпадение.

ATmega2560 TCn 16bit Phase and Frequency Correct PWM Mode fig17 9

Рис. 17-9. Диаграмма работы Phase and Frequency Correct PWM Mode.

Флаг переполнения Timer/Counter Overflow Flag (TOVn) установится в том же такте таймера, когда обновится OCRnx новым значением из буфера (в момент BOTTOM). Когда OCRnA или ICRn используются как значение TOP, флаг OCnA или ICFn установится, когда TCNTn достигнет TOP. Флаги прерывания могут использоваться для генерации прерывания каждый раз, когда счетчика достигнет значения TOP или BOTTOM.

При изменении значения TOP программа должна убедиться, что новое значение TOP больше или равно значению любого из регистров сравнения (Compare Registers). Если значение TOP меньше, чем любой из Compare Register, то событие сравнения не произойдет между TCNTn и OCRnx.

Как показано на рис. 17-9, генерируемый выход ШИМ получает симметричный сигнал для всех периодов, в отличие от Phase Correct mode. Поскольку регистры OCRnx обновляются в момент BOTTOM, длина полупериодов нарастания и спада всегда будет одинаковой. Это дает симметричные выходные импульсы, поэтому получается корректная частота.

Использование ICRn для определения TOP хорошо подходит для фиксированных значений TOP (т. е. когда TOP не меняется на лету). Когда используется ICRn, регистр OCRnA свободен для использования в генерации выходного сигнала ШИМ на выходе OCnA. Однако если частота ШИМ активно изменяется путем смены значения TOP, использование OCRnA в качестве TOP будет работать лучше, потому что у OCRnA есть двойная буферизация.

В режиме Phase and Frequency Correct PWM блоки сравнения (цифровые компараторы) позволяют генерировать импульсы ШИМ на выводах OCnx (как и в других режимах PWM). Установка битов COMnx1:0 в значение 2 даст неинверсный ШИМ, и инверсный ШИМ может генерироваться при установке COMnx1:0 в 3 (см. табл. 17-5). Действительное значение OCnx будет видимо на выходном порте только когда соответствующий разряд регистра DDR настроил эту ножку порта как выход. Сигнал ШИМ генерируется путем установки (или очистки) регистра OCnx Register при совпадении между OCRnx и TCNTn, когда счетчик считает вверх, и очистки (или установки) регистра OCnx Register при совпадении OCRnx и TCNTn, когда счетчик считает вниз. Частота ШИМ на выходе в режиме Phase and Frequency Correct PWM может быть вычислена по формуле:

                            fclk_I/O
fOCnxPFCPWM = ---------------
                         2 * N * TOP

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCRnx представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Phase and Frequency Correct PWM. Если OCRnx установлен равным BOTTOM, то на выходе будет постоянно лог. 0, и если установлен равным TOP, то на выходе будет постоянно лог. 1 (для non-inverted PWM; если работает inverted PWM, то выходные уровни меняются на противоположные). Если OCR1A используется для определения значения TOP (WGM13:0 = 9), и COM1A1:0 = 1, то выход OC1A будет переключаться со скважностью 50%.

Таймер/счетчик разработан как синхронный. Тактовый сигнал clkTn, показанный на диаграммах, является разрешающим функционирование счетчика (если такты присутствуют, работа таймера/счетчика разрешена, если такты отключены, то запрещена). На рисунках диаграмм показаны события, когда устанавливается флаги прерывания, и когда регистр OCRnx обновляется значением из своего буфера (верно только для тех режимов, где работает двойная буферизация OCRnx). На рис. 17-10 показана диаграмма времени для установки флага OCFnx.

ATmega2560 TCn 16bit Diagram Setting OCFnx no Prescaler fig17 10

Рис. 17-10. Диаграмма тактирования счетчика, установка OCFnx, прескалер отключен.

На рис. 17-11 показана та же самая диаграмма, но в этом случае включен прескалер с коэффициентом деления 8.

ATmega2560 TCn 16bit Diagram Setting OCFnx Prescaler fig17 11

Рис. 17-11. Диаграмма тактирования счетчика, установка OCFnx, прескалер включен (fclk_I/O/8).

На рис. 17-12 показана последовательность счета в различных режимах, когда значение счетчика близка к TOP. Когда используется Phase and Frequency Correct PWM mode, регистр OCRnx обновляется при достижении счетчиком BOTTOM. Диаграмма времени будет та же самая, но TOP должен быть заменен на BOTTOM, TOP-1 на BOTTOM+1 и так далее. Тот же принцип переименования справедлив и для режимов, где флаг TOVn устанавливается в BOTTOM.

ATmega2560 TCn 16bit Diagram no Prescaler fig17 12

Рис. 17-12. Диаграмма тактирования счетчика, прескалер отключен.

На рис. 17-13 показана та же самая диаграмма времени, но с включенным прескалером (деление тактовой частоты таймера на 8).

ATmega2560 TCn 16bit Diagram Prescaler fig17 13

Рис. 17-13. Диаграмма тактирования счетчика, прескалер включен (fclk_I/O/8).

TCCRnA – Timer/CounterN Control Register A

Адрес (0x80) для TCCR1A, (0x90) для TCCR3A, (0xA0) для TCCR4A, (0x120) для TCCR5A.

№ разрядов 7 6 5 4 3 2 1 0
Имена бит COMnA1 COMnA0 COMnB1 COMnB0 COMnC1 COMnC0 WGMn1 WGMn0
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:6 – COMnA1:0: Compare Match Output Mode для канала A
• 5:4 – COMnA1:0: Compare Match Output Mode для канала B
• 3:2 – COMnA1:0: Compare Match Output Mode для канала C

Эти биты управляют поведением вывода Output Compare x (OCnx). Если один или оба бита COMnx1:0 установлены, то выход OCnx переназначает нормальное поведение порта ввода/вывода, к которому привязан OCnx. Однако имейте в виду, что бит Data Direction Register (DDR), соответствующий выводу OCnx, должен быть установлен в лог. 1, чтобы заработал выходной драйвер порта.

Когда OCnx подключен к порту, функционал COMnx1:0 зависит от состояния бит WGMn3:0. В таблице 17-3 показан функционал COMnx1:0, когда биты WGMn3:0 установлены в режим Normal или CTC (режимы не-PWM).

Табл. 17-3. Compare Output Mode, non-PWM Mode.

COMnx1 COMnx0 Описание
0 0 Обычная работа порта как GPIO, функционал OCnx отключен.
0 1 Переключение OCnx в противоположное состояние при Compare Match.
1 0 Очистка OCnx при Compare Match (выходной сигнал сбрасывается в лог. 0).
1 1 Установка OCnx при Compare Match (выходной сигнал переходит в лог. 1).

В таблице 17-4 показан функционал бит COMnx1:0, когда биты WGMn3:0 установлены в Fast PWM mode.

Табл. 17-4. Compare Output Mode, Fast PWM Mode.

COMnx1 COMnx0 Описание
0 0 Обычная работа порта как GPIO, функционал OCnx отключен.
0 1 WGM13:0 = 14 или 15: переключение OC1A на Compare Match, OC1B и OC1C отключены (обычная работа порта как GPIO). Для всех других состояний WGM1: нормальная работа портов как GPIO (OC1x отключены от портов).
1 0 Очистка OCnx при Compare Match, установка при BOTTOM (не инверсный ШИМ).
1 1 Установка OCnx при Compare Match, очистка при BOTTOM (инверсный ШИМ).

Примечание: имеются специальные ситуации, когда OCRnx равен TOP, и COMnx1 установлен. В этом случае события Compare Match игнорируются, однако при BOTTOM выполняются установка или очистка.

В таблице 17-5 показан функционал бит COMnx1:0, когда биты WGMn3:0 установлены для режимов Phase Correct PWM и Phase and Frequency Correct PWM.

Табл. 17-5. Compare Output Mode, режимы Phase Correct PWM и Phase and Frequency Correct PWM.

COMnx1 COMnx0 Описание
0 0 Обычная работа порта как GPIO, функционал OCnx отключен.
0 1 WGM13 = 9 или 11: переключение OC1A при событии Compare Match, OC1B и OC1C отключены (обычная работа порта как GPIO). Для всех других установок WGM1 обычная работа порта (OCnx отключены).
1 0 Очистка OCnx на событии Compare Match при счете вверх. Установка на событии Compare Match при счете вниз.
1 1 Установка OCnx на событии Compare Match при счете вверх. Сброс на событии Compare Match при счете вниз.

Примечание: имеется специальная ситуация, когда OCRnx равен TOP, и установлен COMnx1. Подробнее см. описание режима Phase Correct PWM.

• 1:0 – WGM01:0: Waveform Generation Mode

В комбинации с битами WGMn3:2, которые находятся в регистре TCCRnB, эти биты управляют последовательностью счета, источником для максимального значения (TOP) счетчика, и типом используемой генерации сигнала, см. таблицу 17-2. Поддерживаются следующие режимы работы: Normal mode (счетчик), очистка при событии совпадения CTC mode, и три типа генерации ШИМ.

TCCRnB – Timer/CounterN Control Register B

Адрес (0x81) для TCCR1B, (0x91) для TCCR3B, (0xA1) для TCCR4B, (0x121) для TCCR5B.

№ разрядов 7 6 5 4 3 2 1 0
Имена бит ICNCn ICESn - WGMn3 WGMn2 CSn2 CSn1 CSn0
Чтение/запись rw rw r rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7 – ICNCn: Input Capture Noise Canceler

Установка этого бита в лог. 1 активирует функцию подавителя помех на входе узла захвата. Когда подавитель помех активирован, то входной сигнал на выводе захвата (Input Capture Pin, ICPn) проходит предварительную фильтрацию. Фильтр работает по простейшему алгоритму - требуется совпадение логического уровня при 4 следующих друг за другом системных такта, и только в этом случае сигнал на входе (и соответственно его изменение) считается действительным. Таким образом, при работе подавителя помех сигнал захвата запаздывает на 4 системных такта ядра.

• 6 – ICESn: Input Capture Edge Select

Выбор активного перепада для входа Input Capture Pin (ICPn), который вызовет срабатывание события захвата. Когда ICESn сброшен в 0, для события используется спад сигнала на входе ICPn, а когда установлен в 1, то нарастание сигнала на входе ICPn.

Когда сработал захват в соответствии с установкой ICESn, значение счетчика копируется в регистр захвата по входу (Input Capture Register, ICRn). При этом событии также установится Input Capture Flag (ICFn), и это может использоваться для запуска обработчика прерывания Input Capture, если оно разрешено.

Когда ICRn используется как значение TOP (см. описание битов WGMn3:0, размещенных в регистрах TCCRnA и TCCRnB), ICPn отключен и следовательно функция захвата по входу запрещена.

• 5 – резерв

Этот бит зарезервирован для будущего использования. Чтобы обеспечить совместимость с микроконтроллерами, которые возможно появятся в будущем, в этот бит должен быть записан 0, если происходит запись в регистр TCCRnB.

• 4:3 – WGMn3:2: Waveform Generation Mode

См. описание TCCRnA.

• 2:0 – CSn2:0: Clock Select

Эти 3 бита выбирают источник тактирования для таймера/счетчика, см. таблицу 17-10 и рисунок 17-11.

Табл. 17-10. Описание бит выбора тактирования для таймера.

CSn2 CSn1 CSn0 Описание
0 0 0 Нет источника для тактирования (таймер/счетчик остановлен).
0 0 1 clkI/O (прескалер отключен).
0 1 0 clkI/O/8 (работает прескалер).
0 1 1 clkI/O/64 (работает прескалер).
1 0 0 clkI/O/256 (работает прескалер).
1 0 1 clkI/O/1024 (работает прескалер).
1 1 0 Внешний источник тактов, подключенный к ножке Tn. Тактовый перепад от 1 к 0.
1 1 1 Внешний источник тактов, подключенный к ножке Tn. Тактовый перепад от 0 к 1.

Если для тактирования используется Tn, то любой активный тактовый переход уровня на ножке порта Tn будет срабатывать как тактовый, даже если ножка Tn настроена как выход и управляется программно. Это позволяет программно управлять счетом.

TCCRnC – Timer/CounterN Control Register C

Адрес (0x82) для TCCR1C, (0x92) для TCCR3C, (0xA2) для TCCR4C, (0x122) для TCCR5C.

№ разрядов 7 6 5 4 3 2 1 0
Имена бит FOCnA FOCnB FOCnC - - - - -
Чтение/запись w w w r r r r r
Нач. значение 0 0 0 0 0 0 0 0

• 7 – FOCnA: Force Output Compare для канала A
• 6 – FOCnB: Force Output Compare для канала B
• 5 – FOCnC: Force Output Compare для канала C

Биты FOCnx активны только тогда, когда биты WGMn3:0 задают режим не-PWM. Когда записывается лог. 1 в бит FOCnx, то немедленно и принудительно срабатывает событие Compare Match в модуле генерации сигнала (Waveform Generation unit). Выход OCnx поменяет свое состояние в соответствии с настройками бит COMnx1:0. Имейте в виду, что биты FOCnx реализованы как стробы. Таким образом значение бит COMnx1:0 определяет эффект от принудительного наступления события сравнения.

Строб FOCnx не будет генерировать любое прерывание, и при этом не будет очищен таймер в режиме CTC при использовании OCRnA в качестве значения TOP.

Биты FOCnx всегда читаются как 0.

• 4:0 – резерв

Эти биты зарезервированы для будущего использования. Чтобы обеспечить совместимость с микроконтроллерами, которые возможно появятся в будущем, в эти биты должен быть записан 0, если происходит запись в регистр TCCRnC.

TCNTnH и TCNTnL – Timer/CounterN Register

Адрес (0x84) для TCNT1L, (0x85) для TCNT1H, (0x94) для TCNT3L, (0x95) для TCNT3H, (0xA4) для TCNT4L, (0xA5) для TCNT4H, (0x124) для TCNT5L, (0x125) для TCNT5H

№ разрядов 7 6 5 4 3 2 1 0
Имена регистров
TCNTnH[7:0]
TCNTnL[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Это регистр 16-битного счетчика, занимающий две 8-битные ячейки пространства I/O (TCNTnH и TCNTnL, которые вместе дают TCNTn). Чтобы гарантировать, что оба байта счетчика будут прочитаны или записаны одновременно (гарантия атомарности операции), когда ядро CPU программно обращается к этим регистрам, доступ осуществляется с задействованием временного 8-разрядного регистра (TEMP). Этот регистр является общим для всех 16-битных регистров AVR. Подробнее см. [4].

Запись в TCNTn блокирует (устраняет) появление события совпадения (Compare Match) на один такт счетчика для всех цифровых компараторов счетчика. Поэтому модификация TCNTn, когда счетчик работает, приводит к риску пропуска события совпадения между регистрами TCNTn и OCRnx.

OCRnAH и OCRnAL – Output Compare Register A

Адрес (0x88) для OCR1AL, (0x89) для OCR1AH, (0x98) для OCR3AL, (0x99) для OCR3AH, (0xA8) для OCR4AL, (0xA9) для OCR4AH, (0x128) для OCR5AL, (0x129) для OCR5AH

№ разрядов 7 6 5 4 3 2 1 0
Имена регистров
OCRnAH[7:0]
OCRnAL[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

OCRnBH и OCRnBL – Output Compare Register B

Адрес (0x8A) для OCR1BL, (0x8B) для OCR1BH, (0x9A) для OCR3BL, (0x9B) для OCR3BH, (0xAA) для OCR4BL, (0xAB) для OCR4BH, (0x12A) для OCR5BL, (0x12B) для OCR5BH

№ разрядов 7 6 5 4 3 2 1 0
Имена регистров
OCRnBH[7:0]
OCRnBL[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

OCRnCH и OCRnCL – Output Compare Register C

Адрес (0x8C) для OCR1CL, (0x8D) для OCR1CH, (0x9C) для OCR3CL, (0x9D) для OCR3CH, (0xAC) для OCR4CL, (0xAD) для OCR4CH, (0x12C) для OCR5CL, (0x12D) для OCR5CH

№ разрядов 7 6 5 4 3 2 1 0
Имена регистров
OCRnCH[7:0]
OCRnCL[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Регистр сравнения содержит 16-битное значение, которое постоянно сравнивается со значением счетчика (TCNTn). Совпадение (Compare Match) может использоваться для генерации прерывания Output Compare, или для генерации сигнала на выходе OCRnx.

Регистры сравнения 16-битные, поэтому для доступа к ним должна использоваться специальная процедура атомарности (см. [4]).

ICRnH и ICRnL – Input Capture Register N

Адрес (0x86) для ICR1L, (0x87) для ICR1H, (0x96) для ICR3L, (0x97) для ICR3H, (0xA6) для ICR4L, (0xA7) для ICR4H, (0x126) для ICR5L, (0x127) для ICR5H

№ разрядов 7 6 5 4 3 2 1 0
Имена регистров
ICRnH[7:0]
ICRnL[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Регистр захвата обновляется значением счетчика (TCNTn) каждый раз, когда на выводе ICPn происходит активный перепад события захвата (или опционально для Timer/Counter1 можно в качестве события выбрать сигнал на выходе аналогового компаратора ACO). Также значение ICPn может быть выбрано для определения значения TOP счетчика.

Регистры захвата 16-битные, поэтому для доступа к ним должна использоваться специальная процедура атомарности (см. [4]).

TIMSKn – Timer/Counter Interrupt Mask Register N

Адрес (0x6F) для TIMSK1, (0x71) для TIMSK3, (0x72) для TIMSK4, (0x73) для TIMSK5

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - ICIEn - OCIEnC OCIEnB OCIEnA TOIEn
Чтение/запись r r rw r rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:6 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 5 – ICIEn: Timer/Countern, Input Capture Interrupt Enable

Когда этот бит записан в 1, и I-флаг Status Register установлен (прерывания глобально разрешены), разрешено прерывание Timer/CounterN Input Capture. Будет запущен обработчик по соответствующему вектору прерывания (Interrupt Vector, см. раздел даташита, где описаны прерывания и их вектора), когда установлен флаг ICFn, находящийся в регистре TIFRn.

• 4 – резерв

Этот бит зарезервирован и будет всегда прочитан как 0.

• 3 – OCIEnC: Timer/CounterN Output Compare Match C Interrupt Enable

Когда в бит OCIEnC записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/CounterN Compare Match C. Будет выполнен соответствующий обработчик прерывания, если для канала C таймера/счетчика N произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFRn) установлен флаг OCFnC.

• 2 – OCIEnB: Timer/CounterN Output Compare Match B Interrupt Enable

Когда в бит OCIEnB записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/CounterN Compare Match B. Будет выполнен соответствующий обработчик прерывания, если для канала B таймера/счетчика N произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFRn) установлен флаг OCFnB.

• 1 – OCIEnA: Timer/CounterN Output Compare Match A Interrupt Enable

Когда в бит OCIEnA записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/CounterN Compare Match A. Будет выполнен соответствующий обработчик прерывания, если для канала A таймера/счетчика N произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFRn) установлен флаг OCFnA.

• 0 – TOIEn: Timer/CounterN Overflow Interrupt Enable

Когда в бит TOIEn записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/CounterN Overflow. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло переполнение. Прерывание возникает, когда устанавливается бит TOVn в регистре Timer/CounterN Interrupt Flag Register (TIFRn).

TIFRn – Timer/CounterN Interrupt Flag Register

Адрес 0x16 (0x36) для TIFR1, 0x18 (0x38) для TIFR3, 0x19 (0x39) для TIFR4, 0x1A (0x3A) для TIFR5

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - ICFn - OCFnC OCFnB OCFnA TOVn
Чтение/запись r r rw r rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:6 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 5 – ICFn: Timer/CounterN, Input Capture Flag

Этот флаг устанавливается, когда происходит событие захвата на выводе ICPn (или на выходе компаратора ACO, если это Timer/Counter1). Когда регистр Input Capture Register (ICRn) установлен битами WGMn3:0 для использования в качестве значения TOP, флаг ICFn установится, когда счетчик достигнет значения TOP.

ICFn автоматически очищается, когда запускается обработчик прерывания по вектору Input Capture. Альтернативно флаг ICFn может быть очищен программно путем записи в него лог. 1.

• 4 – резерв

Этот бит зарезервирован и будет всегда прочитан как 0.

• 3 – OCFnC: Timer/CounterN, Output Compare C Match Flag

Этот флаг устанавливается в цикле такта таймера после того, как значение счетчика таймера (TCNTn) совпадет с Output Compare Register C (OCRnC).

Имейте в виду, что строб Forced Output Compare (FOCnC) не устанавливает флаг OCFnC.

OCFnC автоматически очищается, когда запускается обработчик прерывания Output Compare Match C. Альтернативно флаг OCFnC может быть очищен записью лог. 1 в этот бит.

• 2 – OCFnB: Timer/CounterN, Output Compare B Match Flag

Этот флаг устанавливается в цикле такта таймера после того, как значение счетчика таймера (TCNTn) совпадет с Output Compare Register B (OCRnB).

Имейте в виду, что строб Forced Output Compare (FOCnB) не устанавливает флаг OCFnB.

OCFnB автоматически очищается, когда запускается обработчик прерывания Output Compare Match B. Альтернативно флаг OCFnB может быть очищен записью лог. 1 в этот бит.

• 1 – OCFnA: Timer/CounterN, Output Compare A Match Flag

Этот флаг устанавливается в цикле такта таймера после того, как значение счетчика таймера (TCNTn) совпадет с Output Compare Register A (OCRnA).

Имейте в виду, что строб Forced Output Compare (FOCnA) не устанавливает флаг OCFnA.

OCFnB автоматически очищается, когда запускается обработчик прерывания Output Compare Match A. Альтернативно флаг OCFnA может быть очищен записью лог. 1 в этот бит.

• 0 – TOVn: Timer/CounterN Overflow Flag

Установка этого флага зависит от настройки битами WGMn3:0. В режимах Normal и CTC флаг TOVn устанавливается, когда произошло переполнение в Timer/Countern. Обратитесь к таблице 17-2 для получения информации о поведении флага TOVn, когда используется другая настройка битов WGMn3:0.

TOVn очищается аппаратно и автоматически, когда выполняется обработчик прерывания Timer/Countern Overflow. Альтернативно TOVn может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит TOIEn (Timer/CounterN Overflow Interrupt Enable), и установился бит TOVn, выполнится обработчик прерывания Timer/CounterN Overflow.

Этот простой пример настроит светодиод порта 13 платы Arduino Mega 2560 на мигание с частотой 10 Гц (микроконтроллер работает на частоте 16 МГц).

//Пример настройки таймера/счетчика 5 ATmega2560 в режим CTC для статьи 
// "Таймеры-счетчики ATmega2560"
#include < avr/io.h >
#include < avr/interrupt.h >  /* для sei(), ISR */
 
static void SetupTimer5 (void)
{
   //Предположим, что мы хотим настроить частоту срабатывания обработчика
   // TIMER5_COMPA_vect равной 10 Гц. Следовательно, счетчик должен досчитать
   // до значения OCR5A за время 0.1 сек. На частоте 16 МГц пройдет следующее
   // количество тиков таймера за 0.1 сек:
   // 0.1/(1/16000000) = 1600000 (без прескалера)
   // 0.1/(1/16000000)/8 = 200000 (прескалер настроен на коэффициент деления 8)
   // 0.1/(1/16000000)/64 = 25000 (прескалер настроен на коэффициент деления 64)
   // 0.1/(1/16000000)/256 = 6250 (прескалер настроен на коэффициент деления 256)
   // 0.1/(1/16000000)/1024 = 1562.5 (прескалер настроен на коэффициент деления 1024)
   //Следовательно, подойдут коэффициенты деления прескалера 64, 256, 1024. Выберем
   // коэффициент деления прескалера 64:
   TCCR5B = (1 << CS51)|(1 << CS50);
   OCR5A = 25000; //на этом значении счетчика он будет автоматически очищаться (CTC)
   //Настройка таймера 5 в режим CTC (см. таблицу 17-2 в статье):
   TCCR5A = 0;             //сброс битов WGM21, WGM20
   TCCR5B |= (1 << WGM22);   //установка бита WGM22, бит WGM23 сброшен.
   //Разрешить прерывание для TIMER5_COMPA_vect:
   TIMSK5 = (1 << OCIE5A);
}
 
ISR(TIMER5_COMPA_vect)
{   if (PORTB & (1 << PB7))
   {
      PORTB &= ~(1 << PB7);
   }
   else
   {
      PORTB |= (1 << PB7);
   }
}
 
int main(void)
{
   DDRB |= (1 << PB7);
   SetupTimer5();
   sei();
   while(1)
   {
      
   }
}

[Предделитель (Prescaler) таймеров/счетчиков 0, 1, 3, 4, 5]

Таймеры/счетчики 0, 1, 3, 4 и 5 используют один и тот же модуль прескалера, однако каждый таймер/счетчик может иметь собственные, индивидуальные настройки прескалера. Ниже приведено описание, относящееся ко всем таймерам счетчикам 0, 1, 3, 4, 5. Как обычно, Tn используется как общее имя, где n надо заменить на одну из цифр 0, 1, 3, 4 или 5.

Внутренний источник тактов. Таймер/счетчик может получать такты напрямую от системной тактовой частоты (это частота, на которой работает ядро CPU) путем установки CSn2:0 = 1 (прескалер отключен). Это дает самую быструю работу счетчика, таймер/счетчик получает максимальную частоту тактирования, равную системной тактовой частоте (fCLK_I/O). Альтернативно для тактирования счетчика может быть выбран один из выходов прескалера (один из вариантов частоты тактирования: fCLK_I/O/8, fCLK_I/O/64, fCLK_I/O/256, or fCLK_I/O/1024.

Сброс прескалера. Прескалер работает постоянно, так что он независим от логики выбора тактов таймера/счетчика, и один прескалер является общим для Tn таймеров/счетчиков. Поскольку прескалер один, и на него не влияют индивидуальные настройки для каждого таймера/счетчика, то бывают неявные ситуации связанного выходного результата таймеров, когда для них используется прескалер. Один из примеров - артефакты деления частоты, когда таймер разрешен и тактируется от прескалера (6 > CSn2:0 > 1). Количество тактов системной частоты от момента, когда таймер разрешен, может быть от 1 до N+1 системных тактов, где N равно коэффициенту деления прескалера (8, 64, 256, or 1024).

Можно сбросить прескалер для синхронизации таймера/счетчика с ходом выполнения программы. Однако следует быть осторожным, если другие таймеры/счетчики также используют коэффициент деления прескалера. Сброс прескалера повлияет на период тактовой частоты всех таймеров/счетчиков, которые подключены к выходам прескалера.

Внешний источник тактов. Внешняя тактовая частота, поданная на вывод Tn, может использоваться как такты для таймера/счетчика (clkTn). Уровень на выводе Tn оценивается каждый системный такт логикой синхронизации GPIO. Затем синхронизированный сигнал (выборка) проходит через детектор перепада (Edge Detector). На рис. 18-1 показана функциональная блок-диаграмма синхронизации Tn и логики детектора перепада. Регистры тактируются положительным перепадом внутренней системной тактовой частоты (clkI/O). Защелка прозрачна для лог. 1 внутренней системной частоты.

Детектор перепада генерирует один импульс clkTn для каждого положительного (CSn2:0 = 7) или отрицательного перепада (CSn2:0 = 6).

ATmega2560 Tn T0 Pin Sampling fig18 1

Рис. 18-1. Как работает выборка Tn/T0.

Блок синхронизации и логика детектора перепада вводят задержку от 2.5 до 3.5 периодов системной тактовой частоты от активного перепада, приложенного к выводу Tn, до момента обновления счетчика.

Разрешение и запрет тактового входа должен быть выполнен, когда Tn стабилен для как минимум одного периода тактовой частоты, иначе есть риск генерирования неправильного импульса тактов для таймера/счетчика.

Каждый полупериод внешней тактовой частоты должен быть больше, чем один период системной тактовой частоты, чтобы гарантировать корректную выборку внешних тактов. Внешняя тактовая частота должна быть гарантированно меньше чем половина системной тактовой частоты (fExtClk < fclk_I/O/2), и со скважностью 50/50%. Поскольку детектор перепада использует выборку сигнала, максимальная частота внешней тактовой частоты, которую можно детектировать, должна быть вполовину меньше частоты выборки (согласно теореме выборок Найквиста). Однако из-за вариации допуска системной тактовой частоты и скважности татов источника (кварц, керамический резонатор, RC-генератор), рекомендуется максимальную частоту внешнего сигнала выбрать меньше fclk_I/O/2.5.

Для внешней тактовой частоты прескалер использовать нельзя.

ATmega2560 Prescaler for synchronous Timer Counters fig18 2

Рис. 18-2. Прескалер для синхронизации таймеров/счетчиков.

GTCCR – General Timer/Counter Control Register

Адрес 0x23 (0x43)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит TSM - - - - - PSRASY PSRSYNC
Чтение/запись rw r r r r r rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 6:2 – резерв

• 7 – TSM: Timer/Counter Synchronization Mode

Запись в бит TSM лог. 1 активизирует режим синхронизации таймера/счетчика (Timer/Counter Synchronization mode). В этом режиме значение, записанное в биты PSRASY и PSRSYNC, сохраняется, в следствие чего выставляются соответствующие сигналы сброса прескалера. Чтобы гарантировать, что соответствующие таймеры/счетчики будут приостановлены и могут быть сконфигурированы той же величиной без риска, что один из них изменится во время конфигурирования. Когда бит TSM записан в лог. 0, биты PSRASY и PSRSYNC аппаратно сбрасываются, и таймеры/счетчики начинают счет одновременно.

• Bit 0 – PSRSYNC: Prescaler Reset for Synchronous Timer/Counters

Когда этот бит лог. 1, то прескалер для Timer/Counter0, Timer/Counter1, Timer/Counter3, Timer/Counter4 и Timer/Counter5 будет сброшен. Этот бит нормально немедленно очищается аппаратно, за исключением случая, когда установлен бит TSM. Помните, что Timer/Counter0, Timer/Counter1, Timer/Counter3, Timer/Counter4 и Timer/Counter5 используют один и тот же прескалер (если тактирование этих таймеров/счетчиков настроено от одного из выходов прескалера), и сброс прескалера повлияет на все таймеры.

[Output Compare Modulator (OCM1C0A)]

Output Compare Modulator (OCM) позволяет генерировать сигналы, модулированные с несущей частотой. Модулятор использует выходы Output Compare Unit C от 16-разрядного Timer/Counter1 и выходы Output Compare Unit от 8-разрядного Timer/Counter0.

ATmega2560 TCn Output Compare Modulator fig19 1

Рис. 19-1. Блок-диаграмма Output Compare Modulator.

Когда модулятор разрешен, два выходные канала сравнения вместе модулируют сигнал, как это показано на рис. 19-1.

Узел Output Compare 1C и Output Compare 0 используют совместно ножку порта PB7 для выхода. Выходы узлов Output Compare (OC1C и OC0A) переназначают обычное поведение бита PORTB7, когда один из них разрешен (т. е. когда соответствующие биты COMnx1:0 не равны 0). Когда оба OC1C и OC0A разрешены одновременно, то автоматически разрешается работа модулятора.

Функциональная эквивалентная схема модулятора показана на рис. 19-2. Схема включает часть блоков таймера/счетчика и схему выходного драйвера разряда 7 порта B.

ATmega2560 TCn Output Compare Modulator Schematic fig19 2

Рис. 19-2. Схема Output Compare Modulator.

Когда модулятор разрешен, тип модуляции (логическое AND или OR) может быть выбран битом PORTB7. Имейте в виду, что бит DDRB7 управляет направлением работы порта PB7 (вход это, или выход) независимо от настроек бит COMnx1:0.

Пример диаграммы времени модулятора. На рис. 19-3 иллюстрируется работа модулятора. В этом примере Timer/Counter1 установлен в режим работы Fast PWM mode (без инверсии), и Timer/Counter0 использует режим CTC с переключением при сравнении (Compare Output mode, COM0A1:0 = 1).

ATmega2560 TCn Output Compare Modulator Timing Diagram fig19 3

Рис. 19-3. Диаграмма сигналов Output Compare Modulator.

В этом примере Timer/Counter0 предоставляет несущую, которая модулируется сигналом, генерируемым узло Output Compare C Timer/Counter1.

Разрешающая способность сигнала ШИМ (OC1C) уменьшена модуляцией. Фактор уменьшения равен числу системных циклов одного периода несущей (OC0A). В этом примере разрешающая способность уменьшена по фактору 2. Причина уменьшения показана на рис. 19-3 на 2 и 3 периоде выхода PB7, когда PORTB7 равен 0. Период 2 с высоким уровнем на один цикл длиннее чем время высокого уровня периода 3, но результат выхода PB7 эквивалентен для обоих периодов.

[Timer/Counter2: 8-битный таймер/счетчик]

Этот счетчик рассматривается в отдельном разделе, и не случайно. Он не только может использоваться для генерации ШИМ, как другие таймеры, он еще имеет уникальную возможность внешнего асинхронного тактирования. Т. е. таймер/счетчик может работать не синхронно с системной тактовой частотой. Этот одноканальный, 8-разрядный счетчик общего назначения имеет следующие основные возможности:

• Один канал счета.
• Очистка таймера при событии совпадения, автоперезагрузка (Clear Timer on Compare Match, Auto Reload).
• Широтно-импульсный модулятор с точным, без скачков, изменением фазы выходных импульсов - Phase Correct Pulse Width Modulator (PWM).
• Генератор частоты.
• 10-разрядный предделитель тактовой частоты (Clock Prescaler).
• Прерывания по переполнению и событию совпадения (Overflow, Compare Match, биты TOV2, OCF2A and OCF2B).
• Позволяет применить внешний кварцевый резонатор на 32 кГц, что дает возможность независимого, асинхронного тактирования для организации часов реального времени.

Упрощенная внутренняя диаграмма 8-разрядного Timer/Counter2 показана на рис. 20-1. Регистры I/O, включая биты I/O и выводы I/O, доступные для программного доступа со стороны CPU, показаны жирным шрифтом.

ATmega2560 TC2 8bit Block Diagram fig20 1

Рис. 20-1. Блок-диаграмма внутреннего устройства Timer/Counter2.

Ниже показана привязка ножек микроконтроллера к таймеру.

ATmega2560 TC2 pins

Для разрешения работы модуля Timer/Counter2 нужно записать в 0 бит снижения энергопотребления Power Reduction Timer/Counter2, PRTIM2 в регистре PRR0 – Power Reduction Register 0.

Счетчик (TCNT2) и регистры сравнения (Output Compare Register, OCR2A и OCR2B) 8-разрядные. Сигналы запроса прерывания отображаются в регистре флагов прерываний (Timer Interrupt Flag Register, TIFR2). Все прерывания могут быть индивидуально маскированы (т. е. запрещены или разрешены) с помощью регистра Timer Interrupt Mask Register (TIMSK2). Регистры TIFR2 и TIMSK2 не показаны на рис. 20-1.

Таймер/счетчик может тактироваться от внутренней тактовой частоты, через предделитель (Prescaler), или асинхронно от выводов TOSC1 и TOSC2, как будет подробнее рассмотрено далее. Асинхронная работа управляется через Asynchronous Status Register (ASSR). Блок выбора тактов управляет, какой источник будет использоваться для инкремента (или декремента) таймера счетчика. Таймер/счетчик не активен, если для него не выбран тактовый сигнал. Выход от логики выбора тактов помечен на рисунке как тактовая частота таймера clkT2.

Регистры сравнения (OCR2A и OCR2B), которые имеют двойную буферизацию, постоянно сравниваются с содержимым таймера/счетчика TCNT2. Результат сравнения может быть использован для генератора сигналов (Waveform Generator), чтобы генерировать ШИМ или переменную частоту на выводах Output Compare (OC2A и OC2B). Событие совпадения (Compare Match event) также установит флаг совпадения (Compare Flag, OCF2A или OCF2B), который может использоваться для генерации запроса на прерывание Output Compare.

Таймер/счетчик 2 может тактироваться от внутреннего синхронного с системными тактами источника тактов, и также может тактироваться от внешнего асинхронного источника тактов. Тактовый сигнал clkT2 по умолчанию равен тактовой частоте ядра микроконтроллера, clkI/O. Когда бит AS2 в регистре ASSR записан в лог. 1, тактовый сигнал приходит от генератора, который подключен к выводам TOSC1 и TOSC2. Подробнее асинхронная работа счетчика описана далее в секции "Работа асинхронного Timer/Counter2".

Блок счета. Это основной программируемый узел Timer/Counter2, который может считать в прямом (инкремент) и обратном (декремент) направлениях.

ATmega2560 TC2 Counter Unit fig20 2

Рис. 20-2. Диаграмма внутреннего устройства блока счета.

Пояснения к сигналам на диаграмме: Count - сигнал, импульсы которого считает счетчик (с каждым тактовым перепадом значение регистра счетчика TCNT2 увеличивается или уменьшается, в зависимости от выбранного направления счета). Direction - выбор направления счета. Clear - сигнал сброса в 0 содержимого TCNT2 (все биты этого регистра становятся равными 0). clkT2 - тактовый сигнал, который поступает с блока выбора тактов. TOP - сигнализирует, что счетчик достиг максимального значения. BOTTOM - сигнализирует, что счетчик достиг минимального значения.

BOTTOM. Это нижнее (минимальное) значение счетчика, 0x00 для 8-разрядных таймеров.

MAX. Это максимальное значение счетчика, 0xFF для 8-разрядных таймеров (десятичное число 255).

TOP. Это установленное предельное верхнее значение для счетчика. Оно может быть установлено равным MAX, либо установлено значением специального регистра (к примеру, для Timer2 это регистр OCR2A). Назначение зависит от режима работы счетчика.

В зависимости от выбранного режима работы счетчик очищается, инкрементируется или декрементируется по каждому тактовому перепаду clkT2. Сигнал clkT2 может быть сгенерирован из внешнего или внутреннего источника тактов, в зависимости от значения бит CS22:0. Когда не выбран ни один из источников тактирования (CS22:0 == 0), то таймер остановлен. Однако к значению TCNT2 есть доступ со стороны CPU, независимо от того, генерируется clkT2, или нет. Операция записи со стороны CPU имеет приоритет перед всеми другими операциями над содержимым счетчика (очистка или счет могут быть отменены операцией записи).

Последовательность счета задается битами WGM21 и WGM20, расположенными в регистре TCCR2A (Timer/Counter Control Register), и WGM22, расположенным в регистре TCCR2B. Имеется прямая зависимость между тем, как считает счетчик, и тем, как будет формироваться сигнал на выходах OC2A и OC2B.

Флаг переполнения счетчика TOV2 (Timer/Counter Overflow Flag) устанавливается в зависимости от режима работы, выбранного битами WGM22:0. Установка флага TOV2 может использоваться для генерации прерывания.

Режимы работы определяют как поведение таймера/счетчика, так и поведение выходных выводов Output Compare, как это задано комбинацией настроечных бит Waveform Generation mode (WGM22:0) и Compare Output mode (COM2x1:0). Биты COM2x1:0 не влияют на последовательность счета, в то время как WGM22:0 влияют. Биты COM2x1:0 определяют, как будет генерироваться сигнал ШИМ - инвертированный или нет (inverted PWM или non-inverted PWM). В не-PWM режимах биты COM2x1:0 определяют, должен ли быть выход установлен, сброшен или переключен в противоположное состояние, когда наступило событие Compare Match.

[Нормальный режим (Normal mode)]

Это самый простой режим, когда WGM22:0 = 0. В этом режиме направление счета всегда прямое (инкремент), и не выполняется очистка счетчика. Счетчик просто переваливает за верхнюю границу счета MAX (0xFF), и снова начинает счет с нулевого значения (0x00). В нормальном режиме будет установлен флаг переполнения Timer/Counter Overflow Flag (TOV2) в том же самом такте таймера, когда TCNT2 обнуляется. Таким образом, бит TOV2 ведет себя как 9-й бит счетчика, за исключением того, что он всегда устанавливается и сам не очищается. Однако в комбинации с прерыванием переполнения таймера (timer overflow interrupt) флаг TOV2 автоматически очищается, и разрядность счетчика может быть увеличена уже программно. Новое значение счетчика может быть записано программно в TCNT2 в любой момент времени.

Output Compare Unit может использоваться для генерации прерываний в определенные моменты времени. Использование Output Compare для генерации сигналов в режиме Normal не рекомендуется, потому что будет слишком много расходоваться времени CPU.

[Режим очистки при совпадении (CTC mode)]

В режиме Clear Timer on Compare или CTC mode (WGM22:0 = 2) регистр OCR2A используется для управления разрешающей способностью счетчика. Счетчик автоматически сбрасывается в 0, когда значение счетчика TCNT2 совпадет с OCR2A. Поэтому OCR2A определяет верхний предел, до которого работает счетчик, что влияет на его разрешение. Этот режим дает большие возможности по управлению выходной частотой Compare Match. Это также упрощает алгоритм подсчета внешних событий.

Диаграмма времени CTC mode показана на рис. 20-3. Значение счетчика (TCNT2) увеличивается до тех пор, пока не произойдет событие Compare Match между TCNT2 и OCR2A, и тогда TCNT2 очищается.

ATmega2560 TC2 CTC Mode Timing Diagram fig20 3

Рис. 20-3. Диаграмма работы режима CTC.

Каждый раз, когда значение счетчика достигает значения TOP, может быть сгенерировано прерывание по флагу OCF2A. Если прерывание разрешено, то обработчик прерывания может использоваться для обновления значения TOP. Однако изменение значения TOP так, что оно станет близким к BOTTOM, когда счетчик работает без прескалера или с малым коэффициентом деления, должно делаться с осторожностью, потому что CTC mode не имеет двойной буферизации. Если новое записанное в регистр OCR2A значение будет меньше, чем текущее значение TCNT2, то счетчик пропустит событие Compare Match, и счетчик будет считать до значения MAX (0xFF), затем перевалит в 0x00, и только после этого может возникнуть очередное событие Compare Match.

Для генерации импульсов определенной частоты в CTC mode выход OC2A может быть установлен на переключение логического уровня на каждом Compare Match путем установки бито Compare Output mode в режим переключения (toggle mode, COM2A1:0 = 1). Значение OC2A не появится на выходной ножке порта, пока регистр DDR не будет настроен соответствующим образом (чтобы нужный вывод порта работал как выход). Максимальная частота получаемых импульсов fOC2A = fclk_I/O/2, когда OCR2A установлен в 0 (0x00). Общая формула для определения выходной частоты:

                        fclk_I/O
fOC2x = --------------------------
              2 * N * (1 + OCR2x)

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Точно так же, как и в Normal mode, флаг TOV2 устанавливается в том же такте таймера, когда счетчик переваливает от MAX до 0x00.

[Быстрый ШИМ (Fast PWM Mode)]

Этот режим предоставляет возможность генерации ШИМ на высокой частоте (WGM22:0 = 3 или 7). Режим Fast PWM отличается от других режимов PWM тем, что период ШИМ формируется за один проход счетчика. Счетчик считает от BOTTOM до TOP, затем начинает считать заново от BOTTOM. TOP определен как 0xFF при WGM2:0 = 3, и как значение OCR2A при WGM2:0 = 7. Поскольку полный цикл переключения выхода осуществляется за один проход счетчика, то рабочая частота Fast PWM может быть в 2 раза выше, чем в Phase Correct PWM mode, когда используется цикл ШИМ в 2 проходах счетчика. Высокая частота делает Fast PWM хорошо подходящим для управления источником питания, выпрямителем, и в приложениях DAC (ЦАП, цифро-аналоговый преобразователь). Высокая частота позволяет упростить схему фильтра ШИМ, использовать для фильтра внешние детали меньшего размера (это относится к дросселям и конденсаторам), что также снижает общую стоимость системы.

В Fast PWM mode счетчик инкрементируется, пока его значение не достигнет значения TOP. Затем счетчик очищается на следующем тактовом цикле таймера. Диаграмма времени для Fast PWM mode показана на рис. 20-4. Значение TCNT2 на этой диаграмме показано как гистограмма для иллюстрации работы ШИМ по одному циклу. На диаграмме показаны не-инвертируемые (non-inverted) и инвертируемые (inverted) выходы ШИМ. Маленькие горизонтальные линии помечают циклы TCNT2, представляющие события Compare Match между OCR2x и TCNT2.

ATmega2560 TC2 Fast PWM Mode Timing Diagram fig20 4

Рис. 20-4. Диаграмма работы Fast PWM mode.

Флаг переполнения Timer/Counter Overflow (TOV2) устанавливается каждый раз, когда счетчик достигает TOP. Если разрешено прерывание, для обновления величины сравнения может быть использован обработчик прерывания.

В режиме Fast PWM блок сравнения позволяет генерировать сигналы с помощью ШИМ на выводах портов OC2x. Установка битов COM2x1:0 в 2 будет производить неинверсный ШИМ, и выход инверсного ШИМ может быть сгенерирован установкой битов COM2x1:0 в значение 3. Действительное значение OC2x будет отображаться на выходном порте, если он настроен как выход с помощью соответствующего разряда регистра DDR. Сигнал ШИМ генерируется путем установки (или очистки) регистра OC2x при событиях Compare Match между OC2x и TCNT2, и очистки (или установки) регистра OC2x на тактовом цикле таймера при очистке счетчика (когда его значение переходит от TOP к BOTTOM). Частота выходных импульсов ШИМ может быть вычислена по следующей формуле:

                    fclk_I/O
fOC2xPWM = -----------
                    N * 256

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCR2A представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Fast PWM. Если OCR2A установлен равным BOTTOM, то выходной сигнал будет выглядеть как короткие иголки для каждого MAX+1 цикла таймера. Установка OCR2A равным MAX приведет к постоянному выходному уровню лог. 1 или лог. 0 (в зависимости от установленной полярности выхода, которая устанавливается битами COM2A1:0).

Частота (прямоугольный сигнал со скважностью 50%, т. е. длительность 0 равна длительности 1) на выходе в Fast PWM mode может быть получена путем установки OC2x на переключение логического уровня при каждом событии Compare Match (COM2x1:0 = 1). В этом случае максимальная частота получится fOC2 = fclk_I/O/2, когда OCR2A установлен в 0. Эта функция аналогична переключению OC2A в режиме CTC, за исключением того, что в Fast PWM mode разрешена двойная буферизация узла Output Compare.

[Режим корректной фазы ШИМ (Phase Correct PWM Mode)]

Phase Correct PWM mode (WGM22:0 = 1 или 5) предоставляет для генерации сигналов высокоточный ШИМ, когда при регулировке выхода сохраняется корректность фазы. Этот режим основан на двойном проходе счетчика по одному периоду ШИМ. Счетчик постоянно считает от BOTTOM до TOP, и затем считает от TOP к BOTTOM, формируя один полный период фазы ШИМ. Граница счета TOP определена как 0xFF при WGM22:0 = 1, и как OCR2A при WGM22:0 = 5. В неинверирующем режиме (non-inverting Compare Output mode), выход (Output Compare, OC2x) очищается при совпадении (Compare Match) между TCNT2 и OCR2x во время счета вверх, и устанавливается при совпадении (Compare Match) во время счета вниз. В инверсном режиме (inverting Output Compare mode), все работает аналогично, но выходной сигнал инвертируется. Двойной проход для одного периода ШИМ имеет в 2 раза меньше выходную рабочую частоту ШИМ по сравнению с режимом, когда счетчик формирует период ШИМ за 1 проход. Однако симметрия при формировании ШИМ, когда счетчик работает в 2 прохода, позволяет осуществить точное регулирование, что желательно для приложений регулирования двигателей.

В Phase Correct PWM mode счетчик инкрементируется, пока его значение не достигнет TOP, при этом формируется первая часть периода ШИМ. Когда счетчик достиг TOP, он меняет направление счета, и начинается формирование второй части периода ШИМ. Значение TCNT2 будет равно TOP в течение одного тактового цикла таймера. Диаграмма времени работы Phase Correct PWM mode показана на рис. 20-5. Значение TCNT2 на диаграмме показано в виде гистограммы, иллюстрирующей работу счетчика за 2 прохода. На диаграмме показаны не инвертирующий и инвертирующий выходы ШИМ. Маленькие горизонтальные линии помечают циклы TCNT2, представляющие события Compare Match между OCR2x и TCNT2.

ATmega2560 TC2 Phase Correct PWM Mode Timing Diagram fig20 5

Рис. 20-5. Диаграмма работы Phase Correct PWM Mode.

Флаг переполнения Timer/Counter Overflow (TOV2) устанавливается каждый раз, когда счетчик достигает BOTTOM. Флаг прерывания может использоваться для генерации прерывания каждый раз, когда счетчик достигает значения BOTTOM. Сравните с Fast PWM mode: там флаг TOV2 устанавливается, когда счетчик достигает значения TOP.

В Phase Correct PWM mode узел сравнения позволяет генерировать сигналы с помощью ШИМ на выводах OC2x. Установка COM2x1:0 в значение 2 даст неинверсный ШИМ (non-inverted PWM). Инверсный ШИМ генерируется установкой COM2x1:0 в значение 3. Действительное значение OC2x будет отображаться на выходном порте, если он настроен как выход с помощью соответствующего разряда регистра DDR. Сигнал ШИМ генерируется путем очистки (или установки) регистра OC2x при событиях Compare Match между OCR2x и TCNT2 когда счетчик считает вверх, и установки (или очистки) регистра OC2x на событии Compare Match между OCR2x и TCNT2 когда счетчик считает вниз. Частота выходных импульсов ШИМ может быть вычислена по следующей формуле:

                        fclk_I/O
fOC2xPCPWM = -----------
                        N * 510

Здесь N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).

Предельные значения для регистра OCR2A представляют специальные случаи, когда генерация выходных сигналов происходит в режиме Phase Correct PWM. Если OCR2A установлен равным BOTTOM, то на выходе будет постоянно лог. 0, и если установлен равным MAX, то на выходе будет постоянно лог. 1 (для non-inverted PWM; если работает inverted PWM, то выходные уровни меняются на противоположные).

В самом начале периода 2 на рис. 20-5 сигнал OC2x переходит от лог. 1 к лог. 0, даже если здесь нет события Compare Match. Точка этого перехода гарантирует симметрию сигнала относительно BOTTOM. Имеется 2 случая, когда происходит переход без события Compare Match:

• OCR2A меняет свое значение от MAX, как на рис. 20-5. Когда значение OCR2A равно MAX, тогда значение вывода OC2 то же самое, как получается в результате счета вниз при событии Compare Match. Чтобы гарантировать симметрию сигнала относительно BOTTOM, значение OC2 при MAX должно соответствовать результату счета вверх при Compare Match.
• Таймер начинает считать от значения, которое больше чем значение в OCR2A, и по этой причине пропускается событие Compare Match, и следовательно пропускается изменение OC2, которое произошло бы на этом пути.

Блок сравнения. Это 8-разрядный компаратор (Output Compare Unit), который постоянно сравнивает содержимое TCNT2 с содержимым регистров OCR2A и OCR2B. Всякий раз, когда TCNT2 равен OCR2A или OCR2B, компаратор сигнализирует о совпадении. Событие совпадения установит флаг OCF2A или OCF2B (Output Compare Flag) в следующем тактовом цикле. Если разрешено соответствующее прерывание, то Output Compare Flag генерирует прерывание Output Compare. Output Compare Flag автоматически очищается, когда запускается обработчик прерывания. Альтернативно флаг может быть очищен программно путем записи лог. 1 в место размещения бита. Генератор сигналов (Waveform Generator) использует сигнал совпадения для генерации выхода в соответствии с режимом, установленным битами WGM22:0 (Waveform Generation mode) и COM2x1:0 (Compare Output mode, здесь x соответствует A или B). Сигналы MAX и BOTTOM используются генератором сигналов для обработки специальных ситуаций в некоторых режимах.

ATmega2560 TC2 Output Compare Unit Block Diagram fig20 6

Рис. 20-6. Блок-схема Output Compare Unit.

Регистры OCR2A и OCR2B имеют двойную буферизацию, когда они работают в режимах PWM (Pulse Width Modulation, Широтно-Импульсная Модуляция, ШИМ). Для обычного режима (Normal mode) и режима очистки при сравнении (Clear Timer on Compare, CTC) двойная буферизация запрещена. Двойная буферизация синхронизирует обновление регистров сравнения OCR2A и OCR2B в моменты достижения верхней или нижней границ счета. Синхронизация защищает от появления импульсов ШИМ нечетной длины (с асимметрией), таким образом выходной сигнал ШИМ получается чистый, без провалов и сбоев.

Может показаться, что доступ к регистрам OCR2x сложен, но это не так. Двойная буферизация работает прозрачно - и когда оно разрешено, и когда отключено. Когда буферизация работает, то ядро CPU получает доступ к OCR2x через аппаратный буфер, а когда отключено, то напрямую.

Force Output Compare. В не-PWM режимах событие совпадения может быть сгенерировано принудительно путем записи лог. 1 в бит FOC2x (Force Output Compare). Принудительно сгенерированное событие не установит флаг OC2x, не будут произведены сброс/перезагрузка счетчика, однако выходное состояние ножки порта OC2x обновится, как если бы произошло реальное событие Compare Match (обновление произойдет в соответствии с настройками бит COM2x1:0, независимо от того, установлен ли лог. уровень выхода OC2x, сброшен или переключен в противоположное состояние).

Блокировка события сравнения записью в TCNT2. Все операции записи регистра TCNT2 со стороны ядра CPU заблокируют любое событие Compare Match, которое возникло бы в следующем такте таймера, даже когда таймер остановлен. Эта возможность позволяет инициализировать OCR2x тем же самым значением, как и TCNT2, без срабатывания прерывания, когда тактирование таймера/счетчика разрешено.

Использование блока сравнения. Поскольку запись TCNT2 в любом режиме запретит все события совпадения Compare Match на 1 такт таймера, есть риск при изменении TCNT2 при использовании блока сравнения, независимо от того, работает таймер/счетчик или нет. Если записываемое в TCNT2 значение равно OCR2x, то событие Compare Match будет потеряно, в результате чего может быть неправильно сгенерирован выходной сигнал. Наподобие не записывайте в TCNT2 значение, равное BOTTOM, когда счетчик считает вниз.

Настройка OC2x должна быть выполнена перед установкой регистра направления работы порта (Data Direction Register, DDR), чтобы ножка порта работала как выход. Самый простой путь установки состояния порта OC2x - использовать биты стробирования Force Output Compare (FOC2x) в нормальном (Normal) режиме работы таймера/счетчика. Регистры OC2x сохраняют свои значения даже когда изменяются режимы работы генератора сигналов.

Имейте в виду, что биты COM2x1:0 не имеют двойной буферизации, как это сделано для величин сравнения. Поэтому изменения битов COM2x1:0 приводят к немедленному результату.

Блок выходного сигнала сравнения (Compare Match Output Unit). Биты управления режимом выхода сравнения (Compare Output mode, COM2x1:0) имеют 2 функции. Генератор сигналов использует COM2x1:0 для определения состояния выхода OC2x при следующем событии Compare Match. Также COM2x1:0 управляют источником выхода для выводов OC2x. На рис. 20-7 показана упрощенная схема логики, на которую влияет управление установкой бит COM2x1:0. Регистры I/O, биты I/O и выводы I/O показаны на картинке жирным шрифтом. Показаны только те регистры портов GPIO (DDR и PORT), на которые влияют биты COM2x1:0. Когда ссылаются на состояние OC2x, то нужно смотреть на внутренний регистр OC2x, не вывод OC2x.

ATmega2560 TC2 Compare Match Output fig20 7

Рис. 20-7. Схема вывода блока сравнения (Compare Match Output Unit).

Обычные функции порта ввода/вывода GPIO переназначаются Output Compare (OC2x) из генератора сигналов, если установлен любой из битов COM2x1:0. Однако направление работы порта вывода OC2x (т. е. вход это или выход) все еще зависит от регистра DDR для нужной ножки порта. Таким образом, соответствующий бит регистра DDR для нужного вывода OC2x (DDR_OC2x) должен быть установлен до того, как значение OC2x будет видимо на этом порте. Функция переназначения порта не зависит от режима работы генератора сигналов.

Дизайн логики Output Compare позволяет инициализировать состояние OC2x до разрешения работы выхода. Имейте в виду, что некоторые комбинации бит COM2x1:0 зарезервированы для определенных режимов работы.

Режимы сравнения и генерация сигналов. Генератор сигналов (Waveform Generator) по-разному использует биты COM2x1:0 для режимов Normal, CTC и PWM. Для всех режимов COM2x1:0 = 0 говорит для Waveform Generator, что при следующем событии Compare Match не должно быть никаких действий с регистром OC2x. Для выходных действий в режимах не-PWM, Fast PWM, Phase Correct PWM см. соответствующие таблицы 20-5, 20-6, 20-7.

Изменение состояния битов COM2x1:0 даст эффект на первом событии Compare Match после того, как биты были записаны. Для режимов не-PWM действие может быть реализовано немедленно с использованием битов стробирования FOC2x.

На следующих рисунка показана работа таймер/счетчик разработан как синхронный. Тактовый сигнал clkT2, показанный на диаграммах, является разрешающим функционирование счетчика (если такты присутствуют, работа таймера/счетчика разрешена, если такты отключены, то запрещена). В асинхронном режиме clkI/O должен быть заменен на тактовую частоту генератора, соединенного с выводами TOSC1 и TOSC2. На рисунках диаграмм показаны события, когда устанавливается флаги прерывания. На рис. 20-8 содержатся данные тактирования для базового функционирования таймера/счетчика. Показана последовательность счета, когда значение счетчика близко к MAX во всех режимах, отличающихся от Phase Correct PWM mode.

ATmega2560 TC2 Timing Diagram no Prescaling fig20 8

Рис. 20-8. Диаграмма тактирования счетчика, прескалер отключен.

На рис. 20-9 показана та же самая диаграмма, но в этом случае включен прескалер с коэффициентом деления 8.

ATmega2560 TC2 Timing Diagram Prescaling8 fig20 9

Рис. 20-9. Диаграмма тактирования счетчика, прескалер включен (fclk_I/O/8).

На рис. 20-10 показана установка OCF2A во всех режимах, за исключением CTC mode.

ATmega2560 TC2 Timing Diagram OCF0x Prescaling8 fig20 10

Рис. 20-10. Диаграмма тактирования счетчика с установкой OCF0A, прескалер включен (fclk_I/O/8).

На рис. 20-11 показана установка OCF2A и очистка TCNT2 в CTC mode.

ATmega2560 TC2 Timing Diagram CTC Prescaling8 fig20 11

Рис. 20-11. Диаграмма тактирования счетчика с очисткой таймера на событии Compare Match, прескалер включен (fclk_I/O/8).

Асинхронная работа Timer/Counter2. Когда Timer/Counter2 работает асинхронно, нужно учитывать некоторые обстоятельства.

• Внимание: когда происходит переключение между асинхронным и синхронным тактированием Timer/Counter2, содержимое регистров таймера TCNT2, OCR2x, и TCCR2x может быть повреждено. Безопасная процедура для переключения тактирования следующая:

1. Запрет прерываний Timer/Counter2 путем очистки OCIE2x и TOIE2.
2. Выбрать источник тактирования настройкой бита AS2, как это необходимо.
3. Записать новые значения в TCNT2, OCR2x и TCCR2x.
4. Для переключения в асинхронный режим: ожидание для TCN2UB, OCR2xUB и TCR2xUB.
5. Очистить флаги прерывания Timer/Counter2.
6. Разрешить нужные прерывания, если это необходимо.

• Основная частота ядра CPU должна быть в 4 раза больше, чем частота генератора, от которого Timer/Counter2 тактируется асинхронно.

• Когда происходит запись в один из регистров TCNT2, OCR2x или TCCR2x, записываемое значение передается во временный регистр, и защелкивается после двух положительных перепадов TOSC1. Пользователь не должен записывать новое значение до того, как содержимое временного регистра будет передано по своему назначению. Каждый из пяти упомянутых регистров имеет свой индивидуальный временный регистр, что означает, к примеру, что запись TCNT2 не помешает на процесс записи OCR2x. Чтобы детектировать, что сейчас происходит передача в регистр назначения, реализован Asynchronous Status Register – ASSR.

• Для входа в режимы Power-save (пониженное энергопотребление) или ADC Noise Reduction после записи TCNT2, OCR2x или TCCR2x, пользователь должен подождать, пока регистры не будут обновлены, если планируется использовать Timer/Counter2 для пробуждения микроконтроллера. Иначе MCU войдет в режим сна (sleep mode) до того, как изменения вступят в силу. Это в частности важно, если используется любое из прерываний Output Compare2 для пробуждения устройства, поскольку функция Output Compare запрещена во время записи в OCR2x или TCNT2. Если цикл записи не завершился, и MCU войдет в sleep mode до того, как соответствующий бит OCR2xUB вернет 0, устройство никогда не получит прерывание Compare Match, и MCU не проснется.

• Если Timer/Counter2 используется для пробуждения устройства из Power-save или ADC Noise Reduction, должны быть предприняты меры предосторожности, если пользователь хочет заново войти в один из этих режимов: логика прерывания требует один цикл TOSC1 для сброса. Если интервал времени между пробуждением и повторным входом в sleep mode меньше чем один цикл TOSC1, то прерывание не произойдет, и устройство не проснется. Если пользователь сомневается, выполняется ли условие достаточности времени между повторным входом в Power-save или ADC Noise Reduction mode, то может использоваться следующий алгоритм, который гарантирует, что один цикл TOSC1 прошел:

1. Записать значение в TCCR2x, TCNT2 или OCR2x.
2. Ждать, пока соответствующий Update Busy Flag в регистре ASSR не станет равен 0.
3. Войти в Power-save или ADC Noise Reduction mode.

• Когда выбран асинхронный режим работы, генератор 32.768 кГц для Timer/Counter2 работает всегда, за исключением режимов Power-down и Standby. После Power-up Reset или пробуждения из Power-down или Standby mode, пользователь должен остерегаться факта, что этот генератор фактически может потребовать 1 секунду для стабилизации. Пользователю рекомендуется ждать как минимум 1 секунду перед использованием Timer/Counter2 после включения питания или пробуждения из режимов Power-down или Standby. Содержимое всех регистров Timer/Counter2 должно считаться потерянным после пробуждения из режима Power-down или Standby во время нестабильного сингала тактов при старте, независимо от того, используется ли внутренний генератор или тактовый сигнал, поданный на вывод TOSC1.

• Описание пробуждения из Power-save или ADC Noise Reduction mode, когда таймер тактируется асинхронно: когда соблюдено условие прерывания, запускается процесс пробуждения на следующем цикле такта таймера, так что таймер всегда продолжит счет как минимум 1 раз перед тем, как процессор может прочитать значение счетчика. После пробуждения MCU приостанавливается на 4 цикла, запускает обработчик прерывания, и возобновит выполнение с инструкции, которая следует за инструкцией SLEEP.

• Быстрое чтение регистра TCNT2 после пробуждения из режима Power-save может дать некорректные результаты. Поскольку TCNT2 тактируется от асинхронной частоты TOSC, чтение TCNT2 должно происходить через регистр, синхронно с внутренним доменом тактовой частоты I/O. Синхронизация происходит каждый положительный перепад TOSC1. Когда происходит пробуждение из Power-save mode, частота I/O (clkI/O) снова станет активной, TCNT2 будет прочитано как предыдущее значение (которое было до входа в сон) до следующего положительного перепада TOSC1. Фаза тактов TOSC после пробуждения из Power-save непредсказуема, и зависит от времени пробуждения. Рекомендуемая последовательность чтения TCNT2 должна быть следующей:

1. Записать любое значение либо в регистр OCR2x, либо в регистр TCCR2x.
2. Ждать очистки соответствующего флага Update Busy.
3. Прочитать TCNT2.

• Во время асинхронного функционирования, синхронизация флагов прерывания для асинхронного таймера занимает 3 цикла тактов процессора плюс 1 такт таймера. Таким образом, таймер как минимум перейдет в следующее состояние до того, как процессор сможет прочитать значение таймера, которое привело к установки флага прерывания. Вывод Output Compare изменится на такте таймера, и это не засинхронизировано с тактами процессора.

Прескалер для Timer/Counter2

ATmega2560 TC2 Prescaler fig20 12

Рис. 20-12. Прескалер Timer/Counter2.

Источник тактов для Timer/Counter2 поименован как clkT2S. clkT2S по умолчанию подключен к основной тактовой частоте системы (system I/O clock) clkIO. Путем установки бита AS2 в регистре ASSR таймер Timer/Counter2 тактирует асинхронно от вывода TOSC1. Это разрешает использование Timer/Counter2 как счетчика реального времени (Real Time Counter, RTC). Когда бит AS2 установлен, выводы TOSC1 и TOSC2 отключаются от порта C. К этим выводам может быть подключен кварц, и получится независимый источник таков для Timer/Counter2. Генератор оптимизирован под кристалл 32.768 кГц. Путем установки бита EXCLK в ASSR может быть подана внешняя частота тактирования 32 кГц (подробнее см. описание регистра ASSR).

Для Timer/Counter2 можно выбрать следующие коэффициенты деления прескалера: clkT2S/8, clkT2S/32, clkT2S/64, clkT2S/128, clkT2S/256 и clkT2S/1024. Дополнительно можно выбрать clkT2S как 0 (остановлено). Установка бита PSRASY в GTCCR сбросит прескалер. Это позволяет пользователю иметь дело с предсказуемым поведением прескалера.

TCCR2A – Timer/Counter Control Register A

Адрес (0xB0)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит COM2A1 COM2A0 COM2B1 COM2B0 - - WGM21 WGM20
Чтение/запись rw rw rw rw r r rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:6 – COM2A1:0: Compare Match Output A Mode

Эти биты управляют поведением вывода Output Compare A (OC2A). Если один или оба бита COM2A1:0 установлены, то выход OC2A переназначает нормальное поведение порта ввода/вывода, к которому привязан OC2A (это порт PB4). Однако имейте в виду, что бит Data Direction Register (DDR), соответствующий выводу OC2A, должен быть установлен в лог. 1, чтобы заработал выходной драйвер порта (DDRB4).

Когда OC2A подключен к порту, функционал COM2A1:0 зависит от состояния бит WGM22:0. В таблице 20-2 показан функционал COM2A1:0, когда биты WGM22:0 установлены в режим Normal или CTC (режимы не-PWM).

Табл. 20-2. Compare Output Mode, non-PWM Mode.

COM2A1 COM2A0 Описание
0 0 Обычная работа порта как GPIO, функционал OC2A отключен.
0 1 Переключение OC2A в противоположное состояние при Compare Match.
1 0 Очистка OC2A при Compare Match.
1 1 Установка OC2A при Compare Match.

В таблице 20-3 показан функционал бит COM2A1:0, когда биты WGM21:0 установлены в Fast PWM mode.

Табл. 20-3. Compare Output Mode, Fast PWM Mode(1).

COM2A1 COM2A0 Описание
0 0 Обычная работа порта как GPIO, функционал OC2A отключен.
0 1 WGM22=0: обычная работа порта как GPIO, функционал OC2A отключен. WGM22=1: переключение OC2A в противоположное состояние при Compare Match.
1 0 Очистка OC2A при Compare Match, установка при BOTTOM (не инверсный ШИМ).
1 1 Установка OC2A при Compare Match, очистка при BOTTOM (инверсный ШИМ).

Примечание (1): имеется специальная ситуация, когда OCR2A равен TOP, и установлен COM2A1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Fast PWM.

В таблице 20-4 показан функционал бит COM2A1:0, когда биты WGM22:0 установлены для Phase Correct PWM mode.

Табл. 20-4. Compare Output Mode, Phase Correct PWM Mode(1).

COM2A1 COM2A0 Описание
0 0 Обычная работа порта как GPIO, функционал OC2A отключен.
0 1 WGM22=0: обычная работа порта как GPIO, функционал OC2A отключен. WGM22=1: переключение OC2A в противоположное состояние при Compare Match.
1 0 Очистка OC2A на событии Compare Match при счете вверх. Установка на событии Compare Match при счете вниз.
1 1 Установка OC2A на событии Compare Match при счете вверх. Сброс на событии Compare Match при счете вниз.

Примечание (1): имеется специальная ситуация, когда OCR2A равен TOP, и установлен COM2A1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Phase Correct PWM.

• 5:4 – COM2B1:0: Compare Match Output B Mode

Эти биты управляют поведением вывода Output Compare B (OC2B). Если один или оба бита COM2A1:0 установлены, то выход OC2B переназначает нормальное поведение порта ввода/вывода, к которому привязан OC2B (это PH6). Однако имейте в виду, что бит Data Direction Register (DDR), соответствующий выводу OC0B (бит DDRH6), должен быть установлен в лог. 1, чтобы заработал выходной драйвер порта.

Когда OC2B подключен к порту, функционал COM2B1:0 зависит от состояния бит WGM22:0. В таблице 20-5 показан функционал COM2B1:0, когда биты WGM22:0 установлены в режим Normal или CTC (режим не-PWM).

Табл. 20-5. Compare Output Mode, non-PWM Mode.

COM2B1 COM2B0 Описание
0 0 Обычная работа порта как GPIO, функционал OC2B отключен.
0 1 Переключение OC2B в противоположное состояние при Compare Match.
1 0 Очистка OC2B при Compare Match.
1 1 Установка OC2B при Compare Match.

В таблице 20-6 показан функционал бит COM2B1:0, когда биты WGM22:0 установлены в Fast PWM mode.

Табл. 20-6. Compare Output Mode, Fast PWM Mode(1).

COM2B1 COM2B0 Описание
0 0 Обычная работа порта как GPIO, функционал OC2B отключен.
0 1 Зарезервировано.
1 0 Очистка OC2B при Compare Match, установка при BOTTOM (не инверсный ШИМ).
1 1 Установка OC2B при Compare Match, очистка при BOTTOM (инверсный ШИМ).

Примечание (1): имеется специальная ситуация, когда OCR2B равен TOP, и установлен COM2B1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Fast PWM.

В таблице 20-7 показан функционал бит COM2B1:0, когда биты WGM22:0 установлены для Phase Correct PWM mode.

Табл. 20-7. Compare Output Mode, Phase Correct PWM Mode(1).

COM2B1 COM2B0 Описание
0 0 Обычная работа порта как GPIO, функционал OC2B отключен.
0 1 Зарезервировано.
1 0 Очистка OC2B на событии Compare Match при счете вверх. Установка на событии Compare Match при счете вниз.
1 1 Установка OC2B на событии Compare Match при счете вверх. Сброс на событии Compare Match при счете вниз.

Примечание (1): имеется специальная ситуация, когда OCR2B равен TOP, и установлен COM2B1. В этом случае событие Compare Match игнорируется, однако происходит установка или очистка при BOTTOM. Подробнее см. описание режима Phase Correct PWM.

• 3, 2 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 1:0 – WGM21:0: Waveform Generation Mode

В комбинации с битом WGM22, который находится в регистре TCCR2B, эти биты управляют последовательностью счета, источником для максимального значения (TOP) счетчика, и типом используемой генерации сигнала, см. таблицу 20-8. Поддерживаются следующие режимы работы: Normal mode (счетчик), очистка при событии совпадения CTC mode, и два типа генерации ШИМ.

Табл. 20-8. Описание бит Waveform Generation Mode.

Mode WGM2 WGM1 WGM0 Режим работы TOP Обновл. OCR2x TOV установится при значении(1)
0 0 0 0 Normal 0xFF Немедленно MAX
1 0 0 1 Phase Correct PWM 0xFF TOP BOTTOM
2 0 1 0 CTC OCR2A Немедленно MAX
3 0 1 1 Fast PWM 0xFF TOP MAX
4 1 0 0 Зарезервировано - - -
5 1 0 1 Phase Correct PWM OCR2A TOP BOTTOM
6 1 1 0 Зарезервировано - - -
7 1 1 1 Fast PWM OCR2A BOTTOM TOP

Примечание (1): MAX=0xFF, BOTTOM=0x00.

TCCR2B – Timer/Counter Control Register B

Адрес (0xB1)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит FOC2A FOC2B - - WGM22 CS22 CS21 CS20
Чтение/запись w w r r rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7 – FOC2A: Force Output Compare A

Бит FOC2A активен только тогда, когда биты WGM задают режим не-PWM.

Однако для обеспечения совместимости с микроконтроллерами, которые возможно появятся в будущем, этот бит должен быть установлен в 0, когда TCCR2B записывается при работе в режиме PWM. Когда записывается лог. 1 в бит FOC2A, то немедленно и принудительно срабатывает событие Compare Match в модуле генерации сигнала (Waveform Generation unit). Выход OC2A поменяет свое состояние в соответствии с настройками бит COM2A1:0. Имейте в виду, что бит FOC2A реализован как строб. Таким образом значение бит COM2A1:0 определяет эффект от принудительного наступления события сравнения.

Строб FOC2A не будет генерировать любое прерывание, и при этом не будет очищен таймер в режиме CTC при использовании OCR2A в качестве значения TOP.

Бит FOC2A всегда читается как 0.

• 6 – FOC2B: Force Output Compare B

Бит FOC2B активен только тогда, когда биты WGM задают режим не-PWM.

Однако для обеспечения совместимости с микроконтроллерами, которые возможно появятся в будущем, этот бит должен быть установлен в 0, когда TCCR2B записывается при работе в режиме PWM. Когда записывается лог. 1 в бит FOC2B, то немедленно и принудительно срабатывает событие Compare Match в модуле генерации сигнала (Waveform Generation unit). Выход OC2B поменяет свое состояние в соответствии с настройками бит COM2B1:0. Имейте в виду, что бит FOC2B реализован как строб. Таким образом значение бит COM2B1:0 определяет эффект от принудительного наступления события сравнения.

Строб FOC2B не будет генерировать любое прерывание, и при этом не будет очищен таймер в режиме CTC при использовании OCR2B в качестве значения TOP.

Бит FOC2B всегда читается как 0.

• 5, 4 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 3 – WGM22: Waveform Generation Mode

См. описание TCCR2A – Timer/Counter Control Register A.

• 2:0 – CS22:0: Clock Select

Эти 3 бита выбирают источник тактирования для таймера/счетчика, см. таблицу 20-9.

Табл. 20-9. Описание бит выбора тактирования для таймера.

CS22 CS21 CS20 Описание
0 0 0 Нет источника для тактирования (таймер/счетчик остановлен).
0 0 1 clkT2S (прескалер отключен).
0 1 0 clkT2S/8 (работает прескалер).
0 1 1 clkT2S/32 (работает прескалер).
1 0 0 clkT2S/64 (работает прескалер).
1 0 1 clkT2S/128 (работает прескалер).
1 1 0 clkT2S/256 (работает прескалер).
1 1 1 clkT2S/1024 (работает прескалер).

TCNT2 – Timer/Counter Register

Адрес (0xB2)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит TCNT2[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Этот регистр дает прямой доступ на чтение и запись к содержимому 8-битного счетчика. Запись в TCNT2 блокирует (устраняет) событие Compare Match на следующий такт таймера. Модификация TCNT2, когда счетчик работает приводит к риску пропуска события Compare Match между регистрами TCNT2 и OCR2x.

OCR2A – Output Compare Register A

Адрес (0xB3)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит OCR2A[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Регистр содержит 8-битное значение, которое постоянно сравнивается со значением счетчика (TCNT2). Совпадение (Compare Match) может использоваться для генерации прерывания Output Compare, или для генерации сигнала на выходе OCR2A.

OCR2B – Output Compare Register B

Адрес (0xB4)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит OCR2B[7:0]
Чтение/запись rw rw rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

Регистр содержит 8-битное значение, которое постоянно сравнивается со значением счетчика (TCNT2). Совпадение (Compare Match) может использоваться для генерации прерывания Output Compare, или для генерации сигнала на выходе OCR2B.

ASSR – Asynchronous Status Register

Адрес (0xB6)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - EXCLK AS2 TCN2UB OCR2AUB OCR2BUB TCR2AUB TCR2BUB
Чтение/запись r rw rw r r r r r
Нач. значение 0 0 0 0 0 0 0 0

• Bit 6 – EXCLK: Enable External Clock Input

Когда EXCLK записан в 1, и выбрано асинхронное тактирование, входной буфер внешних тактов разрешен и внешняя частота может поступать на вывод Timer Oscillator 1 (TOSC1) вместо подключенного кварца 32 кГц. Запись EXCLK должна быть выполнена перед выбором асинхронного функционирования. Имейте в виду, что кварцевый генератор будет работать только тогда, когда в этот бит записан 0.

• Bit 5 – AS2: Asynchronous Timer/Counter2

Когда в бит AS2 записан 0, Timer/Counter2 тактируется от внутренних тактов I/O (clkI/O). Когда в AS2 записана 1, Timer/Counter2 тактируется от кварцевого генератора, подключенного к выводу Timer Oscillator 1 (TOSC1). Когда меняется значение AS2, то содержимое TCNT2, OCR2A, OCR2B, TCCR2A и TCCR2B может быть запорченным.

• Bit 4 – TCN2UB: Timer/Counter2 Update Busy

Когда Timer/Counter2 работает асинхронно, и записан TCNT2, то этот бит устанавливается. Когда значение TCNT2 обновится из временного регистра, этот бит сбросится аппаратно. Лог. 0 в этом бите означает, что TCNT2 готов к записи в него нового значения.

• Bit 3 – OCR2AUB: Output Compare Register2 Update Busy

Когда Timer/Counter2 работает асинхронно, и записан OCR2A, то этот бит устанавливается. Когда значение OCR2A обновится из временного регистра, этот бит сбросится аппаратно. Лог. 0 в этом бите означает, что OCR2A готов к записи в него нового значения.

• Bit 2 – OCR2BUB: Output Compare Register2 Update Busy

Когда Timer/Counter2 работает асинхронно, и записан OCR2B, то этот бит устанавливается. Когда значение OCR2B обновится из временного регистра, этот бит сбросится аппаратно. Лог. 0 в этом бите означает, что OCR2B готов к записи в него нового значения.

• Bit 1 – TCR2AUB: Timer/Counter Control Register2 Update Busy

Когда Timer/Counter2 работает асинхронно, и записан TCCR2A, то этот бит устанавливается. Когда значение TCCR2A обновится из временного регистра, этот бит сбросится аппаратно. Лог. 0 в этом бите означает, что TCCR2A готов к записи в него нового значения.

• Bit 0 – TCR2BUB: Timer/Counter Control Register2 Update Busy

Когда Timer/Counter2 работает асинхронно, и записан TCCR2B, то этот бит устанавливается. Когда значение TCCR2B обновится из временного регистра, этот бит сбросится аппаратно. Лог. 0 в этом бите означает, что TCCR2B готов к записи в него нового значения.

Если запись производится в любой из 5 регистров Timer/Counter2, в то время как флаг занятости на обновление установлен, обновленное значение может оказаться испорченным и произойдет нежелательное прерывание.

Механизмы чтения TCNT2, OCR2A, OCR2B, TCCR2A и TCCR2B различаются. Когда читается TCNT2, читается актуальное значение таймера. Когда читается OCR2A, OCR2B, TCCR2A и TCCR2B, то происходит чтение из временного регистра.

TIMSK2 – Timer/Counter2 Interrupt Mask Register

Адрес (0x70)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - - - - OCIE2B OCIE2A TOIE2
Чтение/запись r r r r r rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:3 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 2 – OCIE2B: Timer/Counter2 Output Compare Match B Interrupt Enable

Когда в бит OCIE2B записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/Counter2 Compare Match B. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFR2) установлен флаг OCF2B.

• 1 – OCIE2A: Timer/Counter2 Output Compare Match A Interrupt Enable

Когда в бит OCIE2A записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/Counter2 Compare Match A. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло событие Compare Match. Прерывание возникает, когда в регистре Timer/Counter Interrupt Flag Register (TIFR2) установлен флаг OCF2A.

• 0 – TOIE2: Timer/Counter0 Overflow Interrupt Enable

Когда в бит TOIE2 записана лог. 1, и установлен общий бит разрешения прерываний (бит I в Status Register), разрешено прерывание Timer/Counter2 Overflow. Будет выполнен соответствующий обработчик прерывания, если для таймера/счетчика произошло переполнение. Прерывание возникает, когда устанавливается бит TOV0 в регистре Timer/Counter0 Interrupt Flag Register (TIFR2).

TIFR2 – Timer/Counter2 Interrupt Flag Register

Адрес 0x17 (0x37)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - - - - OCF2B OCF2A TOV2
Чтение/запись r r r r r rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:3 – резерв

Эти биты зарезервированы и будут всегда прочитаны как 0.

• 2 – OCF2B: Timer/Counter2 Output Compare B Match Flag

Бит OCF2B устанавливается, когда происходит событие Compare Match (совпадение) между счетчиком и OCR2B (Output Compare Register2 B). OCF2B очищается аппаратно, когда выполняется соответствующий обработчик прерывания. Альтернативно OCF2B может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит OCIE2B (Timer/Counter Compare B Match Interrupt Enable), и установился бит OCF2B, выполнится обработчик прерывания Timer/Counter Compare Match.

• 1 – OCF2A: Timer/Counter2 Output Compare A Match Flag

Бит OCF2A устанавливается, когда происходит событие Compare Match (совпадение) между счетчиком и OCR2B (Output Compare Register2 A). OCF2A очищается аппаратно, когда выполняется соответствующий обработчик прерывания. Альтернативно OCF2A может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит OCIE2A (Timer/Counter Compare A Match Interrupt Enable), и установился бит OCF2A, выполнится обработчик прерывания Timer/Counter Compare Match.

• 0 – TOV2: Timer/Counter2 Overflow Flag

Бит TOV2 устанавливается, когда произошло переполнение в Timer/Counter2. TOV2 очищается аппаратно, когда выполняется соответствующий обработчик прерывания. Альтернативно TOV2 может быть очищен программно, если записать туда лог. 1. Когда установлен бит I в SREG, и установлен бит TOIE2 (Timer/Counter0 Overflow Interrupt Enable), и установился бит TOV2, выполнится обработчик прерывания Timer/Counter2 Overflow. В режиме PWM этот бит установится, когда Timer/Counter2 меняет направление счета на значении 0x00.

GTCCR – General Timer/Counter Control Register

Адрес 0x23 (0x43)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит TSM - - - - - PSRASY PSRSYNC
Чтение/запись rw r r r r r rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 1 – PSRASY: Prescaler Reset Timer/Counter2

Когда этот бит установлен в 1, прескалер Timer/Counter2 сбрасывается. Этот бит нормально немедленно очищается аппаратурой. Если бит записан, когда Timer/Counter2 работает в асинхронном режиме, бит остается в 1 до сброса прескалера. Бит не будет очищен аппаратно, если установлен бит TSM.

[Регистры для управления энергопотреблением]

На работу таймеров/счетчиков влияют регистры управления энергопотреблением PRR0 и PRR1 (аббревиатура от Power Reduction Register, PRR), они позволяют останавливать тактирование отдельных внутренних периферийных модулей кристалла AVR, что снижает общее энергопотребление микроконтроллера.

Имейте в виду, что когда тактирование периферийного устройства остановлено, то:

• Текущее состояние периферийного устройства заморожено.
• Все регистры, связанные с периферийным устройством, нельзя читать или записывать.
• Ресурсы, используемые периферийным устройством (к примеру ножки I/O и т. п.) останутся задействованными.

В большинстве случаев периферийное устройство должно быть запрещено до того, как будет отключено его тактирование. Чтобы разбудить периферийный модуль, нужно очистить соответствующий ему бит в регистре PRR, что переведет периферийное устройство в то состояние, которое было до выключения. Использование отключения периферийных модулей в режимах Idle или Active значительно снижает общее энергопотребление (см. раздел даташита "Power-down Supply Current", где приведены примеры). Во всех других режимах сна тактирование также отключается.

Есть некоторые проблемы, которые надо учитывать при попытке снизить энергопотребление системы, которая находится под управлением микроконтроллера AVR. Обычно как можно больше следует использовать режим сна, и режим сна должен быть выбран так, чтобы как можно меньше осталось работающих функций микроконтроллера. Все функции, которые не нужны, должны быть запрещены. В частности, в попытках снизить общее потребление тока можно выключить АЦП (Analog to Digital Converter, ADC), аналоговый компаратор (Analog Comparator, AC), детектор некачественного питания (Brown-out Detector, BOD), внутренний источник опорного напряжения (Internal Voltage Reference), сторожевой таймер (Watchdog Timer, WDT), ножки портов, узел встроенной отладки (On-chip Debug System), и таймеры/счетчики.

SMCR – Sleep Mode Control Register

Этот регистр содержит биты для управления режимом работы микроконтроллера.

Адрес 0x33 (0x56)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - - - SM2 SM1 SM0 SE
Чтение/запись r r r r rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 3:1 – SM2:0: Sleep Mode Select Bits 2, 1, and 0

Эти биты выбирают режим сна микроконтроллера, как это показано в таблице ниже.

SM2 SM1 SM0 Режим сна
0 0 0 Idle
0 0 1 ADC Noise Reduction (режим пониженных помех для ADC).
0 1 0 Power-down (выключено).
0 1 1 Power-save (режим экономии питания).
1 0 0 Зарезервировано.
1 0 1
1 1 0 Standby(1).
1 1 1 Extended Standby(1).

Примечание (1): режимы Standby рекомендуется использовать только вместе с внешними кварцами или резонаторами.

• 1 – SE: Sleep Enable

Бит SE должен быть записан в лог. 1 для того, чтобы микроконтроллер зашел в режим сна, когда выполняется инструкция SLEEP. Чтобы избежать входа MCU в режим сна по ошибке, рекомендуется записать бит SE сразу после выполнения инструкции SLEEP, и очищать его немедленно после пробуждения.

PRR0 – Power Reduction Register 0

Адрес (0x64)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит PRTWI PRTIM2 PRTIM0 - PRTIM1 PRSPI PRUSART0 PRADC
Чтение/запись rw rw rw r rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7 - PRTWI: Power Reduction TWI

Запись лог. 1 в этот бит отключит TWI путем отключения тактирования этого модуля. Когда заново пробуждается TWI, его нужно инициализировать повторно, чтобы гарантировать корректную работу.

• 6 - PRTIM2: Power Reduction Timer/Counter2

Запись лог. 1 в этот бит отключит Timer/Counter2 в синхронном режиме (AS2 в 0). Когда Timer/Counter2 разрешается, его работа будет продолжена, как была до отключения.

• 5 - PRTIM0: Power Reduction Timer/Counter0

Запись лог. 1 в этот бит отключит Timer/Counter0. Когда Timer/Counter0 разрешается, его работа будет продолжена, как была до отключения.

• 4 - Res: резерв

Этот бит зарезервирован и всегда будет читаться как 0.

• 3 - PRTIM1: Power Reduction Timer/Counter1

Запись лог. 1 в этот бит отключит Timer/Counter1 module. Когда Timer/Counter1 разрешается, его работа будет продолжена, как была до отключения.

• 2 - PRSPI: Power Reduction Serial Peripheral Interface

Запись лог. 1 в этот бит отключит Serial Peripheral Interface путем отключения тактирования этого модуля. Когда заново пробуждается SPI, то его нужно инициализировать повторно, чтобы гарантировать корректную работу.

• 1 - PRUSART0: Power Reduction USART0

Запись лог. 1 в этот бит отключит USART0 путем отключения тактирования этого модуля. Когда заново пробуждается USART0, то его нужно инициализировать повторно, чтобы гарантировать корректную работу.

• 0 - PRADC: Power Reduction ADC

Запись лог. 1 в этот бит отключит ADC. До выключения ADC должен быть запрещен. Аналоговый компаратор не может использовать мультиплексированный вход ADC, когда ADC выключен.

PRR1 – Power Reduction Register 1

Адрес (0x64)

№ разрядов 7 6 5 4 3 2 1 0
Имена бит - - PRTIM5 PRTIM4 PRTIM3 PRUSART3 PRUSART2 PRUSART1
Чтение/запись r r rw rw rw rw rw rw
Нач. значение 0 0 0 0 0 0 0 0

• 7:6 - резерв

Эти биты зарезервированы и всегда будут читаться как 0.

• 5 - PRTIM5: Power Reduction Timer/Counter5

Запись лог. 1 в этот бит отключит Timer/Counter5. Когда Timer/Counter5 разрешается, его работа будет продолжена, как была до отключения.

• 4 - PRTIM4: Power Reduction Timer/Counter4

Запись лог. 1 в этот бит отключит Timer/Counter4. Когда Timer/Counter4 разрешается, его работа будет продолжена, как была до отключения.

• 3 - PRTIM3: Power Reduction Timer/Counter3

Запись лог. 1 в этот бит отключит Timer/Counter3. Когда Timer/Counter3 разрешается, его работа будет продолжена, как была до отключения.

• 2 - PRUSART3: Power Reduction USART3

Запись лог. 1 в этот бит отключит USART3 путем отключения тактирования этого модуля. Когда заново пробуждается USART3, то его нужно инициализировать повторно, чтобы гарантировать корректную работу.

• 1 - PRUSART2: Power Reduction USART2

Запись лог. 1 в этот бит отключит USART2 путем отключения тактирования этого модуля. Когда заново пробуждается USART2, то его нужно инициализировать повторно, чтобы гарантировать корректную работу.

• 0 - PRUSART1: Power Reduction USART1

Запись лог. 1 в этот бит отключит USART1 путем отключения тактирования этого модуля. Когда заново пробуждается USART1, то его нужно инициализировать повторно, чтобы гарантировать корректную работу.

[Ссылки]

1. ATmega16 - PWM с помощью T/C0, T/C1, T/C2.
2. Использование 16-bit Timer/Counter1 для измерения и подсчета импульсов.
3. AVR130: настройка и использование таймеров AVR.
4. Доступ к 16-битным регистрам AVR.