Buderus-trade.ru

Теплотехника Будерус
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Восьмибитные таймеры. Режимы работы таймеров Т0 и Т2

Восьмибитные таймеры. Режимы работы таймеров Т0 и Т2

Atmega 128 имеет два 8-битных таймера/счетчика Т0 и Т2 и два 16-битных таймера/счетчика Т1 и Т3.

Восьмибитные таймеры T0 и T2.

В состав таймер/счетчиков входят три регистра:

регистр управления – ТССRn;

счетный регистр – TCNTn;

регистр сравнения – OCRn, где n=0,2 – номер таймера.

Таймер Т0 может использоваться как часы реального времени (асинхронный режим работы) с тактированием от дополнительного внешнего кварцевого резонатора. Поэтому, в него добавляем регистр ASSR – управление асинхронным режимом.

Регистр TCCR0 (TCCR2) предназначен для управления модулем таймера счетчика.

FOCn – принудительное изменение состояния вывода OСn (режимы Normal и CTC). При FOCn=1 состояние вывода ОСn изменяется в соответствии с установками разрядов COMn1 и COMn0. В режимах Fast PWM и Phase Correct PWM этот разряд должен быть сброшен в ноль.

WGMn1 и WGMn0 – режимы работы таймера/счетчика:

Номер режима

Режим работы

Phase Correct PWM

CTC (сброс при совпадении)

COMn1 и COMn0 – режим работы блока сравнения. Определяют поведение вывода Ocn при наступлении события «Совпадение». Влияние содержимого этих разрядов на поведение вывода зависит от режима работы таймера.

CSn2 .. CSn0 – управление тактовым сигналом.

Тактовый сигнал контроллера поступает на вход таймера через предделитель. Биты CSn2 .. CSn0 определяют коэффициент деления:

вывод Tn, счет по заднему фронту

вывод Tn, счет по переднему фронту

Регистр TCNTn – считает количество импульсов поступивших на вход таймера. При включений, регистр содержит 00 (Н). При достижении значения FF (Н), регистр сбрасывается в ноль, устанавливая флаг прерывания TOV0 (TOV2) регистра TIFR. Разрешение прерывания осуществляется установкой в 1 разряда TOIE0 (TOIE2) регистра TIMSK (флаг I=1 в регистре SREG).

Регистры сравнения OCR0 (OCR2). Во время работы таймера производится сравнение этого регистра с регистром TCNTn. Если содержимое регистров равно, устанавливается флаг OCF0 (OCF2) регистра TIFR и генерируется прерывание. Кроме того, при наступлении этого события может изменит состояния выводов ОС0 (ОС2), если это изменение задано битами COMn1 и COMn0 регистра TCCRn.

Режимы работы таймеров Т0 и Т2.

1. Режим Normal.

По каждому импульсу тактового сигнала происходит инкремент счетного регистра TCNTn. При переходе через значение FF(H) возникает переполнение, и счет продолжается со значения 00 (Н). В том же такте, устанавливается в 1 флаг переполнения TOVn.

При равенстве счетного регистра TCNTn и регистра сравнения OCRn устанавливается флаг прерывания OCFn и, если разряд OCIFn регистра TIMSK установлен в 1, генерируется прерывание. Наряду с установкой флага прерывания, изменяется состояние вывода ОС0 (ОС2) микроконтроллера.

Встроенные таймеры и счётчики AVR микроконтроллеров

Таймер микроконтроллера – это цифровой счётчик, осуществляющий подсчёт количества подаваемых на него импульсов.
Источником импульсов для таймера-счётчика могут служить: как тактовые импульсы от внутреннего генератора МК, так и импульсы, подаваемые непосредственно на вход таймера с внешнего источника.

В МК ATmega8 (Atmega16) есть три таймера: два 8-битных – Т0 и Т2, и один 16-битный – Т1. Счёт ведётся до 255 тактовых импульсов для 8-битных счётчиков и до 65535 импульсов – для 16-битного.
Далее, если не выполняется никаких программных действий, то происходит переполнение счётчика, он сбрасывается в 0 и всё повторяется бесконечное количество раз.

Для каждого таймера можно настроить делитель частоты тактовых импульсов, и, таким образом, заставить его тактироваться не только на основной частоте МК, но и на частотах, находящихся в пропорциях от 1:8 до 1:1024 по отношению к основной. Пропорция эта называется «prescaler» и прописывается в регистре TCCRx (Timer/Counter Control Register) посредством установки значений соответствующих битов.

Читайте так же:
Что такое счетчик с термодатчиком

На примере таймера-счётчика Т2, давайте посмотрим, как выглядит этот регистр TCCR2 и каково предназначение его битов. Итак:

1. Конфигурационный регистр TCCR2

Биты CS22, CS21, CS20 (Clock Select) – задают для таймера Т2 коэффициент предделителя.
Все возможные комбинации состояний этих битов описаны в таблице ниже:

CS22CS21CS20Описание
0 0 0 Источника тактирования нет, таймер остановлен
0 0 1 Тактовая частота МК
0 1 0 Тактовая частота МК/8
0 1 1 Тактовая частота МК/32
1 0 0 Тактовая частота МК/64
1 0 1 Тактовая частота МК/128
1 1 0 Тактовая частота МК/256
1 1 1 Тактовая частота МК/1024

Биты WGM21, WGM20 (Wave Generator Mode) – определяют режим работы таймера-счетчика Т2.
Всего их может быть четыре: нормальный режим (normal), сброс таймера при совпадении значения счётного регистра с содержимым регистра сравнения (CTC), два режима широтно-импульсной модуляции (FastPWM и Phase Correct PWM). Все возможные значения описаны в таблице ниже:

WGM21WGM20Режим работы таймера/счётчика
0 0 Нормальный режим счётчика (normal)
1 0 Сброс таймера при совпадении регистров OCR2 и TCNT2 (CTC)
0 1 ШИМ с коррекцией фазы (Phase Correct PWM)
1 1 Быстрая ШИМ (Fast PWM)

Биты COM21, COM20 (Compare Match Output Mode) – определяют поведение вывода OC2.
Если хоть один из этих битов установлен в 1, то вывод OC2 перестаёт функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счётчика Т2. При этом его необходимо настроить как выход. Рассмотрим различные комбинации этих битов:

COM21COM20Режим работы вывода OC2
0 0 Вывод ОС2 отключён от таймера/счётчика
0 1 Состояние вывода меняется на противоположное при совпадении
TCNT2 и OCR2 (только в режимах Normal и CTC)
1 0 На OC2 устанавливается «0» при совпадении TCNT2 и OCR2,
и устанавливается «1» при сбросе счётчика
1 1 На OC2 устанавливается «1» при совпадении TCNT2 и OCR2,
и устанавливается «0» при сбросе счётчика

Бит регистра TCCR2 – FOC2 (Force Output Compare) предназначен для принудительной установки логического уровня на выходе OC2. Он работает только для режимов Normal и CTC. При установке бита FOC2 в единицу состояние выхода меняется в соответствии со значениями битов COM21 и COM20.

Конфигурацию регистра TCCR удобно производить в двоичном коде, т. к. каждый разряд этого кода равен соответствующему разряду регистра. Например, запись:

означает, что у счётчика выбран режим СТС со сбросом таймера при совпадении регистров OCR2 и TCNT2. Тактовая частота Т2 – это рабочая частота МК, делённая на 1024. Состояние вывода ОС2 при совпадении меняется на противоположное.
А запись:

означает, что счётчик установлен в режим Fast PWM (быстрая ШИМ). Делитель частоты отключён – таймер тикает с тактовой частотой МК. Выход ОС2 установлен в состояние логического 0.

Далее опишем по порядку остальные регистры, относящиеся ко всем трём таймерам ATmega8, 16.

2. Счётный регистр TCNT2

TCNT2 – это такой же 8-битный регистр, как и TCCR2, только все разряды в нём отведены для числа, соответствующего количеству импульсов, посчитанному счётчиком. Когда таймер-счётчик работает, то по каждому импульсу тактового сигнала значение TCNT2 изменяется на единицу. В зависимости от режима работы таймера, счётный регистр может или увеличиваться, или уменьшаться.
Содержимое регистра TCNT2 можно как читать, так изменять посредством записи в него. Запись в регистр используется при необходимости задать его начальное значение.
Когда таймер работает, изменять его содержимое TCNT2 не рекомендуется, так как это блокирует схему сравнения на один такт.

3. Регистр сравнения OCR2

OCR2 – это также 8-ми разрядный регистр. Его значение в каждом цикле сравнивается со значением счётного регистра TCNT2, и в случае совпадения, заставляет таймер выполнять какие-либо действия, как то: вызывать прерывание, менять состояние вывода OC2 и т. д. в полном соответствии с командами программного кода прошивки.
Значение OCR2 можно как читать, так и записывать.

Далее поговорим о прерываниях, источником которых являются счётчики-таймеры.
Напомню, что прерывание представляет собой определённое событие, при наступлении которого приостанавливается выполнение основной программы и вызывается функция, обрабатывающая данное прерывание.

4. Регистр флагов разрешения прерываний TIMSK

TIMSK – это общий регистр для всех трёх таймеров Atmega8, 16.

Таймер-счётчик Т2 может вызывать прерывания при следующих условиях:
1. при переполнении счётного регистра TCNT2,
2. при совпадении значения счётного регистра со значением регистра сравнения OCR2.
При этом в регистре TIMSK для таймера Т2 зарезервированы два бита: TOIE2 и OCIE2. Все остальные биты относятся к другим таймерам.

TOIE2OCIE2Разрешение прерываний
0 0 Все прерывания запрещены
0 1 Разрешает прерывание по событию совпадение
1 0 Разрешает прерывание по событию переполнение
1 1 Разрешает прерывания по обоим событиям

Необходимо отметить, что прерывания будут работать только тогда, когда в регистре состояния SREG разрешены общие прерывания. Это делается командой в начале программы:

sei(); //разрешение глобальных прерываний

Причём, в случае наступления прерывания, флаг глобального разрешения прерываний автоматически сбрасывается в 0, запрещая все прерывания, пока не произойдёт выход из обработчика прерывания.

Ещё один регистр, отвечающий за управление прерываниями – регистр TIFR.

5. Регистр флагов прерывания таймеров/счётчиков TIFR

TIFR также является общим регистром для всех трех таймеров-счётчиков Atmega8, 16.

TIFR – это регистр флагов. Когда срабатывает какое-то прерывание, то выскакивает статусный флаг, сигнализирующий о том, что произошло то или иное событие. Для таймера Т2 – этими событиями являются: переполнение счётного регистра TCNT2 или совпадение счётного регистра с регистром сравнения OCR2.
В эти моменты в регистре устанавливаются следующие флаги:
TOV2 – записывается 1 при переполнении счётного регистра,
OCF2 – записывается 1 при совпадении счётного регистра с регистром сравнения.
Если в эти моменты в регистре TIMSK разрешены прерывания, то микроконтроллер вызовет соответствующий обработчик.
Если прерывания запрещены, то флаг так и будет стоять до тех пор, пока программа не разрешит данный тип прерываний.
При входе в подпрограмму обработки прерывания, соответствующий прерыванию флаг регистра TIFR автоматически сбрасывается в состояние лог. 0.

Пример инициализации таймера-счётчика Т2, прописанный внутри функции main, может выглядеть следующим образом:

sei(); // Разрешение глобальных прерываний

TCCR2 = 0b00011101; /* 1. Режим СТС со сбросом таймера при совпадении регистров
OCR2 и TCNT2. 2. Тактовая частота Т2 – это рабочая частота МК, делённая на 1024.
3. Состояние вывода ОС2 при совпадении меняется на противоположное */

OCR2 = 112; // Сброс таймера произойдёт после того, как счётчик досчитает до 112

TIMSK |= (1 // В этот же момент произойдёт прерывание (по совпадению)

Следующая функция – это обработчик прерывания от таймера Т2, т. е. перечень действий, которые надо совершить в момент его возникновения. Описывается эта функция при помощи команд:

ISR (TIMER2_COMP_vect) // Если произошло прерывание по совпадению таймера Т2
<
// Действия, которые надо совершить
>

На следующих страницах рассмотрим примеры того, как можно реализовать генератор импульсов и ШИМ модулятор с использованием микроконтроллера Atmega8 (Atmega16).

Введение

Таймер-счетчик является одним из самых ходовых ресурсов AVR микроконтроллера. Его основное назначение — отсчитывать заданные временные интервалы. Кроме того, таймеры-счетчики могут выполнять ряд дополнительных функций, как то — формирование ШИМ сигналов, подсчет длительности и количества входящих импульсов. Для этого существуют специальные режимы работы таймера-счетчика.

В зависимости от модели микроконтроллера количество таймеров и набор их функций может отличаться. Например, у микроконтроллера Atmega16 три таймера-счетчика — два 8-ми разрядных таймера-счетчика Т0 и Т2, и один 16-ти разрядный — Т1. В этой статье, на примере ATmega16, мы разберем как использовать таймер-счетчик Т0.

Используемые выводы

Таймер-счетчик Т0 использует два вывода микроконтроллера ATmega16. Вывод T0 (PB0) — это вход внешнего тактового сигнала. Он может применяться, например, для подсчета импульсов. Вывод OC0 (PB3) — это выход схемы сравнения таймера-счетчика. На этом выводе с помощью таймера может формировать меандр или ШИМ сигнал. Также он может просто менять свое состояние при срабатывании схемы сравнения, но об этом поговорим позже.

Выводы T0 и OC0 задействуются только при соответствующих настройках таймера, в обычном состоянии это выводы общего назначения.

Регистры таймера-счетчика Т0

Хоть это и скучно, но регистры — это то, без чего невозможно программировать микроконтроллеры, конечно, если вы не сидите плотно на Arduino. Так вот, таймер Т0 имеет в своем составе три регистра:

— счетный регистр TCNT0,
— регистр сравнения OCR0,
— конфигурационный регистр TCCR0.

Кроме того, есть еще три регистра, относящиеся ко всем трем таймерам ATmega16:

— конфигурационный регистр TIMSK,
— статусный регистр TIFR.
— регистр специальных функций SFIOR

Начнем с самого простого.

Это 8-ми разрядный счетный регистр. Когда таймер работает, по каждому импульсу тактового сигнала значение TCNT0 изменяется на единицу. В зависимости от режима работы таймера, счетный регистр может или увеличиваться, или уменьшаться.
Регистр TCNT0 можно как читать, так и записывать. Последнее используется когда требуется задать его начальное значение. Когда таймер работает, изменять его содержимое TCNT0 не рекомендуется, так как это блокирует схему сравнения на один такт.

OCR0

Это 8-ми разрядный регистр сравнения. Его значение постоянно сравнивается со счетным регистром TCNT0, и в случае совпадения таймер может выполнять какие-то действия — вызывать прерывание, менять состояние вывода OC0 и т.д. в зависимости от режима работы.

Значение OCR0 можно как читать, так и записывать.

TCCR0 (Timer/Counter Control Register)



Это конфигурационный регистр таймера-счетчика Т0, он определяет источник тактирования таймера, коэффициент предделителя, режим работы таймера-счетчика Т0 и поведение вывода OC0. По сути, самый важный регистр.

Биты CS02, CS01, CS00 (Clock Select) — определяют источник тактовой частоты для таймера Т0 и задают коэффициент предделителя. Все возможные состояния описаны в таблице ниже.

Как видите, таймер-счетчик может быть остановлен, может тактироваться от внутренней частоты и также может тактироваться от сигнала на выводе Т0.

Биты WGM10, WGM00 (Wave Generator Mode) — определяют режим работы таймера-счетчика Т0. Всего их может быть четыре — нормальный режим (normal), сброс таймера при совпадении (CTC), и два режима широтно-импульсной модуляции (FastPWM и Phase Correct PWM). Все возможные значения описаны в таблице ниже.

Более подробно будем разбирать режимы в коде. Сейчас все нюансы все равно не запомнятся.

Биты COM01, COM00 (Compare Match Output Mode) — определяют поведение вывода OC0. Если хоть один из этих битов установлен в 1, то вывод OC0 перестает функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счетчика Т0. Однако при этом он должен быть еще настроен как выход.
Поведение вывода OC0 зависит от режима работы таймера-счетчика Т0. В режимах normal и СTC вывод OC0 ведет себя одинаково, а вот в режимах широтно-импульсной модуляции его поведение отличается. Не будем сейчас забивать себе голову всеми этими вариантами и разбирать таблицы для каждого режима, оставим это на практическую часть.

И последний бит регистра TCCR0 — это бит FOC0 (Force Output Compare). Этот бит предназначен для принудительного изменения состояния вывода OC0. Он работает только для режимов Normal и CTC. При установки бита FOC0 в единицу состояние вывода меняется соответственно значениям битов COM01, COM00. FOC0 бит не вызывает прерывания и не сбрасывает таймер в CTC режиме.

TIMSK (Timer/Counter Interrupt Mask Register)


Общий регистр для всех трех таймеров ATmega16, он содержит флаги разрешения прерываний. Таймер Т0 может вызывать прерывания при переполнении счетного регистра TCNT0 и при совпадении счетного регистра с регистром сравнения OCR0. Соответственно для таймера Т0 в регистре TIMSK зарезервированы два бита — это TOIE0 и OCIE0. Остальные биты относятся к другим таймерам.

TOIE0 — 0-е значение бита запрещает прерывание по событию переполнение, 1 — разрешает.
OCIE0 — 0-е значение запрещает прерывания по событию совпадение, а 1 разрешает.

Естественно прерывания будут вызываться, только если установлен бит глобального разрешения прерываний — бит I регистра SREG.

TIFR (Timer/Counter0 Interrupt Flag Register)


Общий для всех трех таймеров-счетчиков регистр. Содержит статусные флаги, которые устанавливаются при возникновении событий. Для таймера Т0 — это переполнение счетного регистра TCNT0 и совпадение счетного регистра с регистром сравнения OCR0.

Если в эти моменты в регистре TIMSK разрешены прерывания и установлен бит I, то микроконтроллер вызовет соответствующий обработчик.
Флаги автоматически очищаются при запуске обработчика прерывания. Также это можно сделать программно, записав 1 в соответствующий флаг.

TOV0 — устанавливается в 1 при переполнении счетного регистра.
OCF0 — устанавливается в 1 при совпадении счетного регистра с регистром сравнения

SFIOR (Special Function IO Register)

Начинающему про этот регистр в принципе можно и не знать, один из его разрядов сбросывает 10-ти разрядный двоичный счетчик, который делит входную частоту для таймера Т0 и таймера Т1.

Сброс осуществляется при установке бита PSR10 (Prescaler Reset Timer/Counter1 и Timer/Counter0) в единицу.

Заключение

Нудная часть закончена. Далее разберем как настроить таймер на определенную частоту, как таймер ведет себя в разных режимах, как генерировать ШИМ сигнал.

8 битные таймеры счетчики

Описание работы таймера/счётчика 1.
Прерывания от TC1

Таймер/счётчик 1 (TC1) представляет из себя 16-битный модуль, содержащий 10 8-битных регистров. Эти регистры фактически являются набором из 5 16-битных регистров. Счёт происходит в регистрах TCNT1H (Timer counter 1 High byte) и TCNT1L (Low byte), вместе составляющих 16-битный регистр TCNT1. ВНИМАНИЕ! Если использовать прямое чтение 8-битных регистров TCNT1H и TCNT1L, то нельзя быть уверенным, что эти регистры прочитались одновременно. Может произойти следующая ситуация: Счётчик содержал значение $01FF, Вы считали TCNT1H (содержащий значение 01 в какую-то переменную). За это время произошёл счётный импульс, и содержимое TCNT1L стало равно $00, а в TCNT1H записалось значение $02. Теперь Вы читаете значение TCNT1L в другую переменную, получаете в этой переменной значение $00 (ведь таймер-счётчик уже произвёл счёт). 16-битное значение этих переменных получилось $0100, но на момент считывания старшего байта содержимое счётчика было $01FF, и младший байт у Вас должен был прочитаться как FF. Для предотвращения такой ситуации служит временный регистр, содержащийся в блоке таймера-счётчика. Этот регистр прозрачный, т.е. действует автоматически. При считывании значения регистра TCNT1L в переменную, содержимое TCNT1H попадает в этот регистр. Затем при чтении старшего байта в переменную, считывается значение временного регистра. Временный регистр абсолютно прозрачен для пользователя, но для его корректной работы необходимо соблюдать такую последовательность действий:
Для 16-битной операции записи, старший байт должен быть записан первым. Младший — вторым.
Для операции 16-битного чтения, младший байт должен быть прочитан первым, а содержимое старшего байта считывается вторым.
Регистр TCCR1A служит для задания режимов работы таймера/счётчика 1:

Биты COM1A1,COM1A0, COM1B1 и COM1B0 — контролируют поведение выводов OC1A и OC1B.
Биты FOC1A, FOC1B, WGM11 и WGM10 служат для задания работы ТС1 как широтно-импульсного модулятора.
Скорость счёта ТС1 можно установить в регистре TCCR1B:

Где биты ICNC1, ICES1, WGM13 и WGM12 также служат для PWM, а CS12, CS11 и CS10 настраивают скорость счёта следующим образом:

В случае, если в эти биты записаны значения 000, ТС0 остановлен. Если записано 001, то тактовая частота процессора подаётся через схему делителя без изменений, и на каждый такт процессора ТС1 увеличивает значение в регистре TCNT1. Соответственно, если в CSxx Записано 101, то увеличение значения в TCNT1 происходит на каждый 1024-ый такт процессора.

16-битные регистры OCR1A и OCR1Bслужат для задания значения, при достижении которого в режиме счёта, ТС1 генерирует соответствующие прерывания.

Обработка прерываний от TC1

ТС1 при переполнении значения TCNT1 посылает процессору сигнал Timer/Counter 1 Overflow. Также процессору посылается сигнал Timer/Counter 1 A или B Compare Match при совпадении значений в регистрах TCNT1 и OCR1A и OCR1B соответственно. Реакция процессора на эти сигналы (вызов соответствующих прерываний) зависит от значения регистров TIMSK и флага I в Status регистре процессора.
Для задания реакции на события TC1 в регистре TIMSK служат четыре бита:

Бит 2 — TOIE1 — Когда этот бит установлен в 1 и разрешены прерывания, процессор реагирует на сигнал переполнения ТС1 и вызывает прерывание по вектору $010 (OVF1addr).
Бит 3 — OCIE1B — Когда этот бит установлен в 1 и разрешены прерывания, процессор реагирует вызовом прерывания по вектору $00E (OC1Baddr) на событие совпадения счёта с константой в регистре OCR1B. Бит 4 — OCIE1A — Когда этот бит установлен в 1 и разрешены прерывания, процессор реагирует вызовом прерывания по вектору $00C (OC1Aaddr) на событие совпадения счёта с константой в регистре OCR1A. Бит 5 — TICIE1 — Если установлен этот бит и разрешены прерывания, разрешено прерывание захвата ТС1, расположенного по вектору $00A (ICP1addr).

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector