; RF Remote Security System (433 mhz) ; Receiver Unit ; 9/01 by: Luhan Monat ; ; Ten Pulse Coding Method (relative timing) ; || alram bit states ; <4:6> unit number ; <7> 0=timed data 1=immediate data device PIC16F84,pwrt_on,wdt_off,hs_osc VELIM = 3 TFACT = 65 ;receive timming factor (.1 ms) SRDAT = rb.7 ;shift register data SRCLK = rb.6 ;shift register clock RFIN = rb.0 ;RF module digital signal org 12 data ds 1 temp ds 1 temp1 ds 1 count ds 1 flag ds 1 del0 ds 1 del1 ds 1 del2 ds 1 segs ds 1 lites ds 1 rtime ds 1 unit ds 1 prev0 ds 1 prev1 ds 1 gtime ds 1 ; flag bits for FLAG RFTO = flag.0 RFHI = flag.1 VERR = flag.2 ;verify error org 0 goto start org 4 reti digseg addwf PCL retw 3fh,6h,5bh,4fh,66h,6dh,7dh,7h,7fh,67h start bsf RP0 movlw 00000b movwf ra movlw 00000001b movwf rb bcf RP0 clrf data bsf rb,3 ;data lite off cycle bsf rb,3 btfss RFIN goto cycle bcf rb,3 call recv btfsc RFHI goto :err3 btfsc RFTO goto :err1 btfsc VERR goto :err2 call dodat :ok call shout goto cycle :err3 movlw 74h ;'h' goto :err :err2 movlw 79h ;'E' goto :err :err1 movlw 78h ;'t' :err movwf segs call shout movlw 100 call delay goto :ok ; get 10-pulse data byte recv clrf prev0 ;clear validity bytes clrf prev1 bcf VERR call gaptim ;get reference time btfsc RFTO ;data ok? goto :err ;error. movwf rtime ;store movlw 8 movwf count ;set bit counter clrf data :r2 rrf data call gaptim movwf gtime ;save for validity check. btfsc RFTO goto :err subwf rtime,w ;> or < than ref ? btfss c goto :one :zero bcf data,7 movf prev0,w btfsc z ;got a zero already? goto :zback ;no call valid :zback movf gtime,w movwf prev0 ;store for next time goto :more ;get next bit :one bsf data,7 movf prev1,w btfsc z goto :oback call valid :oback movf gtime,w movwf prev1,w goto :more ;store one's durration :more decfsz count goto :r2 movf data,w :err ret ; check for bit times that dont match others valid movwf temp ;last bit's time movf gtime,w ;this bit's time subwf temp ;get the difference btfss temp,7 ;negative? goto :vp ;no. movf temp,w sublw 0 movwf temp :vp movf temp,w sublw VELIM ;error tollerance btfss c bsf VERR ret ; find gap time - return possible errors gaptim bcf RFTO bcf RFHI clrf temp ; :g1 btfss RFIN ;still high? goto :g2 ;no - start timing call sdelay incfsz temp goto :g1 bsf RFHI ;signal stuck hi ret :g2 clrf temp :g3 call sdelay btfsc RFIN ;still low? goto :g4 ;no - return time incfsz temp goto :g3 bsf RFTO ;timeout on gap ret :g4 btfsc RFIN goto :g4 movf temp,w ret sdelay bsf rb,4 movlw TFACT movwf del0 :d2 decfsz del0 goto :d2 bcf rb,4 ret ; show input byte DATA on displays dodat clrf lites movf data,w xorlw 0fh andlw 0fh ;get state bits iorwf lites btfsc data,7 bsf lites,4 swapf data movf data,w andlw 7 ;get unit number movwf unit call digseg movwf segs ret shout movf lites,w movwf temp movf segs,w movwf temp1 movlw 16 movwf count :shft bcf SRDAT btfss temp,7 ;hi order first bsf SRDAT ;reverse sense bsf SRCLK bcf SRCLK ;shift it out rlf temp1 rlf temp decfsz count goto :shft ret delay movwf del2 :d1 movf del2,w movwf del1 :d2 movf del1,w movwf del0 :d3 decfsz del0 goto :d3 decfsz del1 goto :d2 decfsz del2 goto :d1 ret end QED*