Code:
extern IntRet
; extern ReceiveB,RT1Ini,IntRet,TxCharB
extern STRTUP
; extern STRTUP,TBuffCB
global RFNIni,RFNTrns
; global RTTrnsB
global CCP1Int,CCP2Int
include SYSTEM.INC ;System definitions
include P16C74A.INC ;Definitions for PIC16C74A
;************************************************************************
;* *
;* CONSTANTS *
;* *
;* Constant definitions for this program module. *
;* *
;************************************************************************
;
; Bittime definitions for NEXA RF transmitter
;
BITTIM1 equ 295 ;1/4 bittime
BITTIM2 equ 590 ;2/4 bittime
BITTIM3 equ 885 ;3/4 bittime
BITTIM4 equ 1180 ;4/4 bittime
BITTIMP equ 10240 ;Bittime for preamble
;BITTIME equ 590 ;Bittime for NEXA RF transmitter
BITTIME equ 295 ;Bittime for NEXA RF transmitter
;************************************************************************
;* *
;* VARIABLES *
;* *
;* Variable definitions for this program module. *
;* *
;************************************************************************
RAM0 UDATA
TXCount res 1 ;Transmission counts
BCount res 1 ;Transmit bit counter
XmtHldH res 1 ;Transmit/receive holding register high
XmtHldL res 1 ;Transmit/receive holding register low
XmtRegH res 1 ;Transmit/receive shift register high
XmtRegL res 1 ;Transmit/receive shift register low
BCountR res 1 ;Receive bit counter
XFlag res 1
;************************************************************************
;* *
;* FUNCTIONS *
;* *
;* Functions for this program module. *
;* *
;************************************************************************
PROM CODE
;
; Initalize device driver.
;
RFNIni movlw B'00000001' ;Enable timer 1
movwf T1CON
movlw B'00001000' ;CCP2 as output compare (pin RC1)
movwf CCP2CON
; movlw B'00000100' ;CCP1 as input capture (pin RC2)
; movwf CCP1CON
errorlevel -302
bsf STATUS,RP0 ;Bank 1
; bsf PIE1,CCP1IE ;Enable capture/compare 1 interrupt
bsf PIE2,CCP2IE ;Enable capture/compare 2 interrupt
bcf STATUS,RP0 ;Bank 0
errorlevel +302
return
;
; Transmitt data.
;
; IN: W = Data
; FSR = Address
; OUT: W,FSR destroyed
;
RFNTrns movwf XmtHldH ;Data
movfw FSR
movwf XmtHldL ;Address
swapf XmtHldL,f
movlw 4
movwf TXCount ;Number of transmissions
bsf XFlag,0
return
;
; Capture/compare 1 interrupt service routine.
;
CCP1Int bcf STATUS,RP0 ;Bank 0
bcf PIR1,CCP1IF ;Clear interrupt flag
tstf BCountR
bnz BitRead
; movlw low ( BITT15 ) ;Low byte of timer value (1.5 bittime)
addwf CCPR1L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
; movlw high ( BITT15 ) ;High byte of timer value (1.5 bittime)
btfsc STATUS,C ;Update high byte of compare register
addlw 1 ;Add one for carry
addwf CCPR1H,f
movfw FSR
movwf CCPR1L
btfbs PORTC,2,IntRet ;Verify startbit twice
btfbs PORTC,2,IntRet
movlw 9
movwf BCountR
movlw B'00001010' ;CCP1 as interrupt only
movwf CCP1CON
goto IntRet
BitRead movlw low ( BITTIME ) ;Low byte of timer value
addwf CCPR1L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high ( BITTIME );High byte of timer value
btfsc STATUS,C ;Update high byte of compare register
addlw 1 ;Add one for carry
addwf CCPR1H,f
movfw FSR
movwf CCPR1L
clrc
btfsc PORTC,2 ;Test receive bit (RC2)
setc
; rrf XmtReg,f ;Shift bit into receive register
decfsz BCountR,f ;Increment bitcount
goto IntRet
movlw B'00000100' ;CCP1 as input capture (pin RC2)
movwf CCP1CON
; rlf XmtReg,f ;Stopbit -> carry
bnc FErr ;Framing error if no stopbit
; movfw XmtReg ;Read received character
clrc
; call ReceiveB ;Decode message. Complete ?
goto IntRet
FErr setc
; call ReceiveB ;Decode message. Complete ?
goto IntRet
;
; Capture/compare 2 interrupt service routine.
;
CCP2Int bcf PIR2,CCP2IF ;Clear interrupt flag
bcf STATUS,RP0 ;Bank 0
btfbc XFlag,0,C2Norm0 ;Exit if transmission disabled
movfw BCount
bz C2z1
decfsz BCount,f
goto C2z2
decfsz TXCount,f
goto C2z1
bcf XFlag,0
goto C2Norm0
C2z1 movfw XmtHldH
movwf XmtRegH
movfw XmtHldL
movwf XmtRegL
rlf XmtRegL,f
rlf XmtRegH,f
movlw 50
movwf BCount
bsf CCP2CON,CCP2M0 ;Send bit = 1
movlw low (BITTIMP) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIMP) ;High byte of timer value
goto C2SetL
; goto C2Norm
C2z2 btfsc BCount,0
bcf CCP2CON,CCP2M0 ;Send bit = 0
btfss BCount,0
bsf CCP2CON,CCP2M0 ;Send bit = 1
bcf STATUS,C ;Bit = 0
btfbc BCount,1,???1
btfbc BCount,0,???3
rrf XmtRegH,f
rrf XmtRegL,f
bcf STATUS,C ;Bit = 0
???3 btfsc XmtRegL,0
bsf STATUS,C ;Bit = 1
???1 btfbc BCount,0,???2
btfbs STATUS,C,???4
???5 movlw low (BITTIM1) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIM1) ;High byte of timer value
goto C2SetL
???2 btfbs STATUS,C,???5
???4 movlw low (BITTIM3) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIM3) ;High byte of timer value
goto C2SetL
C2Norm0 bcf CCP2CON,CCP2M0 ;Send bit = 0
C2Norm movlw low (BITTIM2) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIM2) ;High byte of timer value
C2SetL btfsc STATUS,C ;Update high byte of compare register
addlw 1 ;Add one for carry
addwf CCPR2H,f
movfw FSR
movwf CCPR2L
goto IntRet
Bookmarks