Режимы таймера attiny13. Нормальный режим.
Нормальный режим - самый простой из режимов, запускающийся автоматически, когда поданы тактовые импульсы на таймер. Для того чтобы подать тактовые импульсы необходимо перевести состояние регистра CS0 порта TCCR0B из 0b00 в любое другое, например для того чтобы тактировать нормальный режим напрямую от тактового генератора нужно записать в регистр CS0 значение 0b01.
Нормальный режим работы можно установить вручную, записав в регистр WG0 значение 0x00.
Программа 1. Простейший режим работы таймера timer0 attiny13
В простейшем режиме после выбора источника тактирования CS0 (см описание CS0) автоматически начинает увеличиваться значения регистра TCNT0.
Код запуска режима:
.include "tn13def.inc"
.cseg
.org 0x00
rjmp reset ; точка входа в программу
reset:
ldi r16, (1<<CS00) ; Включаем режим тактирования от тактового генератора
out TCCR0B, r16 ; Записываем в порт значение
loop:
rjmp loop
Работа программы:
Программа 2. Использование прерывания по переполнению TCNT0
Что делать если нужно вызвать определенный код раз в 256 тактов? Правильно, подрубить прерывание по переполнению регистра TCNT0. Для этого нужно включить глобальные прерывания и разрешить прерывания по таймеру. Ах да, понадобится еще полный вектор прерываний и инициированный стек. Поэтому код программы длинный:
.include "tn13def.inc"
.cseg
.org 0x00
; Вектор прерываний attiny13a
; См. Таблицу вектора прерываний в datsheet на attiny13a стр. 45
; Ссылка на datasheet https://radiokot.ru/articles/36/01.pdf
rjmp reset ; 0x0000 ; reset ; точка входа в программу (подача питания, подача питания на пин reset, детектор просадки напряжения, сброс по watchdog)
rjmp reset ; INT0addr ; External Interrupt 0 ; внешние прерывание 0
rjmp reset ; PCI0addr ; External Interrupt Request 0 ; изменения пинов прерывание 0
rjmp overflow ; OVF0addr ; Timer/Counter0 Overflow ; таймер/счетчик переполнения 0
rjmp reset ; ERDYaddr ; EEPROM Ready ; говность EEPROM
rjmp reset ; ACIaddr ; Analog Comparator ; сработка аналогово компоратора
rjmp reset ; OC0Aaddr ; Timer/Counter Compare Match A ; таймер/счетчик сравнение с A
rjmp reset ; OC0Baddr ; Timer/Counter Compare Match B ; таймер/счетчик сравнение с B
rjmp reset ; WDTaddr ; Watchdog Time-out ; сработка watchdog таймера
rjmp reset ; ADCCaddr ; ADC Conversion Complete ; завершение работы
overflow: ; Выполнится при переполнении TCNT0
inc r17 ; Увеличить значение r17 раз в 256 тактов
reti ; Выход из прерывания и вкл глобальные прерывания
reset:
; Настройка стека (онли attiny13)
ldi r16,LOW(RAMEND)
out SPL,r16
sei ; Включаем глобальные прерывания
; Разрешаем прерывание от переполнения TCNT0
ldi r16, (1<<TOIE0)
out TIMSK0, r16
; Настройка всех пинов на выход (шоб дрыгать ногой)
ldi r16, (1<<CS00) ; Включаем режим тактирования от тактового генератора
out TCCR0B, r16 ; Записываем в порт значение режима тактирования
loop:
rjmp loop ; бесконечный цикл
Работа программы