'jleblanc 4.11.06
'mod of code sent to me by leif
DEFINE OSC 20 'OSC MUST BE SET TO HS
'include modedefs.bas for shiftin and out modes
INCLUDE "modedefs.bas"
'general purpose variables
i VAR BYTE
counter VAR BYTE
'pin definitions for comm w/ Laipec TRW-24G
RF_CE VAR PORTD.7 'yellow
RF_CS VAR PORTD.3 'dark green
RF_DR VAR PORTD.2 'blue
'channel 1
RF_CLK1 VAR PORTD.1 'black
RF_DATA_In VAR PORTD.0 'light blue
RF_DATA_Out VAR PORTD.0
switch VAR portc.4
receiveLED VAR portc.3
sendLED VAR portc.2
' THIS IS THE ADDRESS FOR THE w/ Laipec TRW-24G
WhichAddress1 VAR BYTE 'Channel 1
WhichAddress2 VAR BYTE 'Channel 2
' DEFINE VARIABLES FOR SERIAL TO PC
inv9600 CON 16468 ' baudmode for serin2 and serout2: 9600 8-N-1 inverted
non9600 CON 84 ' baudmode for serin2 and serout2: 9600 8-N-1 non-inverted
'constants for RF configuration modes
CONRFRX VAR BYTE
CONRFTX VAR BYTE
'indicates state of current RF configuration - TX is 0, RX is 1
RFCurrentState VAR BIT
'hold data for RF message
RFDataArrayIN VAR BYTE[4]
RFDataArrayOUT VAR BYTE[4]
'hold data for RF configuration
RFConfigArray VAR BYTE[16]
'variables for each received or sent message
msgFromID VAR BYTE
msgToID VAR BYTE
msgData1 VAR BYTE
msgData2 VAR BYTE
me VAR BYTE
friend VAR BYTE
me = 1 'change this for the correct jar
friend = 2
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
bootup:
WhichAddress1 =$BA 'These are things maybe to change????
WhichAddress2 =$BA
PORTA = %00000000;
TRISA = %00000001; ' 0 = Output, 1 = Input (A.1 is RxPC)
PORTB = %00000000;
TRISB = %01101010; ' 0 = Output, 1 = Input (C.1 is RF_DATA_In, C.3 is RF_DR)
main:
'intialize RF module configuration
'constants to define receive/transmit modes at 2402 Mhz frequency
CONRFRX = $05
CONRFTX = $04
RFCurrentState = CONRFRX
GOSUB initRFConfig
msgToID = 0 ' CHANGE THIS TO WHO SHOULD RECIEVE MESSAGE
msgFromID = me ' CHANGE THIS TO ID OF SENDER
'Initializes Data Out
msgData1 = 0 ' DATA SENT
msgData2 =0 ' DATA SENT
'************************BEGIN MAIN LOOP**************************************'
'***************************************************************************
WHILE 1 'Run Forever
LOW RF_CS ' bring CS low before turning CE high - only one high at a time!
HIGH RF_CE ' bring CE high to bring RF into active mode
'if there's a message waiting in the RX buffer, read it
IF RF_DR = 1 THEN
INPUT RF_DATA_In 'This makes that pin an Input PIN
GOSUB receiveRF
ENDIF
'here's where we send our data
IF switch = 1 THEN 'if the switch is closed send a message
msgToID = friend ' CHANGE THIS TO WHO SHOULD RECIEVE MESSAGE
msgData1 = "y" ' DATA SENT
msgData2 =4 'random data
GOSUB sendData ' goto the sendData function
'RESET SEND OUT INFORMATION
msgToID = 0 ' CHANGE THIS TO WHO SHOULD RECIEVE MESSAGE
msgData1 =0 ' DATA SENT
msgData2 =0
ENDIF
WEND
'***************************************************************************
'***************************************************************************
receiveRF:
INPUT RF_DATA_In 'Redudant? given we say this in main loop?
'power down RF front-end for current conservation
LOW RF_CE
'clock in data from RF-24G to PIC
FOR i=0 TO 3
'clock should follow data by at least 50nsec
''This basically sends out a clock signal
''SHIFTIN DataPin,ClockPin,Mode,[Var{\Bits}...]
SHIFTIN RF_DATA_In, RF_CLK1, MSBPRE, [RFDataArrayIN[i]\8]
NEXT
'send received data to PC for serial debugging
FOR i=0 TO 3
SEROUT2 PORTC.6, 16468, [DEC RFDataArrayIN[i], 10, 13]
NEXT
'power up RF front-end again
HIGH RF_CE
'Absorb the incoming Message
msgToID = RFDataArrayIN[0] 'the receiver is in msgToID
msgFromID = RFDataArrayIN[1] 'sender information in msgFromID
msgData1 = RFDataArrayIN[2] 'incoming data stored in variable msgData1
msgData2 = rfdataArrayIN[3] ' and in msgData2
'Here we blink to acknowledge we have received the message
HIGH receiveLED
PAUSE 500
LOW receiveLED
PAUSE 500
HIGH receiveLED
PAUSE 500
LOW receiveLED
PAUSE 500
RETURN
sendData:
'Load the RF data out array with our message
RFDataArrayOUT[0] = msgToID
RFDataArrayOUT[1] = msgFromID
RFDataArrayOUT[2] = msgData1
RFDataArrayOUT[3] = msgData2
'set RF to transmit mode...
RFCurrentState = CONRFTX
GOSUB setRFConfig
' for shockburst TX, the sum of RX address, payload, and CRC must be less than 256 bits long
' the chip then tacks on a preamble to this message, and the total msg is 266 bits
OUTPUT RF_DATA_Out 'Makes the pin an Output
'get back into active mode
HIGH RF_CE
'Need pause between CE high and DATA clock out
PAUSEUS 100
'clock out 5 byte RF address of recipient
FOR i = 8 TO 12
'clock out this byte
SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFConfigArray[i]\8]
NEXT
'clock out 4 bytes of data payload
FOR i = 0 TO 3
'clock out this byte
SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFDataArrayOUT[i]\8]
NEXT
'start shockburst transmission
LOW RF_CE
PAUSEUS 300
'flash LED to indicate that we transmitted
HIGH sendLED
PAUSE 500
LOW sendLED
PAUSE 500
HIGH sendLED
PAUSE 500
LOW sendLED
PAUSE 500
'afterward, set RF back to its default receive state
RFCurrentState = CONRFRX
GOSUB setRFConfig
RETURN
setRFConfig: ' THIS IS USED TO SWITCH BETWEEN RECIEVE AND TRANSMIT MODES
'during configuration of the transmitter, we need RF_DATA as an output
OUTPUT RF_DATA_Out
'set chip to configure mode (CE low, CS high)
LOW RF_CE
HIGH RF_CS
'pause between CS high and DATA clockout
PAUSEUS 100
'RFCurrentState indicates 2402 Mhz frequency and either RX or TX state
'clock out new configuration data from PIC to RF-24G
SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFCurrentState\8]
'configuration set on falling edge of CS
LOW RF_CS
LOW RF_CE
'for consistency with the rx, stick this here
INPUT RF_DR
'flash the LED on B6 to indicate that we configured
'high DEBUG_LED1
' pause 250
'low DEBUG_LED1
RETURN
initRFConfig:
'configuration is a 144 bit word
'must be clocked in MSB first
'bit map
'143:120 - reserved for testing
'119:112 - length of data payload section RX channel 2
'111-104 - length of data payload section RX channel 1
'103:64 - up to 5 byte address for RX channel 2
'63:24 - up to 5 byte address for RX channel 1
'23:18 - number of address bits (both RX channels)
'17 - 8 or 16 bit CRC
'16 - enable on-chip CRCD generation/checking
'15 - enable two channel receive mode
'14 - communication mode (direct or shockburst)
'13 - RF data rate (1Mbps requires 16Mhz crystal)
'12:10 - crystal frequency
'9:8 - RF output power
'7:1 - frequency channel
'0 - RX or TX operation
'setup RFConfigArray with config bytes, see datasheet for default configuration
'this array is backwards so we can clock from MSB to LSB by increasing the index
'Data bits 119-112: Max data width on channel 2 (excluding CRC and adrs)
RFConfigArray[1] = $20 'payloadSize, 4 BYTES
'Data bits 111-104: Max data width on channel 1 (excluding CRC and adrs)
RFConfigArray[2] = $20 'payloadSize, 4 BYTES
'Data bits 103-64: Channel 2 address, 5 bytes (40 bits)
RFConfigArray[3] = WhichAddress2
RFConfigArray[4] = WhichAddress2
RFConfigArray[5] = WhichAddress2
RFConfigArray[6] = WhichAddress2
RFConfigArray[7] = WhichAddress2
'Data bits 63-24: Channel 1 address, 5 bytes (40 bits)
RFConfigArray[8] = WhichAddress1
RFConfigArray[9] = WhichAddress1
RFConfigArray[10] = WhichAddress1
RFConfigArray[11] = WhichAddress1
RFConfigArray[12] = WhichAddress1
'Data bits 23-16: Address width and CRC - 40 bit addr, 16 bit CRC, CRC enabled
RFConfigArray[13] = $A3
'Data bits 15-8: One Channel Receive, Shockburst Enabled, 250 kilobits, etc
RFConfigArray[14] = $4F
'Data bits 7-0: 2402 Mhz frequency, RX enabled/disabled (depending on RFCurrentState)
RFConfigArray[15] = RFCurrentState
'===================================================================
'During configuration of the transmitter, we need RF_DATA as an output
INPUT RF_DR
INPUT RF_DATA_In
OUTPUT RF_DATA_Out
'set chip to configure mode (CE low, CS high)
LOW RF_CE
HIGH RF_CS
'pause between CS high and DATA clockout
PAUSEUS 100
'clock out configuration bytes from PIC to RF-24G
FOR i = 1 TO 15
'set config one byte at a time from MSB to LSB
SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFConfigArray[i]\8]
NEXT
'configuration is set on the falling edge of CS, bring it low
LOW RF_CS
LOW RF_CE
'flash LED on pin B6 to debug that we configured
HIGH sendLED
PAUSE 250
LOW sendLED
PAUSE 250
HIGH receiveLED
PAUSE 250
LOW receiveLED
PAUSE 250
HIGH sendLED
PAUSE 250
LOW sendLED
HIGH receiveLED
PAUSE 250
LOW receiveLED
PAUSE 250
RETURN