SW UART18xxx - vysledek
Michal HW
michalgregor@centrum.cz
Čtvrtek Srpen 11 10:54:57 CEST 2005
Jak jsem jiz psal pokousim se optimalizovat SW UART. 1200Bd, 20MHz. Bezi v
preruseni, nezavisle na hlavnim programu. Jedno preruseni trva kolem 30
cyklu to je zatizeni procesoru 7%. Samotny prijem bere 14-16cyklu. Pocet
cyklu jsem moc nesnizil, ale mam vyreseno i 3x vzorkovani vstupnich dat.
Chci snizit pocet cyklu, kvuli vyssi rychlost.Nepriklad na 9600Bd SW UART
bere 62% vykonu.
(Odladeno pouze v MPLABU)
Cas_RD1 res 1 ;pro seriový vstup
RD1_Faze res 1 ;START/data/STOP
RD1_Buf res 1 ;Právě přijímaný BYT
RD1_Data res 1 ;Tady se ukláda přijmutý BYT
RD1_Bity res 1 ;Vzorkování bitů
;*********************************************************
Navrat_ISR macro
incf RD1_Faze,F ;Dalsi fáze
dcfsnz Cas_TD,F
bra Vysilej
movff PCLATH_Temp,PCLATH
retfie FAST
endm
;---------------------------------------------------------
Vysli_Navrat_Zvys macro
incf TD_Faze,F
movff PCLATH_Temp,PCLATH
retfie FAST
endm
;*********************************************************
;*********************************************************
Reset_Page code
nop
bcf INTCON,GIE
goto Start
;*********************************************************
;Přerušení jen CCP1
;Po 520 cyklech a tedy 1200/8 (20M/ CPU(4)/ TMR1(520))
ISR_Code code 0x16
movff PCLATH,PCLATH_Temp
bcf PIR1,CCP1IF
clrf PCLATH
rlncf RD1_Faze,W
addwf PCL
;Start
bra Cekej_Start
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Kontrola_Start
bra Byt_Ini
;Bit0
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B0
bra Konec_Prijmu
;Bit1
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B1
bra Konec_Prijmu
;Bit2
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B2
bra Konec_Prijmu
;Bit3
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B3
bra Konec_Prijmu
;Bit4
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B4
bra Konec_Prijmu
;Bit5
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B5
bra Konec_Prijmu
;Bit6
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B6
bra Konec_Prijmu
;Bit7
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Zapis_B7
bra Konec_Prijmu
;STOP
bra Konec_Prijmu
bra Prijmi_Bit_Ini
bra Prijmi_Bit
bra Prijmi_Bit
bra Prijmi_Bit
bra Kontrola_Stop
bra Zapis_Byte
;---------------------------------------------------------
Prijmi_Bit_Ini
clrf RD1_Bity
Navrat_ISR ;Macro
;---------------------------------------------------------
Prijmi_Bit
btfsc Data_In
incf RD1_Bity,F ;3x se pocita vstupni hodnota
Navrat_ISR ;Macro
;---------------------------------------------------------
Byt_Ini
clrf RD1_Buf
Navrat_ISR ;Macro
;*********************************************************
;Spouštění vysilání
;vloženo do příjmu kvůli PCLATH
Vysilej bsf Cas_TD,3 ;8
rlncf TD_Faze,W
addwf PCL
bra Vysli_Cekej ;0
bra Vysli_B0 ;2
bra Vysli_B1 ;3
bra Vysli_B2 ;4
bra Vysli_B3 ;5
bra Vysli_B4 ;6
bra Vysli_B5 ;7
bra Vysli_B6 ;8
bra Vysli_B7 ;9
bra Vysli_Stop ;10
bra Vysli_Navrat_Ini ;11
bra Vysli_Navrat_Ini ;12
bra Vysli_Navrat_Ini ;13
bra Vysli_Navrat_Ini ;14
bra Vysli_Navrat_Ini ;15
;*********************************************************
Konec_Prijmu
Navrat_ISR
;---------------------------------------------------------
;Cekame na START bit
Cekej_Start
btfss Data_In ;Výsledek vzorkování
incf RD1_Faze,F
dcfsnz Cas_TD,F
bra Vysilej
movff PCLATH_Temp,PCLATH
retfie FAST
;---------------------------------------------------------
Kontrola_Start
btfsc RD1_Bity,1 ;Výsledek vzorkování
setf RD1_Faze
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B0
btfsc RD1_Bity,1 ;Výsledek vzorkování
bsf RD1_Buf,0
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B1
btfsc RD1_Bity,1 ;Výsledek vzorkování
bsf RD1_Buf,1
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B2
btfsc RD1_Bity,2 ;Výsledek vzorkování
bsf RD1_Buf,2
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B3
btfsc RD1_Bity,3 ;Výsledek vzorkování
bsf RD1_Buf,3
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B4
btfsc RD1_Bity,4 ;Výsledek vzorkování
bsf RD1_Buf,4
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B5
btfsc RD1_Bity,5 ;Výsledek vzorkování
bsf RD1_Buf,5
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B6
btfsc RD1_Bity,6 ;Výsledek vzorkování
bsf RD1_Buf,6
Navrat_ISR
;---------------------------------------------------------------------
Zapis_B7
btfsc RD1_Bity,7 ;Výsledek vzorkování
bsf RD1_Buf,7
Navrat_ISR
;---------------------------------------------------------
Kontrola_Stop
btfss RD1_Bity,1 ;Výsledek vzorkování
setf RD1_Faze
Navrat_ISR
;---------------------------------------------------------
Zapis_Byte
bcf Time_Out_Rx1 ;Přijat byt
movlw K_CAS_BYT
movwf Rx1_Cas_B
movff RD1_Buf,RD1_Data
bsf RD1_F
clrf RD1_Faze
dcfsnz Cas_TD,F
bra Vysilej
movff PCLATH_Temp,PCLATH
retfie FAST
;*********************************************************
;Vysilani dat
;---------------------------------------------------------
;Nemá co vysílat, jsou nové data?
;(Nová data z TD_Buf přesunout do TD_Shift)
Vysli_Cekej
movff PCLATH_Temp,PCLATH
btfsc TD_F
retfie FAST
bsf TD_F ;Prazdný Bufer
bcf TD_Klid ;Vysiláme
movff TD_Buf,TD_Shift
;START bit
bcf Data_Out
Vysli_Navrat_Zvys
;---------------------------------------------------------------------
;Datové bity
Vysli_B0
btfss TD_Shift,2
bcf Data_Out
btfsc TD_Shift,2
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B1
btfss TD_Shift,2
bcf Data_Out
btfsc TD_Shift,2
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B2
btfss TD_Shift,2
bcf Data_Out
btfsc TD_Shift,2
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B3
btfss TD_Shift,3
bcf Data_Out
btfsc TD_Shift,3
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B4
btfss TD_Shift,4
bcf Data_Out
btfsc TD_Shift,4
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B5
btfss TD_Shift,5
bcf Data_Out
btfsc TD_Shift,5
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B6
btfss TD_Shift,6
bcf Data_Out
btfsc TD_Shift,6
bsf Data_Out
Vysli_Navrat_Zvys
Vysli_B7
btfss TD_Shift,7
bcf Data_Out
btfsc TD_Shift,7
bsf Data_Out
Vysli_Navrat_Zvys
;---------------------------------------------------------------------
;Nové data se testují pouze na začátku vysílací rutiny,
;takže pro zjištění konce vysílání se musí zkusit oba bity TD_F a TD_Klid
Vysli_Stop
bsf Data_Out ;Stop bit
bsf TD_Klid ;Nevysílá se
; bra Vysli_Navrat_Ini
;---------------------------------------------------------
;Navrat z ISR
Vysli_Navrat_Ini
clrf TD_Faze
Vysli_Navrat
movff PCLATH_Temp,PCLATH
retfie FAST
;*********************************************************
Další informace o konferenci Hw-list