AVR использование таймеров (TIMER0)

Timer0 — простой 8битный таймер. При переполнении счетчика TCNT0 (0xFF->0x00) выбрасывает прерывание по-вектору 10 (0x009) TIMER0_OVF.

Параметры таймера задаются регистром TCCR0 , точнее первыми 3-мя битам (Clock Select) этого регистра: CS00,CS01,CS02 – выбор тактового источника

CS02 CS01 CS00
0       0       0 – нет источника, таймер остановлен
0       0       1 – без предделителя, на вход таймера подается тактовая частота
0       1       0 – clock/8 (предделитель/prescaler)
0       1       1 – clock/64 (предделитель/prescaler)
1       0       0 – clock/256 (предделитель/prescaler)
1       0       1 – clock/1024 (предделитель/prescaler)
1       1       0 – внешний источник, по фронту
1       1       1 – внешний источник, по спаду

Для работы необходим разрешить соответствующее прерывание в регистре TIMSK установкой бита TOIE0

Сброс предделителя можно осуществить установив соответствующий бит (для ATMega8 это PSR10) регистра SFIOR.

В ATmega8 для timer0 и timer1 регистр предделителя общий, и надо внимательно относиться, т.к. возможны проблемы: если на вход таймер0 подается clk, на таймер1 clk/1024, а в обработчике TIMER0_OVF происходит установка PSR10, то TIMER1 работать перестанет, т.к. каждые 256 тактов счетчик предделителя будет обнуляться, и значения clk/1024 ни разу не достигнет.

Пример использования для GCC AVR: main.c

Добавить комментарий