Общие положения |
Сторожевой таймер |
Регистры TIMSK и TIFR |
Таймер-счётчик 0 |
Таймер-счётчик 2 |
Таймер-счётчик 1 |
Функции сравнения |
ШИМ |
Автор |
Общие положения
В архитектуре AVR предусмотрены следующие типы таймеров-счётчиков:
1. Сторожевой таймер. 2. 8-разрядный таймер-счётчик T/C0. 3. 16-разрядный таймер-счётчик T/C1. 4. 8-разрядный таймер-счётчик T/C2.
В каждой модели присутствуют сторожевой таймер и T/C0. T/C1 реализован начиная с AT90S2313, а T/C2 - в ATMega. Собственно, общих слов достаточно, можно переходить к делу.
Сторожевой таймер
Если кому неизвестно, что значит "watchdog", то это в буквальном переводе -
"сторожевая собака". Назван этот таймер так, потому что его основная функция -
предохранять контроллер от "зависания" программы. Это вовсе не упрёк программистам,
как может показаться. Дело в том, что нельзя сконструировать абсолютно надёжные цепи
питания с идеальной стабилизацией и лишённые помех, а любая помеха по цепи питания
может стать причиной остановки основного тактового генератора. Вот тут то и вылезает
из конуры наша маленькая "собачка".
Тактируется сторожевой таймер от отдельного RC-генератора, нечувствительного к
нестабильности питания. Если он (таймер) включен, то программе необходимо
в определённые промежутки времени сбрасывать его командой wdr (Watchdog Reset).
Если сброса таймера не происходит, то он сам сбрасывает контроллер через промежуток времени,
определённый его предделителем.
Зачем такие сложности? А вот зачем. Контроллер никогда не занят игрой, допустим, в
"DOOM" или "QUAKE", как какой-нибудь "Pentium-III".
Он занят серьёзной работой, например производственным процессом. А теперь представьте, что
сбой произошел как раз в тот момент, когда ему надо среагировать на аварийную
ситуацию... А "Ctrl+Alt+Del" или "RESET" нажать то некому!..
Лучше среагировать на полсекунды позже, чем вообще не среагировать!!!
Теперь посмотрим, как же управляется наша "собачка".
Регистр WDTCR - регистр управления сторожевым таймером
- | - | - | WDTOE | WDE | WDP2 | WDP1 | WDP0 |
WDTOE - разрешение выключения сторожевого таймера.
Чтобы сбросить WDE, необходимо сначала установить этот бит.
Аппаратно сбрасывается через 4 цикла тактового генератора.
WDE - если установлен в "1", сторожевой таймер включен и наоборот
WDP0...WDP2 - установка периода сторожевого таймера.
WDP2 | WDP1 | WDP0 | Период в циклах RC-генератора |
0 | 0 | 0 | 16 K |
0 | 0 | 1 | 32 K |
0 | 1 | 0 | 64 K |
0 | 1 | 1 | 128 K |
1 | 0 | 0 | 256 K |
1 | 0 | 1 | 512 K |
1 | 1 | 0 | 1024 K |
1 | 1 | 1 | 2048 K |
Частота RC-генератора зависит от напряжения питания и находится в пределах от 300 кГц при 2,7 В до 1 МГц при 5 В.
Примечание:
В модели AT90S1200 бит WDTOE отсутствует.
Регистры TIMSK и TIFR
Регистры TIMSK и TIFR управляют системой прерываний таймеров 0...2. Я привожу конфигурацию этих регистров для модели ATMega, где в наличии все типы таймеров и все их функции. Для других моделей расположение управляющих битов может быть другим.
Регистр TIMSK - регистр масок прерываний таймеров
OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | OCIE0 | TOIE1 |
OCIE0, OCIE2 - разрешение прерывания по сравнению T/C0 и T/C2 соответственно.
Что такое преывание по сравнению, см. ниже.
TICIE1 - разрешение прерывания по событию на входе IC1.
TOIE0, TOIE1, TOIE2 - разрешение прерывания по переполнонию T/C0, T/C1 и T/C2
соответственно. Что такое преывание по переполнеию, объяснять, надеюсь, не надо.
OCIE1A, OCIE1B - разрешение прерывания по сравнению T/C1 с регистрами OCR1A и OCR1B
соответственно ( см. ниже ).
Регистр TIFR - регистр флагов прерываний таймеров
OCF2 | TOV2 | ICF1 | OCF1A | OCF1B | TOV1 | OCF0 | TOV0 |
В этом регистре определены флаги прерываний таймеров. Как работают регистры флагов пррываний, см. в разделе "Система прерываний".
Таймер-счётчик 0
Итак, повторим - Таймер-счётчик 0 - это 8-разрядный счетчик с прерыванием по
переполнению, предделителем, асинхронным тактированием, функцией сравнения и ШИМ. Напомню,
что все функции реализованы только в ATMega.
Начнем, пожалуй, с асинхронного режима. Этот режим управляется регистром ASSR:
- | - | - | - | AS0 | TCN0UB | OCR0UB | TCR0UB |
AS0 - разрешение асинхронного режима. Если установлен, T/C0 тактируется с отдельного
входа TOSC1. Если сброшен, T/C0 работает как обычный 8-разрядный таймер с тактированием от
генератора контроллера.
TCN0UB - флаг ожидания обновления TCNT0 в асинхронном режиме.
OCR0UB - флаг ожидания обновления OCR0 в асинхронном режиме.
TCR0UB - флаг ожидания обновления TCCR0 в асинхронном режиме.
Флаги ожидания устанавливаются при попытке записи в соответствующий регистр в
асинхронном режиме. После команды записи out значение заносится во временный
регистр, после чего устанавливается флаг. Сбрасавается он аппаратно после того, как
контроллер обновляет регистр. Если попытаться записать регистр при установленном
флаге ожидания, записываемое значение теряется.
Также при чтении OCR0 и TCCR0 контроллер выдаёт значение временного регистра.
Генератор часов реального времени рассчитан на применение кварца 32 768 Гц без внешних элементов. В режиме Power Save T/C0, установленный в асинхронный режим, продолжает функционировать.
Таймер-счётчик 2
Таймер-счётчик 2 полностью аналогичен T/C0 в синхронном режиме. В моделях, не содержащих
асинхронного таймера, он называется Таймер-счётчик 0, поэтому всё сказанное в этой главе
относится к асинхронному таймеру в синхронном режиме.
Регистр TCCRx (x=0 или 2 в зависимости от таймера) управляет режимами таймера
- | PWMx | COMx1 | COMx0 | CTCx | CSx2 | CSx1 | CSx0 |
PWMx - разрешение режима ШИМ ( см. ниже ).
Значения комбинаций COMxx определяют реакцию вывода OCx/PWMx в режиме сравнения с регистром OCRx.
ISCx1 | ISCx0 | Выход OCx/PWMx |
0 | 0 | Выключен |
0 | 1 | Переключение уровня на противоположный |
1 | 0 | 0 |
1 | 1 | 1 |
CTCx - разрешение очистки по событию сравнения с OCRx.
Значения комбинаций CSxx определяют величину делителя частоты ( F - основная тактовая
частота ):
CSx2 | CSx1 | CSx0 | Тактирование таймера | |
T/C0 | T/C2 | |||
0 | 0 | 0 | Выключен | Выключен |
0 | 0 | 1 | F | F |
0 | 1 | 0 | F/8 | F/8 |
0 | 1 | 1 | F/32 | F/64 |
1 | 0 | 0 | F/64 | F/256 |
1 | 0 | 1 | F/128 | F/1024 |
1 | 1 | 0 | F/256 | Вход T2, обратный фронт |
1 | 1 | 1 | F/1024 | Вход T2, прямой фронт |
Напомню, для моделей без асинхронного таймера всё сказанное для T/C2 справедливо для T/C0.
Таймер-счётчик 1
Кажется, что я непоследователен в изложении материала. Но это не совсем так. T/C1
16-разрядный таймер с двумя выходами сравнения и регулируемым ШИМ, а также снабжённый
подавителем дребезга при регистрации внешних событий в паре с
компаратором. Как видим, это достаточно сложное
устройство.
А начнём мы его изучение с регистров управления.
Регистр TCCR1A :
COM1A1 | COM1A0 | COM1B1 | COM1B0 | - | - | PWM11 | PWM10 |
COM1Ax - функция сравнения по каналу OC1A.
COM1Bx - функция сравнения по каналу OC1B.
Определяет состояние выхода OC1x по событию сравнения по каналу A или B.
COM1x1 | COM1x0 | Выход OC1x |
0 | 0 | Выключен |
0 | 1 | Переключение уровня на противоположный |
1 | 0 | 0 |
1 | 1 | 1 |
PWMx - режим ШИМ.
PWM1 | PWM0 | Режим ШИМ |
0 | 0 | Выключен |
0 | 1 | 8-разрядный ШИМ |
1 | 0 | 9-разрядный ШИМ |
1 | 1 | 10-разрядный ШИМ |
Регистр TCCR1B :
ICNC1 | ICES1 | - | - | CTC1 | CS12 | CS11 | CS10 |
ICNC1 - подавитель дребезга. Если установлен, то определение события
на входе IC1 происходит с задержкой на 4 машинных цикла. Напомню, что такое
определение входного события - если установлен бит разрешения TICIE1 в
TIMSK, то по событию на входе IC1 содержимое регистра TCNT1
заносится в регистр ICR1.
ICES1 - если установлен, то прерывание по входному событию вызывается прямым
фронтом, если сброшен - обратным.
CTC1 - если установлен, то после вызова прерывания по сравнению по каналу A
регистр TCNT1 сбрасывается в 0.
CS10...CS12 - определение режима и частоты тактирования T/C1.
CSx2 | CSx1 | CSx0 | Тактирование таймера |
0 | 0 | 0 | Выключен |
0 | 0 | 1 | F |
0 | 1 | 0 | F/8 |
0 | 1 | 1 | F/64 |
1 | 0 | 0 | F/256 |
1 | 0 | 1 | F/1024 |
1 | 1 | 0 | Вход T1, обратный фронт |
1 | 1 | 1 | Вход T1, прямой фронт |
Функции сравнения
Блок таймеров предусматривает функцию прерывания по сравнению содержимого регистра таймера
с содержимым регистра сравнения. Прерывание сравнения, которое вызывается, когда значение
таймера больше значения регистра сравнения, может сопровождаться изменением логического уровня на
выходе сравнения.
Регистры таймеров и регистры сравнения связаны следующим образом:
Таймер | Регистры сравнения | Выход сравнения |
TCNT0 | OCR0 | OC0 |
TCNT1 | OCR1A | OC1A |
OCR1B | OC1B | |
TCNT2 | OCR2 | OC2 |
Прерывание по сравнению, если оно присутствует в используемой вами модели, предпочтительнее прерывания по переполнению. Во-первых, просто с числом легче работать, чем с его дополнением до 2, а вы загружаете в регистр сравнения именно число, с которым хотите сравнить таймер. Во-вторых, нет необходимости каждый раз загружать в таймер делитель при выходе из прерывания - это может сделать контроллер при установленном бите CTCx - просто сбросит таймер. И в-третьих, есть выход, который может тоже сгенерировать событие без участия программы.
ШИМ
ШИМ, или PWM - это широтно-имрульсная модуляция сигнала.
Продолжение следует...
© Берёзкин С.Е., 2001 г.