Сообщение
FUZZY_ » Пт июл 08, 2011 22:13:43
Прошу помощи в асемблере как настроить длительности (код из источника выше)
; п/п приема RC5
; Вход: StateRC5 - состояние приема
; BitCnt - счетчик бит
; OldTMR1L - хранение сост. TMR1
; OldTMR1H - /
; Константа: Nt=T*Ft/Kd
; T=1778 - длит. периода RC5
; Ft=12 - тактовая частота, мгц
; Kd=8 Kd TMR1
; Выход: ByteRC5L - команда RC5 0xxx.xxxx
; ByteRC5H - система RC5 000x.xxxx
; StateRC5=FF при успешном приеме
; Используются: R16-R22
RxRC5:
lds R16,StateRC5
cpi R16,$FF
brne PC+2
ret ; не принимаем, предыд. команда не обраб.
cpi R16,$00
breq State0 ; 0
cpi R16,$01
breq State1 ; 1
cpi R16,$02
breq State02 ; 2
cpi R16,$03
breq State03 ; 3
rjmp NewRX ; ошибка, сброс
State02:
rjmp State2
State03:
rjmp State3
; ждем 1-й |_
State0:
sbic PINB,0 ; ICP1= PB0=0
ret ; =1 - выход, ждем
sbis TIFR1,ICF1 ; ICF1=1, был перепад |_
rjmp NewRX ; ошибка
; был |_
; инвертируем LED
lds R18,StateTest
in R17,PORTB
cbr R17,(1<<LEDTEST) ; LED=0, включен
tst R18
breq PC+2 ; StateTest=0
sbr R17,(1<<LEDTEST) ; LED=1, выключен
out PORTB,R17
;
lds R17,ICR1L ; сохранить захваченный TMR1
lds R18,ICR1H
sts OldTMR1L,R17
sts OldTMR1H,R18
StateInc:
inc R16 ; State+1
sts StateRC5,R16
ret
; проверяем время и принимаем бит
State1:
lds R17,TCNT1L ; считываем TMR1
lds R18,TCNT1H ; /
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = TMR1-OldTMR1
sbc R18,R20
ldi R19,LOW(11*Nt/16) ; окно 11/16 Nt
ldi R20,HIGH(11*Nt/16); /
cp R17,R19
cpc R18,R20
brsh PC+2 ; прошло >11/16 Nt
ret ; ждем
clc ; C=0
sbic PINB,0 ; ICP1= PB0=0
sec ; C=1
lds R17,ByteRC5L
lds R18,ByteRC5H
rol R17 ; вдвигаем бит
rol R18
sts ByteRC5L,R17 ; сохранить
sts ByteRC5H,R18 ; /
com R17 ; инверсия
bst R17,0 ; bit0-->T
lds R17,TCCR1B
bld R17,ICES1
sts TCCR1B,R17 ; bit=0 - _|, =1 - |_
lds R17,BitCnt
inc R17 ; счетчик бит
sts BitCnt,R17
ldi R17,(1<<ICF1) ; $20
out TIFR1,R17 ; сброс флага ICF1
rjmp StateInc ; след. сост.
State2:
lds R17,ICR1L ; захваченный TMR1
lds R18,ICR1H
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = ICR1-OldTMR1
sbc R18,R20
ldi R19,LOW(5*Nt/4) ; окно 5/4 Nt
ldi R20,HIGH(5*Nt/4); /
cp R17,R19 ; D(ICR1)-5/4 Nt
cpc R18,R20 ; /
brsh State2Er ; прошло >5/4 Nt, ошибка
sbis TIFR1,ICF1 ; ICF1=1
rjmp State2Wt ; ждем перепад с проверкой TOUT
lds R17,ICR1L ; захваченный TMR1
lds R18,ICR1H
sts OldTMR1L,R17 ; сохранить
sts OldTMR1H,R18
lds R17,BitCnt
cpi R17,Nbit-1 ; кол-во бит -1
brsh PC+3 ; все биты приняты
dec R16 ; не все
rjmp PC+2
inc R16
sts StateRC5,R16
; сбросим флаг ICF1, настроим на |_
lds R17,TCCR1B
cbr R17,(1<<ICES1) ; bit=0 - |_
sts TCCR1B,R17
ldi R17,(1<<ICF1) ; $20
out TIFR1,R17 ; сброс флага ICF1
ret
State2Wt:
lds R17,TCNT1L ; считываем TMR1
lds R18,TCNT1H ; /
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = TMR1-OldTMR1
sbc R18,R20
ldi R19,LOW(3*Nt/2) ; окно 3/2 Nt
ldi R20,HIGH(3*Nt/2); /
cp R17,R19
cpc R18,R20
State2Er:
brsh NewRX ; прошло >3/2 Nt, ошибка
ret ; ждем
; приняты все биты, ждем 2Nt
State3:
lds R17,TCNT1L
lds R18,TCNT1H
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; TMR1-OldTMR1
sbc R18,R20 ; /
ldi R19,LOW(2*Nt)
ldi R20,HIGH(2*Nt)
cp R17,R19
cpc R18,R20
brsh PC+2 ; прошло >2 Nt
ret ; ждем 2 Nt
sbic TIFR1,ICF1 ; ICF1=0
rjmp NewRX ; был лишний перепад, ошибка
; формируем рез-т
lds R17,ByteRC5L
lds R18,ByteRC5H
rol R17
rol R18
rol R17
rol R18
ror R17
ror R17
set ; T=1
sbrc R18,6 ; ст.бит команды =0
clt ; T=0
bld R17,6 ; инверсный ст.бит
bst R18,5 ; tagle bit
bld R17,7
andi R18,$1F ; 000x.xxxx
; принята команда
clr R16
sts RtcRC5,R16 ; счетчик времени
lds R16,OldRC5L
cp R17,R16
breq NewRX ; повтор команды
sts OldRC5L,R17
andi R17,$7F ; маскируем Tagle bit
sts ByteRC5L,R17
sts ByteRC5H,R18
ldi R16,$FF ; команда принята
rjmp PC+2
NewRX:
clr R16 ; ошибка, новый прием
sts StateRC5,R16
ldi R16,RevTMR1 ; 1000.0010
sts TCCR1B,R16 ; настр. TMR1
ldi R16,(1<<ICF1) ; $20
out TIFR1,R16 ; сброс флага ICF1 на всяк.случай
clr R16
sts BitCnt,R16 ; сч.бит =0
; инвертируем LED
lds R16,StateTest
in R17,PORTB
sbr R17,(1<<LEDTEST) ; LED=1, выключен
tst R16
breq PC+2 ; StateTest=0
cbr R17,(1<<LEDTEST) ; LED=0, включен
out PORTB,R17
ret