Таймер на attiny2313
Добавлено: Вс окт 05, 2014 06:15:20
Помогите с таймером. Хочу чтобы через каждую минуту в 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
.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