Интернет-журнал "Домашняя лаборатория", 2007 №7
Шрифт:
EQU SMALLPERIOD1=50;HIGHTFREQTIME; частота для промежуточных длительность единицы
/Variable
DEF smallperiodh=r23.DEF smallperiodl=r24.DEF smallth=r25;
DEF smalltl=r26
DEF periodh=rl8; значение 1/4 периода
DEF periodl=rl9
DEF temp=rl6
DEF temph=r17
DEF tempi=r29
DEF tempi=r22
DEF timeh=r27; значение компаратора. DEF time1=r28
DEF flag=r20; need in for correct initilization
; Program
CSEG
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
out OCR1AL,smallt1
rcall WAITMATCH
EX1:
ret
SECONDOPT:; process the second diode
sbi P0RTB,4; light the diode
in temp1,TCNT11
in temph,TCNT1H
add temp1,period1
adc temph,periodh
ldi flag,0b00000100
out OCR1AH,temph; put the time of maching
out OCR1AL,temp1
rcall WAITMATCH; wait match
ldi flag,0
cbi PORTB,4/extinguish the diode
ret
SAVEFAZA:; calculate new period
in temp1,TCNT11
in temph,TCNT1H
rcall DIV
mov period1,temp1
mov periodh,temph
ldi temp1,0
ldi temph,0
ldi smallth,0
ldi smallt1,0
ldi time1,0
ldi timeh,0
ret
MAIN:
sbis ACSR,5;wait rise
rjmp MAIN
sbrs flag,0
rcall SAVEFAZA
ldi flag,0
rcall WAIT0
rcall FIRSTOPT
FALL:
sbic ACSR,5;wait falling
rjmp FALL