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