Режимы таймера attiny13. Нормальный режим.

Нормальный режим таймера 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


Работа программы:

Работа нормального режима таймера attiny13

Программа 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          ; бесконечный цикл

Работа программы

Таймер attiny13 в нормальном режиме с прерываниями

{{ x.text }}