Управление таймером 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 бита. Структура регистра выглядит следующим образом:

Описание TCCR0A для attiny13

Коротко о каждом подрегистре представлена в таблице ниже

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, то
сбросить ножку 5 в 0 только при операции увеличения    TCNT0.

Если  TCNT0 достигает значение  OCR0A, то
установить ножку 5 в 1 только при операции уменьшения TCNT0.

1 1

Если  TCNT0 достигает значение  OCR0A, то
установить ножку 5 в 1 только при операции увеличения   TCNT0.

Если  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 по нарастанию сигнала

(статья недописана)

{{ x.text }}