Шрифт:
ORG $00
rjmp RESET
ORG $10
RESET:
ldi temp,low(RAMEND)
out SPL,temp
ldi temp,CDDRB; put in/out
out DDRB,temp
ldi temp,CDDRD
out DDRD,temp
ldi periodl,low(FIRSTFREQ); put Initial frequency
таймера, импульсов импульсов
ldi periodh,high(FIRSTFREQ)
ldi temp,PUTTCCR1B; put CK
out TCCR1B,temp
sbi P0RTB,4; extinguish diods
sbi PORTB,3
ldi flag,0b00000001
ldi smallth,0
ldi smallth,0
ldi temph,0
ldi tempi,0
rjmp MAIN
RSTTIMER:; reset's counter
ldi tempi,0
out TCNT1H,tempi
ldi tempi,0
out TCNT1L,tempi; RESET timeout timer
ret
WAITMATCH:
ldi temp,0b01000000; очищаем 7 бит
out TIFR,temp
LOOP:
in temp,TIFR; wait for matching flag
sbrc flag,2
rjmp LOOPT
in tempi, TCNT1H; сравнение старш. частей текущ. вр. и 1/4 пер.
ср timeh,temp1
breq Р
in tempi, TCNT1H
cp timeh,tempi
brio EXIT
LOOPT:; идем сюда из диодов, так как нам не надо сравнивать текущ. вр. с вр. тек. + 1/4 пер
sbrs temp,6
rjmp LOOP
EXIT:
ret
P:; сравнение младш частей
in temp1, TCNT11
cp temp1,time1
brio LOOP
ldi flag,1
cp tempi,time2
brge EXIT
DIV:; divide in 4
sec
clс
ror temph
ror temp1
clс
ror temph
ror tempi ret
FIRSTOPT:; process the first diode
sbi PORTB,3; light the diode
in tempi,TCNT11
in temph,TCNT1H
add tempi,period1
adc temph,periodh
out OCR1AH,temph; put the time of maching
out OCR1AL,temp1
ldi flag,0b00000100
rcall WAITMATCH; wait match
cbi PORTB,3;extinguish the diode
ldi flag,0
ret
WAIT0:; wait falling
rcall RSTTIMER
cbi PORTB, 4; init
mov timeh,periodh
mov timel,period1
WT:
rcall SMALLPULSES1 sbrs
flag,0
rjmp WT
ldi flag,0
ret
SMALLPULSES1:;forms the intermediate pulses
sbi PORTB,3; light the diode
ldi smallperiod1,low(SMALLPERIODO); put Initial frequency for intermediate pulses for 0
ldi smallperiodh,high(SMALLPERIODO)
add smallt1,smallperiod1
dc smallth,smallperiodh
out OCR1AH,smallth; put the time of maching
out OCR1AL,smallt1
rcall WAITMATCH
sbrc flag,0
rjmp EX
cbi PORTB,3/extinguish the diode
ldi smallperiodl,low(SMALLPERIOD1); put Initial frequency for intermediate pulses for 1
ldi smallperiodh,high(SMALLPERIOD1)
add smallt1,smallperiod1
adc smallth,smallperiodh
out OCR1AH,smallth; put the time of maching
out 0CR1AL,smalltl
rcall WAITMATCH
EX:
ret
WAIT1:; wait raising
in time1,TCNT11; init
in timeh,TCNT1H
add time1,period1
adc timeh,periodh
in smallt1, TCNT11
in smallth, TCNT1H
W1:
rcall SMALLPULSES2
sbrs flag,0
rjmp W1
ldi flag,0
ret
SMALLPULSES2:;forms the intermediate pulses
sbi PORTB,4; light the diode
ldi smallperiod1,low(SMALLPERIOD0); put Initial frequency for intermediate pulses for 0
ldi smallperiodh,high(SMALLPERIOD0)
add smallt1,smallperiod1
adc smallth,smallperiodh
out OCR1AH,smallth; put the time of maching
out OCR1AL,smallt1
rcall WAITMATCH
sbrc flag,0
rjmp EX1
cbi PORTB,4/extinguish the diode
ldi smallperiod1,low(SMALLPERIOD1); put Initial frequency for intermediate pulses for 1
ldi smallperiodh,high(SMALLPERI0D1)
add smallt1,smallperiod1
adc smallth,smallperiodh
out OCR1AH,smallth; put the time of maching