Программирование микроконтроллеров. Часть 8-1
Режимы работы таймеров-счетчиков
Сначала решил, что эта часть будет под номером 7-2, но, когда начал писать статью, понял, что статья получиться большой и поэтому я ее решил разбить на две статьи. Соответственно у них будут номера 8-1 и 8-2.
В микроконтроллере ATmega328 есть три таймера. 2 из них по 8 бит (T0, T2) и один 16 бит (T1). Для них всех есть одинаковые режимы работы:
Обычный режим работы. Самый распространенный режим, когда таймер просто считает приходящие импульсы и при переполнении счетного регистра устанавливает флаг прерывания по переполнению. При этом счетный регистр сбрасывается в 0 и подсчет импульсов начинается сначала.
Режим подсчета импульсов (Сброс при совпадении). Также называется CTC. В этом режиме при совпадении счетного регистра с одним из регистров сравнения выставляется флаг прерывания по совпадению, счетный регистр обнуляется и подсчет начинается сначала. При этом по совпадению может меняться сигнал на выходе таймера, соответствующего используемому регистру совпадения.
Режим ШИМ. В данном режиме изменяется ширина импульса в зависимости от значения, записанного в регистр совпадения. Для 8-битного таймера, к примеру, если записать в регистр совпадения число 10, состояние логической единицы на выходе совпадения будет 10 тактов из 256, а логический 0 246 тактов из 256 (для не инверсного режима). В инверсном же режиме 10 тактов будет состояние логического 0 и 246 тактов логической единицы.
Режим коррекции фазы ШИМ. В обычном режиме ШИМ мы получаем плавающую фазу выходного сигнала. Для того, чтобы этого избежать, в режиме коррекции фазы ШИМ при достижении максимального значения, счетный регистр таймера/счетчика начинает уменьшатся. Это происходит циклически.
Это все основные режимы работы таймеров/счетчиков. К примеру, у таймера/счетчика T0 присутствуют только они.
Дополнительные режимы работы таймера/счетчика T2:
- Асинхронный режим работы. В асинхронном режиме работы к микроконтроллеру подключается внешний кварцевый резонатор 32 кГц. Чаще всего этот режим используется для работы таймера/счетчика T2 в качестве часов реального времени.
Дополнительные режимы работы таймера/счетчика T1:
Режим коррекции фазы и частоты ШИМ. Отличается от режима коррекции фазы ШИМ лишь моментом обновления регистра сравнения. Регистр сравнения обновляется, когда значение счетного регистра достигает минимума.
Режим захвата. При поступлении сигнала от аналогового компаратора, а также на вывод ICP1 (14 ножка) значение счетного регистра сохраняется в регистре захвата, устанавливая при этом флаг прерывания по захвату.
Таймер-счетчик T0 (8 бит)
Характеристики таймера/счетчика T0 (8 бит):
- Два независимых выхода по совпадению
- Таймер сброса при совпадении
- Изменяемый период ШИМ сигнала
- Фазовый корректор ШИМ сигнала
- Тактовый генератор
- Три независимых источника прерывания
Регистры таймера/счетчика T0:
- TCNT0 - счетный регистр таймера/счетчика T0
- OCR0A - регистр сравнения A
- OCR0B - регистр сравнения B
- TIMSK0 - регистр маски прерываний для таймера/счетчика T0
- TIFR0- регистр флагов прерываний для таймера/счетчика T0
- TCCR0A - регистр управления A
- TCCR0B - регистр управления B
Источником тактового сигнала для таймера/счетчика T0 может быть, как тактовый сигнал используемый для всего микроконтроллера с использованием предделителя, так и сигнал, поступающий на вход T0 (6 ножка). Если не выбрано ни одного источника тактового сигнала, то таймер/счетчик останавливается.
Режим работы таймера/счетчика T0 устанавливается регистрами TCCR0A и TCCR0B.
Регистр TCCR0A:
Биты COM0A1 (7) и COM0A0 (6) влияют на то, какой сигнал появится на выводе OC0A (12 ножка) при совпадении с A (совпадение значения счетного регистра TCNT0 со значением регистра сравнения OCR0A):
1. Обычный режим
- 00 - вывод OC0A не функционирует
- 01 - изменение состояния вывода OC0A на противоположное при совпадении с A
- 10 - сброс вывода OC0A в 0 при совпадении с A
- 11 - установка вывода OC0A в 1 при совпадении с A
2. Режим ШИМ
- 00 - вывод OC0A не функционирует
- 01 - если бит WGM02 регистра TCCR0B установлен в 0, вывод OC0A не функционирует
- 01 - если бит WGM02 регистра TCCR0B установлен в 1, изменение состояния вывода OC0A на противоположное при совпадении с A
- 10 - сброс вывода OC0A в 0 при совпадении с A, установка вывода OC0A в 1 если регистр TCNT0 принимает значение 0x00 (неинверсный режим)
- 11 - установка вывода OC0A в 1 при совпадении с A, установка вывода OC0A в 0 если регистр TCNT0 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 - вывод OC0A не функционирует
- 01 - если бит WGM02 регистра TCCR0B установлен в 0, вывод OC0A не функционирует
- 01 - если бит WGM02 регистра TCCR0B установлен в 0, изменение состояния вывода OC0A на противоположное
- 10 - сброс вывода OC0A в 0 при совпадении с A во время увеличения значения счетчика, установка вывода OC0A в 1 при совпадении с A во время уменьшения значения счетчика
- 11 - установка вывода OC0A в 1 при совпадении с A во время увеличения значения счетчика, сброс вывода OC0A в 0 при совпадении с A во время уменьшения значения счетчика
Биты COM0B1 (5) и COM0B0 (4) влияют на то, какой сигнал появится на выводе** OC0B** (11 ножка) при совпадении с B (совпадение значения счетного регистра TCNT0 со значением регистра сравнения OCR0B):
1. Обычный режим
- 00 - вывод OC0B не функционирует
- 01 - изменение состояния вывода OC0B на противоположное при совпадении с B
- 10 - сброс вывода OC0B в 0 при совпадении с B
- 11 - установка вывода OC0B в 1 при совпадении с B
2. Режим ШИМ
- 00 - вывод OC0B не функционирует
- 01 – резерв
- 10 - сброс вывода OC0B в 0 при совпадении с B, установка вывода OC0B в 1 если регистр TCNT0 принимает значение 0x00 (неинверсный режим)
- 11 - установка вывода OC0B в 1 при совпадении с B, установка вывода OC0B в 0 если регистр TCNT0 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 - вывод OC0B не функционирует
- 01 – резерв
- 10 - сброс вывода OC0B в 0 при совпадении с B во время увеличения значения счетчика, установка вывода OC0B в 1 при совпадении с B во время уменьшения значения счетчика
- 11 - установка вывода OC0B в 1 при совпадении с B во время увеличения значения счетчика, сброс вывода OC0B в 0 при совпадении с B во время уменьшения значения счетчика
Биты WGM01 (1), WGM00 (0) регистра TCCR0A устанавливают режим работы таймера/счетчика T0:
- 00 - обычный режим
- 01 - режим коррекции фазы ШИМ
- 10 - режим подсчета импульсов (сброс при совпадении)
- 11 - режим ШИМ
Регистр TCCR0B:
Биты FOC0A (7) и FOC0B (6) регистра TCCR0B принудительно устанавливают значение на выводах OC0A и OC0B.
Биты CS02 (2), CS01 (1), CS00 (0) регистра TCCR0B устанавливают режим тактирования и предделителя тактовой частоты таймера/счетчика T0:
- 000 - таймер/счетчик T0 остановлен
- 001 - тактовый генератор CLK
- 010 - CLK/8
- 011 - CLK/64
- 100 - CLK/256
- 101 - CLK/1024
- 110 - внешний источник на выводе T0 (6 ножка) по спаду сигнала
- 111 - внешний источник на выводе T0 (6 ножка) по возрастанию сигнала
Управление прерываниями от таймера осуществляется в регистре TIMSK0.
Регистр TIMSK0:
Биты OCIE0B (2) и OCIE0A (1) разрешают прерывания при совпадении с A и B, а бит TOIE0 (0) разрешает прерывание по переполнению при установке 1. Если в эти биты записать 0, прерывания от таймера/счетчика будут запрещены.
Также есть регистр флагов прерываний TIFR0, который показывает какое прерывание поступило от таймера/счетчика T0.
Регистр TIFR0:
Биты OCF0B (2), OCF0A (1) и TOV0 (0) устанавливаются в 1 в зависимости от того, какое прерывание поступило - совпадение с A, B или переполнение.
Продолжение описания работы таймеров-счетчиков Т1 и Т2 смотрите в следующей части.
Если есть вопросы и предложения по этому уроку, пишите комментарии буду рад ответить на ваши вопросы.
Часть 1
Часть 2-1 Часть 2-2
Часть 3-1 Часть 3-2
Часть 4-1 Часть 4-2
Часть 5
Часть 6-1 Часть 6-2
Часть 7