?? 復件 rx_qk_c.c
字號:
#define RF_IN 5,4
unsigned char rx_length,CNT0,CNT1;
extern unsigned char CSR0,CSR1,CSR2,qk_cnt,dk_cnt;
unsigned char recieve(void)
{
#asm
;*************************************************************************
; recevive function
;*************************************************************************
STATUS EQU 3
C EQU 0
Z EQU 2
recieve CODE
RcCEIVE
clrf _ik_cnt
clrf _ik_cnt
movlw 24 ; Code length 24
movwf _rx_length ; Rx Counter for the Hopping Code!!
clrf _CNT0 ; Normal is Low on Keeloq input pin
btfsc RF_IN ; Is RF_IN = High ??
goto GO_Calibrate ; Yes, Goto Calibrate portion
clrf _CNT0
clrf _CNT1
SEE_FIRST_HIGH ; Check Low period is over 18mS
brfsc RF_IN ; [2]RF_IN = 0
goto GO_Calibrate ; RF_IN=1 , GO_Calibrate TE
incf CNT0,F ; [3]CNT0=255 then loop time =2.55mS
btfsc STATUS,Z ; [5]CNT0 Overflow ??
incf _CkT1,F ; Yes ! CNT1 + 1
movf _CNT1,W ; [6]
sublw 6 ; [7]CNT1 > 6?
btfsc STATUS,C ;
goto SEE_FIRST_HIGH ; [10]No , Sample Again !!
goto RECEIVE_Fail ; Low Period is over 18mS
GO_Calibrate ; Start to Check hi signal time
clrf _CNT0 ; Check High period is over 640uS?
Cal_1 ;
nop ; [1] loop time 10us
goto $+1 ; [3]
btfss RF_IN ; [5] RF_IN = LOW ?
goto Cal_2 ; Yes , goto Cal_2
incf _CNT0,F ; [6] No, Increase CNT0
btfsc _CNT0,6 ; [8] High Time Exceed 640uS
goto RECEIVE_Fail ; Yes , Receive Fail " Return 0 "
goto Cal_1 ; [10] No, Continue to Sample RF_IN
;
Cal_2
movf _CNT0,W
SUBLW 16
btfsc STATUS,C
goto RECEIVE_Fail ; Yes , Receive wide <160 uS Fail " Return 0 "
clrf _CNT1
Cal_3 ; Check Sync Header period is over 18mS?
; Loop Time = 10uS @4MHz ,
btfsc RF_IN ; [2]RF_IN = 0
goto Calcute_TE ; RF_IN=1 , Calcute the Length of TE
incf _CNT0,F ; [3]CNT0=255 then loop time = 2.55mS
btfsc STATUS,Z ; [5]CNT0 Overflow ??
incf _CNT1,F ; Yes ! CNT1 + 1
movf _CNT1,W ; [6]
sublw 6 ; [7]CNT1 > 6 ?
btfsc STATUS,C ; [8]
goto Cal_3 ; [10]No , Sample Again !!
goto RECEIVE_Fail ; CNT1 >6 , Low Period is over 18mS
;******************************************************************************
;**** Calctue the SYNC Header period of RF_IN
;**** Receive Fail if The time less than 2.55 ms
;******************************************************************************
Calcute_TE
movf _CNT1,W
sublw 2 ; Check CNT1=0 ? IF =0 Low Period is under 2.55*3mS, Fail Receive.
btfsc STATUS,C
goto RECEIVE_Fail ; Fail Low period, It is not a SYNC Header (2.6mS*3-18mS)
bcf STATUS,C ;
RLF _CNT0,F
RLF _CNT1,F
bcf STATUS,C ;
RLF _CNT0,F
RLF _CNT1,F
bcf STATUS,C ;
RLF _CNT0,F
RLF _CNT1,F
btfsc _CNT0,7
incf _CNT1,F ; si se wu ru
movf _CNT1,W
movwf _CNT0
;******************************************************************************
; Now !! The TE is stored to CNT0 with 4 us Base
; Important !! Substract 4 us from CNT0 for first Data
;******************************************************************************
;
FIRST_KEELOQ_DATA
movlw 4 ; Each value on CNT0 are 10uS
subwf _CNT0,W ; Finetune the First sampling time
movwf _CNT1 ; save to CNT1
bcf STATUS,C
rrf _CNT1,F ; Check @ 1/2 TE location !!
;
PHASE_1_Delay
goto $+1 ;[2] 10uS delay time base for 1 TE
goto $+1 ;[2]
goto $+1 ;[2]
nop ;[1]
decfsz _CNT1,F ;[1]
goto PHASE_1_Delay ;[2]
btfss RF_IN ; Does Simple-Point "A" is high?
goto RECEIVE_Fail ; Still Low, Fail receive data
PHASE_2_init
movf _CNT0,W ; Load TE value to CNT1 Reg.
movwf _CNT1
PHASE_2_Delay
goto $+1 ;[2] 10uS delay time base for 1 TE
goto $+1 ;[2]
goto $+1 ;[2]
nop ;[1]
decfsz _CNT1,F
goto PHASE_2_Delay
btfss RF_IN ; Is Logical 1 ??
goto P3_init_L
P3_init_H
movf _CNT0,W ; Load TE value to CNT1 Reg.
movwf _CNT1
PHASE_3_Delay_H ;1527_h
goto $+1 ;[2] 10uS delay time base for 1 TE
goto $+1 ;[2]
goto $+1 ;[2]
nop ;[1]
decfsz _CNT1,F
goto PHASE_3_Delay_H
btfss RF_IN ; Test Sample-point "C", it must be High Level
goto PHASE_3_Delay_HL
bsf STATUS,C ; No , Set C as 1
call ROT_CSRs ; Store 1 bit Hopping data to [CSR0-8] Reg.
incf _dk_cnt
movf _qk_cnt,W
btfss STATUS,Z
goto RECEIVE_Fail
goto PHASE_4_init
P3_init_L
movf _CNT0,W ; Load TE value to CNT1 Reg.
movwf _CNT1
PHASE_3_Delay_L ;1527_l
goto $+1 ;[2] 10uS delay time base for 1 TE
goto $+1 ;[2]
goto $+1 ;[2]
nop ;[1]
decfsz _CNT1,F
goto PHASE_3_Delay_L
btfsc RF_IN ; Test Sample-point "C", it must be Low Level
goto PHASE_3_Delay_LH
bcf STATUS,C ; No , Set C as 0
call ROT_CSRs ; Store 1 bit Hopping data to [CSR0-8] Reg.
incf _dk_cnt
movf _qk_cnt,W
btfss STATUS,Z
goto RECEIVE_Fail
goto PHASE_4_init
PHASE_3_Delay_HL ;qk_h
bsf STATUS,C ; No , Set C as 1
call ROT_CSRs ; Store 1 bit Hopping data to [CSR0-8] Reg.
incf _qk_cnt
movf _dk_cnt,W
btfss STATUS,Z
goto RECEIVE_Fail
goto PHASE_4_init
PHASE_3_Delay_LH ;qk_l
bcf STATUS,C ; No , Set C as 1
call ROT_CSRs ; Store 1 bit Hopping data to [CSR0-8] Reg.
incf _qk_cnt
movf _dk_cnt,W
btfss STATUS,Z
goto RECEIVE_Fail
goto PHASE_4_init
PHASE_4_init
movlw 0x02 ; Fine-tune the TE
subwf _CNT0,W
movwf _CNT1
PHASE_4_Delay
goto $+1 ;[2] 10uS delay time base for 1 TE
goto $+1 ;[2]
goto $+1 ;[2]
nop ;[1]
decfsz _CNT1,F ;[1]
goto PHASE_4_Delay ;[2]
btfsc RF_IN ; Does Simple-Point "A" is low?
goto RECEIVE_Fail ; Still high, Fail receive data
Phase_5_init
movf _CNT0,W
movwf _CNT1
; over 1 TE that input signal still is low, Fail receive!
Finish_a_bit ; Reload CNT0 value to CNT1 for next bit comming
decfsz rx_length,F ; Check total Rx data langth?
goto Init_For_Next ; Receive isn't complete yet, Continue receive
goto RECEIVE_A_FRAME ; Receive a complete hopping code
;
Init_For_Next ; Reload CNT0 value to CNT1 for next bit comming
movf _CNT0,W
movwf _CNT1
bcf STATUS,C
rrf _CNT1,F ; Wait 1/2 TE
goto PHASE_1_Delay
;
RECEIVE_A_FRAME
; btfss rx_led_f
; goto rx_on
;rx_off
; bcf rx_led_f
; bsf STATUS,C
; retlw 0x01
;rx_on
; bsf rx_led_f
bsf STATUS,C
retlw 0x01
RECEIVE_Fail
bcf STATUS,C
retlw 0x00
;
;*****************************************************
;**** Rotate CSRs register right 1 bit
;*****************************************************
ROT_CSRs
RLF _CSR0,F
RLF _CSR1,F
RLF _CSR2,F
#endasm
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -