Страница 1 из 1

Таймер на attiny2313

Добавлено: Вс окт 05, 2014 06:15:20
DenChik87
Помогите с таймером. Хочу чтобы через каждую минуту в PortВ инкрементировался на единицу, для этого написал нижеприведенный текст программы. Но при первом прохождении цикла программы значение выводимое в PortB увеличивается сразу на два, а с каждым последующем циклом на 1 как и задумано. Так программа ведет себя и в реале и при симуляции в протеусе. Почему так?

.device ATtiny2313
.include "tn2313def.inc"
.def t1=R16
.def t2=R17
.def t3=R18
.def t4=R19
.def counter=R20
.def t26=r26
.def t27=r27

rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti


Reset: ldi t1,low(RAMEND)
out SPL,t1

ldi t1,0b11111111 ;настройка порта В
out DDRB,t1

ldi t1,0 ;настройка порта D
out DDRD,t1
ldi t1,0xff
out PORTD,t1

ldi counter,0


ldi t1,0xe2 ;загружаем число e4e2
ldi t2,0xe4 ;в регистр сравнения т.е. 1мин
out ocr1ah,t2
out ocr1al,t1

ldi t1,1<<ocie1a ;разреш маски прерывания
out timsk,t1 ;таймера1 по совподению

ldi t1,1<<cs12|1<<cs10 ;предделитель 1024
out tccr1b,t1

sei

Cikl: rjmp Cikl


Timer1_comp1:
ldi t1,0 ;обнуляем регистр сравнения
out tcnt1l,t1
out tcnt1h,t1

inc counter ;выводим что насчитали в порт
out portb,counter

reti

Re: Таймер на attiny2313

Добавлено: Вс окт 05, 2014 13:20:33
akl
Может быть из-за того, что запись в 16-разрядный регистр периферии TCNT1 сделана неправильно.

Код: Выделить всё

Timer1_comp1:
	ldi t1,0 ;обнуляем регистр сравнения
	;out tcnt1l,t1
	out tcnt1h,t1
	out tcnt1l,t1
По мне, лучше использовать режим CTC, тогда вышеприведённые команды не нужны.

Re: Таймер на attiny2313

Добавлено: Вс окт 05, 2014 15:30:16
DenChik87
А что неправильного? И как иначе тогда обнулить регистр счета TCNT1L И TCNT1H?

Re: Таймер на attiny2313

Добавлено: Вс окт 05, 2014 15:44:14
akl
Из DS
To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low byte must be read before the high byte.

Re: Таймер на attiny2313

Добавлено: Вс окт 05, 2014 15:44:50
ks0
Пишут сначало в H, потом в L. Читают наоборот.
И да, правильно в СТС делать, тогда обнулять ниче не надо. Просто установите в TCCR1B WGM12 (или че там), тогда счетчик сбрасывается по достижению OCR1A

Re: Таймер на attiny2313

Добавлено: Вс окт 05, 2014 17:48:30
DenChik87
Да действительно если с начало очистить H, а затем L все работает как надо. Спасибо всем за помощь :))