В общем суть в следующем. Программа досчитывает до нужного числа, т.е. регистры TCNT1H, TCNT1L сбрасываются в 0 при досчете. В этот момент флаги OCF1A (OCF1B) в регистре TIFR устанавливаются, но прерывания не возникают. Глобальный флаг прерываний установлен в 1.
Привожу собственно код программы:
Привожу собственно код программы:
Код: Выделить всё
.include "m32def.inc"
.def tmpL = r17
.def tmpH = r18
.org 0x0000
rjmp RESET ; Salt neconditionat
.org OC1Aaddr ; Output Compare1A Interrupt Vector Address
rjmp TMR1_INR
.org OC1Baddr ; Output Compare1B Interrupt Vector Address
rjmp TMR1_INR
.MACRO outi
LDI R16,@1
OUT @0,R16
.ENDM
; prerivanie timer
TMR1_INR:
outi PORTC,0xff
reti
RESET:
; zapreshaem prerivaniya
cli
; initializatsiya steka
ldi tmpH, High(RAMEND)
out SPH, tmpH
ldi tmpL, Low(RAMEND)
out SPL, tmpL
; ocishaem tmpL
CLR tmpL
ser tmpL
out DDRB, tmpL ;na vyvod
out DDRC, tmpL ;na vyvod
out DDRD, tmpL ;na vyvod
;out PORTA,tempL ;podtiagivaiuscii rezistor
; kasaemo taimera
outi TCNT1H,0
outi TCNT1L,0
;zapis vremeni tsikla sciotcika
outi OCR1BH,high(1000) ; 1000
outi OCR1BL,low(1000)
outi OCR1AH,high(1000)
outi OCR1AL,low(1000)
outi TIFR,(1<<TOV1)
outi TCCR1B,(1<<CS10)|(1<<WGM12); prescaler
; razreshaem prerivaniya
sei
rjmp MAIN
MAIN:
rjmp MAIN
