CODE
.EQU COUNT_LED_OFF = 0xF0
.EQU COUNT_LED_ON = 0xF0
.org 0
jmp RESET
.org OVF2addr
jmp OVF2
.org 0x46
OVF2:
push R16
push R30
push R31
; остановим таймер
clr R16
out TCCR2,R16
sbi PORTA,2 ; фронт импульса на осциллограф
ldi R16,COUNT_LED_ON
out TCNT2,R16
; запустим таймер
ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс
out TCCR2,R16
pop R31
pop R30
pop R16
cbi PORTA,2
reti
RESET:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi R16,0xFF
out DDRC,R16
ldi R16,0b00000111
out DDRA,R16
ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс
out TCCR2,R16
in R16,TIFR
andi R16,0b00111111
out TIFR,R16
in R16,TIMSK
ori R16,0b01000000
out TIMSK,R16
andi R24,0b11111100
ldi R16,COUNT_LED_OFF
out TCNT2,R16
sei
loop:
rjmp loop
.EQU COUNT_LED_ON = 0xF0
.org 0
jmp RESET
.org OVF2addr
jmp OVF2
.org 0x46
OVF2:
push R16
push R30
push R31
; остановим таймер
clr R16
out TCCR2,R16
sbi PORTA,2 ; фронт импульса на осциллограф
ldi R16,COUNT_LED_ON
out TCNT2,R16
; запустим таймер
ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс
out TCCR2,R16
pop R31
pop R30
pop R16
cbi PORTA,2
reti
RESET:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi R16,0xFF
out DDRC,R16
ldi R16,0b00000111
out DDRA,R16
ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс
out TCCR2,R16
in R16,TIFR
andi R16,0b00111111
out TIFR,R16
in R16,TIMSK
ori R16,0b01000000
out TIMSK,R16
andi R24,0b11111100
ldi R16,COUNT_LED_OFF
out TCNT2,R16
sei
loop:
rjmp loop
Осцилом встал на bit 2 порта A.
Проблема в том, что период между фронтами импульсов непостоянный - то 1 мс, то ~ 0.7 мс, т.е. прерывания по таймеру возникают с разным периодом.
Никакие другие прерывания не разрешены.
Где порыть?