Управление таймером attiny13. Использование таймера timer0
В этой статье я подробно разберу таймер микроконтроллера attiny13 (он же attiny13a) он же обладает единственным восьмибитным таймером timer0, у которого настооолько много всяких режимов, что эта мнимая восьмибитная простота превращается только в одно слово - ашалеть.
Статья разбита на раздел с общим описанием и поэтапных программ, который тестирует различные режимы таймера. Активно представлены ассоциации в виде животных для лучшего запоминания структуры регистров таймера.
Если вам нужны быстрые примеры, а не этот datasheet, то вам сюда: Задержка времени на attiny13
Что такое таймер Timer0 в микроконтроллере attiny13
Timer0 - это набор адресов регистров в памяти микроконтроллера, которые каким-либо образом связаны с таймером. Для attiny13 это довольно незначительное количество. Перечислю ниже.
Регистры таймера Timer0 (TC0) микроконтроллера attiny13
Таблица 1 - Все зависимые регистры таймера timer0 для микроконтроллера attiny13 (в порядке упоминания в datasheet)
Название в файле tn13def.inc | Описание |
TCCR0A | Управление таймером (начало) - Настройка спец режимов шим - Настройка Канал А и канала Б для дрыгоножки |
TCCR0B | Управление таймером (середина) - Настройка источника тактовых импульсов - Настройка делителя частоты для увеличения значения таймера |
TCNT0 |
Собственно значение таймера, которое можно прочитать в основном потоке программы или установить его. Так как таймер у нас 8 битный значения в нем изменяются от 0 до 255 |
OCR0A | Для сравнения значения таймера со значением этого регистра и вызова прерывания (Канал A) |
OCR0B | Для сравнения значения таймера со значением этого регистра и вызова прерывания (Канал B) |
TIMSK0 | Управление таймером (конец) - Все что связанно с настройкой прерываний |
TIFR0 | Посмотреть от какого прерывания сработал таймер |
TCCR0A - регистр управления
Регистр управляет настройками режимов ШИМ генерации и для управление передачей состояния ШИМ на ножки 5 и 6 микроконтроллера attiny13. Итак посмотрим на детальную расшифровку.
- контролировать, от слова control
- ШИМ, сигнал ШИМ больше похож на червяка
TCCR0A (Timer/Counter Control Register) регистр управления, который делится на три абстрактных подрегистра по 2 бита. Структура регистра выглядит следующим образом:
Коротко о каждом подрегистре представлена в таблице ниже
WGM0 | Задает спец режимы работы таймера (нормальный, дрыгоног, дрыгосравнить, и т.д.) |
COM0A | Настройка режима работы ножки OC0A для работы жабы OCR0A (на каждый режим WGM0 свой эффект) |
COM0B | Настройка режима работы ножки OC0B для работы жабы OCR0B (на каждый режим WGM0 свой эффект) |
WGM0 - подрегистр TCCR0A и TCCR0B, режимы таймера
Отвечает за режим генерации формы импульсов таймера при различных обстоятельствах. Поэтому раскинулся аж на два регистра TCCR0A и TCCR0B, который итого занимает 3 бита (а находится в двух по 8 бит каждый). Поэтому рассматривается в общей таблице. Но часть таблицы будет выделанная серым цветом, она отвечать только за то, что включен доп вариант работы WGM00, WGM01 в регистре TCCR0B установлен бит WGM02. Полное описание режимов в datasheet (11.7 Modes of Operation).
Отдельно коснусь обозначений
TOP - где брать значения для сработки, может напрямую из константы 0xFF или из регистра жабы OCR0
MAX - для tiny 0xFF, т.е. максимальное для одного байта
BOTTOM - 0x00, т.е. просто 0
Режим | WGM02 | WGM01 | WGM00 | Описание | TOP | Когда обновить OCR0 | Установка флага TOV на |
0 | 0 | 0 | 0 | Normal (по умолчанию) Счетчик |
0xFF | немедленно | MAX |
1 | 0 | 0 | 1 | PWM ШИМ, возможен с коррекцией фазы |
0xFF | TOP | BOTTOM |
2 | 0 | 1 | 0 | CTC Очистить таймер в режиме сравнения |
OCRA | немедленно | MAX |
3 | 0 | 1 | 1 | Fast PWM Быстрый ШИМ |
0xFF | TOP | MAX |
4 | 1 | 0 | 0 | Reserved Зарезервировано (ничего не делает) |
- | - | - |
5 | 1 | 0 | 1 | RWM ШИМ, возможен с коррекцией фазы |
OCRA | TOP | BOTTOM |
6 | 1 | 1 | 0 | Reserved Зарезервировано (ничего не делает) |
- | - | - |
7 | 1 | 1 | 1 | Fast PWM Быстрый ШИМ |
OCRA | TOP | TOP |
COM0A регистр конфигурации ноги OC0A
Конфигурируется при различных режимах Обычный (таб. 1), ШИМ (таб. 2), ШИМ коррекцией фаз (таб. 3)
Таблица 1 - Режим обычный WGM02 0x0
COM0A1 | COM0A0 | Состояние ноги OC0A (ножка номер 5) |
0 | 0 | Ножка выключена (туда не подаются импульсы) |
0 | 1 | Если TCNT0 достигает значение OCR0A изменяет состояние ножки 5 на противоположное (0 на 1, 1 на 0) |
1 | 0 | Если TCNT0 достигает значение OCR0A, то установить ножку 5 в 0 (сбросить) |
1 | 1 | Если TCNT0 достигает значение OCR0A, то установить ножку 5 в 1 (установить) |
Таблица 2 - Режим ШИМ (PWM)
COM0A1 | COM0A0 | Состояние ноги OC0A (ножка номер 5) | |
0 | 0 | Ножка выключена (туда не подаются импульсы) | |
0 | 1 | Ножка выключена (туда не подаются импульсы) | Только когда WGM02 0x0 |
0 | 1 | Если TCNT0 достигает значение OCR0A изменяет состояние ножки 5 на противоположное (0 на 1, 1 на 0) |
Только когда WGM02 0x1 |
1 | 0 | Если TCNT0 достигает значения 0x00, то установить ножку 5 в 1 (установить) Если TCNT0 достигает значение OCR0A, то установить ножку 5 в 0 (сбросить) |
Неинверсный режим |
1 | 1 | Если TCNT0 достигает значения 0x00, то установить ножку 5 в 0 (сбросить) Если TCNT0 достигает значение OCR0A Установить ножку 5 в 1 (установить) |
Инверсный режим |
Таблица 3 - Режим ШИМ c коррекцией фазы (PWM)
COM0A1 | COM0A0 | Состояние ноги OC0A (ножка номер 5) | |
0 | 0 | Ножка выключена (туда не подаются импульсы) | |
0 | 1 | Ножка выключена (туда не подаются импульсы) | Только когда WGM02 0x0 |
0 | 1 | Если TCNT0 достигает значение OCR0A изменяет состояние ножки 5 на противоположное (0 на 1, 1 на 0) |
Только когда WGM02 0x1 |
1 | 0 |
Если TCNT0 достигает значение OCR0A, то Если TCNT0 достигает значение OCR0A, то |
|
1 | 1 |
Если TCNT0 достигает значение OCR0A, то Если TCNT0 достигает значение OCR0A, то сбросить ножку 5 в 0 только при операции уменьшения TCNT0. |
COM0B регистр конфигурации ноги OC0B
Конфигурация и описание этого регистра идентична конфигурации COM0A, поэтому здесь я ничего писать не буду.
Единственное что там нужно заменить:
COM0A0 - COM0B0
COM0A1 - COM0B1
Ножка 5 - Ножка 6
OCR0A - OCR0B
TCCR0B - регистр управления
Самый важный регистр из всех которые тут тока есть. Собственно отсюда и происходит включение таймера. Сердце от которого запитывается timer0. Так как для включения таймера нужен источник сердцебиения, то выбором его он и занимается.
- контролировать, от слова control
- сердце, бьется в такт
TCCR0B состоит из 3 спаянных регистров, регистр WGM02 который вообще начинается в регистре TCCR0A,
регистр CS0 который выбирает источник тактирования или выключает таймер.
CS0 - регистр включения и выбор источника тактирования
Что нужно чтобы сердце работало? Правильно, включить его. Вот для этих целей служит таблица выбора источника тактирования с внутренним предделителем. Для настройки предделителя и за одно включения и служит этот регистр.
CS02 | CS01 | CS00 | Описание |
0 | 0 | 0 | Таймер выключен (по умолчанию) |
0 | 0 | 1 | подключить источник тактирования к внутреннему тактовому генератору CLK Увеличение TCNT0 1 раз в 1 такт МК. |
0 | 1 | 0 | CLK/8 Увеличение TCNT0 1 раз в 8 тактов МК. |
0 | 1 | 1 | CLK/64 Увеличение TCNT0 1 раз в 64 такта МК. |
1 | 0 | 0 | CLK/256 Увеличение TCNT0 1 раз в 256 тактов МК. |
1 | 0 | 1 | CLK/1024 Увеличение TCNT0 1 раз в 1024 такта МК. |
1 | 1 | 0 | Внешний источник тактирования от 7 (T0) ножки attiny13 по спаду сигнала |
1 | 1 | 1 | Внешний источник тактирования от 7 (T0) ножки attiny13 по нарастанию сигнала |
(статья недописана)