I need some help.. I've looked at nigels wireless pages but find it hard to interpret at the moment. So I wanted to start at the basics.
Has anyone had any experience with these particular modules?
Specifically in Assembly
From what I can gather from HOPE's poor datasheets and pin diagrams, you use SPI to set up the modules and then data is shifted into the FSK to be transmitted.
Am I on the right track?
(With other projects I've had a basic understanding so they have been easier to approach. But when it comes to this, I dont know where. I'm a first timer when it comes to UART/USART too but am keen to persist until I have something working)
As with any project I (sucessfully) undertake I will publish everything on my site for all to view
Hi,
Have you seen the Sparkfun equivalents RF Link Transmitter - 434MHz - SparkFun Electronics
They are simple to interface with the pic and mine worked well with Nigels coding - you have to use that Manchester encoding routine.
Found Sparkfun postage very cheap and quick.
Ok.Those radio devices should be using SPI, not USART.
And that's what I would really like to do; find out how the modules work.This is not a module that you can just write to and get the data on the other side without actually knowing how it works.
;RFM12B (TRANSMITTER FUNCTION ONLY) CODE BY WANNAB INVENTOR
;need to get rid of slave deselection when sending commands to module
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ROUTINES TO TEST SSPBUF FOR RECEIPT AND MOVE INTO RESPECTIVE MRFSTAT REGISTER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RDMRFHI BTFSS PIR1,3 ;TEST TO SEE IF RECEIPT HAS OCCURED
;BTFSS SSPSTAT,0
GOTO $ - 1 ;NO, GO BACK TO TEST SSPBUF INT BIT
MOVF SSPBUF,W ;MOVE RECEIVED INFO INTO W
MOVWF MRFSTATHI ;MOVE W INTO MRFSTATHI
BCF PIR1,3
RETURN
RDMRFLO BTFSS PIR1,3 ;TEST TO SEE IF RECEIPT HAS OCCURED
;BTFSS SSPSTAT,0
GOTO $ - 1 ;NO, GO BACK TO TEST SSPBUF INT BIT
MOVF SSPBUF,W ;MOVE
MOVWF MRFSTATLO ;MOVE W INTO MRFSTATLO
BCF PIR1,3
RETURN
MRFSTATRD
CALL MS5DLAY
BCF PORTA,3
MOVLW 0x00
MOVWF SSPBUF
CALL RDMRFHI
CALL MS5DLAY
MOVLW 0x00
MOVWF SSPBUF
CALL RDMRFLO
CALL CLRDISP
MOVLW 80H ;THIS CODE BLOCK MOVES THE CURSOR TO
MOVWF PORTB ;THE 1ST SPACE ON THE TOP LEFT OF THE DISPLAY
CALL CLOCK
MOVLW 0H
MOVWF PORTB
CALL CLOCK ;CURSOR SHOULD BE AT TOP, 1ST SPOT NOW
BTFSS MRFSTATHI,7 ;THIS WILL TEST RECEIVED BYTE FOR WHAT TO DISPLAY
CALL NUM0
BTFSC MRFSTATHI,7
CALL NUM1
BTFSS MRFSTATHI,6
CALL NUM0
BTFSC MRFSTATHI,6
CALL NUM1
BTFSS MRFSTATHI,5
CALL NUM0
BTFSC MRFSTATHI,5
CALL NUM1
BTFSS MRFSTATHI,4
CALL NUM0
BTFSC MRFSTATHI,4
CALL NUM1
BTFSS MRFSTATHI,3
CALL NUM0
BTFSC MRFSTATHI,3
CALL NUM1
BTFSS MRFSTATHI,2
CALL NUM0
BTFSC MRFSTATHI,2
CALL NUM1
BTFSS MRFSTATHI,1
CALL NUM0
BTFSC MRFSTATHI,1
CALL NUM1
BTFSS MRFSTATHI,0
CALL NUM0
BTFSC MRFSTATHI,0
CALL NUM1
BCF PORTA,1
BCF PORTA,4
MOVLW 0C0H ;Cursor on second line, C0
MOVWF PORTB
CALL CLOCK
MOVLW 0H
MOVWF PORTB
CALL CLOCK
BTFSS MRFSTATLO,7 ;THIS WILL TEST RECEIVED BYTE FOR WHAT TO DISPLAY
CALL NUM0
BTFSC MRFSTATLO,7
CALL NUM1
BTFSS MRFSTATLO,6
CALL NUM0
BTFSC MRFSTATLO,6
CALL NUM1
BTFSS MRFSTATLO,5
CALL NUM0
BTFSC MRFSTATLO,5
CALL NUM1
BTFSS MRFSTATLO,4
CALL NUM0
BTFSC MRFSTATLO,4
CALL NUM1
BTFSS MRFSTATLO,3
CALL NUM0
BTFSC MRFSTATLO,3
CALL NUM1
BTFSS MRFSTATLO,2
CALL NUM0
BTFSC MRFSTATLO,2
CALL NUM1
BTFSS MRFSTATLO,1
CALL NUM0
BTFSC MRFSTATLO,1
CALL NUM1
BTFSS MRFSTATLO,0
CALL NUM0
BTFSC MRFSTATLO,0
CALL NUM1
RETURN
;Configuration Section
START BSF STATUS,5 ;Turns to Bank1.
MOVLW B'11000000' ;SEEMS TO WORK
MOVWF SSPSTAT
MOVLW B'00000000'
MOVWF ADCON0 ;ADC IS SHUT OFF
MOVLW B'00000110' ;PORTA is digital
MOVWF ADCON1
MOVLW B'11100001' ;PORTA SETUP FOR
MOVWF TRISA
MOVLW B'00000010'
MOVWF TRISB ;PORTB setup for SPI master
MOVLW B'01100000'
MOVWF OSCCON ;oscillator 4MHz
MOVLW B'00000111' ;Prescaler is /256
MOVWF OPTION_R ;TIMER is 1/32 secs.
MOVLW B'11111111' ;keep tmr2 from overflowing by maxing PR2
MOVWF PR2
BCF STATUS,5 ;Return to Bank0
MOVLW B'00100000'
MOVWF SSPCON ;SPI CONTROL REGISTER ENABLED
MOVLW B'00000111' ;PRESCALE VALUE OF 1:16, TURN ON TMR2
MOVWF T2CON
MOVLW B'00000000' ;INTERRUPTS OFF!
MOVWF INTCON
CLRF PORTA
CLRF PORTB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;INITIALIZATION FOR MRF49XA SPECIFIC REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Configuration Command
;el : Enable TX register = 0
;ef : Enable RX FIFO buffer = 0
;Select 915 MHz band
;Select 10 pF crystal load capacitor
MOVLW 0x80 ;High Byte
MOVWF GENCREGHI
MOVLW 0x33 ;Low Byte
MOVWF GENCREGLO
;Frequency Command
;Set center frequency to 915 MHz
MOVLW 0xA7 ;High Byte
MOVWF CFSREGHI
MOVLW 0xD0 ;Low Byte
MOVWF CFSREGLO
;AFC automatic mode = Keep offset when VDI=x
;st : Strobe edge = 0
;fi : Fine mode = 1
;oe : Offset register enable = 1
;en : Calculate offset = 1
;Range limit = +3fres to -4fres
;Max. Deviation = +22.5 kHz to -30 kHz
MOVLW 0xC4 ;High Byte
MOVWF AFCCREGHI
MOVLW 0xF7 ;Low Byte
MOVWF AFCCREGLO
;TX Configuration Command
;mp = 0
;Delta f (fsk) = 90 kHz
;Output power = 0 dB
MOVLW 0x98 ;High Byte
MOVWF TXCREGHI
MOVLW 0x25 ;Low Byte -12.5dB TX POWER SETTING
MOVWF TXCREGLO
;Receiver Control Command
;p16 : 0=INTin, 1=VDIout = 1
;VDI response time = Fast
;Receiver bandwidth = 200 kHz
;LNA gain = 0 dB
;RSSI threshold = -97 dBm
MOVLW 0x94 ;High Byte
MOVWF RXCREGHI
MOVLW 0x81 ;Low Byte
MOVWF RXCREGLO
;FIFO / Reset Mode Command
;sp : Select single Byte Sync pattern = 0
;al : Disable Sync pattern recognition = 0
;ff : FIFO fill = 1
;dr : Disable highly sensitive Reset = 1
;FIFO IT level = 8
MOVLW 0xCA ;High Byte
MOVWF FIFORSTREGHI
MOVLW 0x89 ;Low Byte
MOVWF FIFORSTREGLO
;Datarate Command
;Set datarate to 9.578544 kbps
MOVLW 0xC6 ;High Byte
MOVWF DRVSREGHI
MOVLW 0x23 ;Low Byte
MOVWF DRVSREGLO
;Power Management Command
;er : Enable receiver chain = 0
;ebb : Enable baseband circuit = 0
;et : Enable PLL,PA, TX = 0
;es : Enable synthesizer = 0
;ex : Enable crystal oscillator = 0
;eb : Enable low battery detector = 0
;ew : Enable wake-up timer = 0
;dc : Disable clock output = 1
MOVLW 0x82 ;High Byte
MOVWF PMCREGHI
MOVLW 0x01 ;Low Byte
MOVWF PMCREGLO
;TRANSMITTER BYTE WRITE COMMAND
MOVLW 0xB8 ; HIGH BYTE
MOVWF TXBREGHI
MOVLW 0x00
MOVWF TXBREGLO
MOVLW 0xC2
MOVWF BBFCREGHI
MOVLW 0x2C
MOVWF BBFCREGLO
;*********************************************************
;Program starts now.
BEGIN BSF PORTA,3 ;HOLD SLAVE CHIP SELECT HIGH
CALL MS5DLAY
CALL DELAYP1
CALL DELAYP1
CALL DELAYP1
INITIAL
;MOVE FIFORSTREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
CALL MS5DLAY
MOVF FIFORSTREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF FIFORSTREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;ENABLE THE SYNCHRON LATCH
BCF PORTA,3 ;SLAVE SELECT
MOVF FIFORSTREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x02
IORWF FIFORSTREGLO,W ;MOVE LITERAL 02h into w, and with fiforstreglo
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE GENCREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF GENCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF GENCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE AFCCREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF AFCCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF AFCCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE CFSREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF CFSREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF CFSREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE DRVSREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF DRVSREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF DRVSREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE PMCREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF PMCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF PMCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE RXCREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF RXCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF RXCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE TXCREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF TXCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF TXCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;TURN ON TRASMITTER TO TUNE IN ANTENNA
;MOVE PMCREG INTO MRF49XA, TURN ON TRANSMITTER
BCF PORTA,3 ;SLAVE SELECT
MOVF PMCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x20
IORWF PMCREGLO,W ;AND W WITH 20h, RESULT IN W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY ;CALL 5 MILLISECOND DELAY FOR ANTEANNA TUNING
;TURN ON RECEIVER CHAIN, TRANSMITTER OFF
BCF PORTA,3 ;SLAVE SELECT
MOVF PMCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x80
IORWF PMCREGLO,W ;AND W WITH 20h, RESULT IN W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;ENABLE THE FIFO
BCF PORTA,3 ;SLAVE SELECT
MOVF GENCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x40
IORWF GENCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;MOVE FIFORSTREG INTO MRF49XA
BCF PORTA,3 ;SLAVE SELECT
MOVF FIFORSTREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF FIFORSTREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY
;ENABLE THE SYNCHRON LATCH
BCF PORTA,3 ;SLAVE SELECT
MOVF FIFORSTREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x02
IORWF FIFORSTREGLO,W ;MOVE LITERAL 02h into w, OR with fiforstreglo
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
CALL MS5DLAY ;DELAY FOR THE HELL OF IT
CALL MS5DLAY ;DELAY FOR THE HELL OF IT
CALL CLRDISP
CALL SECDLAY
CALL I
CALL N
CALL I
CALL T
CALL SECDLAY
CALL SECDLAY
BSF PORTA,2
CALL CLRDISP
;READ STATUS BYTES AND CHECK FOR INTERUPTS
BCF PORTA,3 ;SLAVE SELECT
CALL MS5DLAY ;DELAY FOR THE HELL OF IT
CALL MRFSTATRD ;THIS WILL READ MRFSTATUS REG AND DISP ON LCD
CALL MS5DLAY
BSF PORTA,3 ;SLAVE DE-SELECTION
;;;THIS CODE WILL HOLD HERE WAITING FOR BUTTON TO BE PRESSED TO TRANSMIT
TXBUT BTFSC PORTA,7
GOTO TXBUT
CALL DELAYP1
TXBUT2 BTFSS PORTA,7
GOTO TXBUT2
CALL DELAYP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;THIS CODE WILL TRANSMIT A BYTE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;TRANSMIT A BYTE;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TRNSMT BCF PORTA,3 ;SLAVE SELECT
CALL MS5DLAY
MOVF PMCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVF PMCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
;;;;ENABLE THE TX REGISTER
BCF PORTA,3 ;SLAVE SELECT
CALL MS5DLAY
MOVF GENCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x80
IORWF GENCREGLO,W ;OR W WITH 80h, RESULT IN W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
;;;;;;ENABLE TRANSMITTER
BCF PORTA,3 ;SLAVE SELECT
CALL MS5DLAY
MOVF PMCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x20
IORWF PMCREGLO,W ;AND W WITH 20h, RESULT IN W
MOVWF SSPBUF
CALL RDMRFLO
;WRITE TO FILE
CALL MS5DLAY ;ALLOW PREAMBLE TO BE FULLY SENT
;SLAVE NOT DESELECTED
BTFSS PORTB,1 ;TEST MISO LINE FOR "RDY FOR NEXT BYTE" SIGNAL
GOTO $ - 1
MOVF TXBREGHI,W ;ADDRESS TXBREG
MOVWF SSPBUF
CALL RDMRFHI
MOVLW B'00101101' ;WRITE THE FIRST SYNCRONOUS BYTE -- HEX 2D (MRF49XA SCL1) --REQUIRED WITH THIS CONFIG
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1 ;TEST MISO LINE FOR "RDY FOR NEXT BYTE" SIGNAL
GOTO $ - 1
MOVLW B'11010100' ;WRITE THE SECOND BYTE -- HEX D4 (MRF49XA DEFAULT SCL0) -- REQUIRED WITH THIS CONFIG
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1 ;TEST MISO LINE FOR "RDY FOR NEXT BYTE" SIGNAL
GOTO $ - 1
MOVLW B'10101010' ;TRANSMIT THE FIRST DATA BYTE
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1
GOTO $ - 1
MOVLW B'10011001'
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1
GOTO $ - 1
MOVLW B'10011001'
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1
GOTO $ - 1
MOVLW B'10011001'
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1
GOTO $ - 1
MOVLW B'10011001'
MOVWF SSPBUF
CALL RDMRFLO
BTFSS PORTB,1
GOTO $ - 1
BSF PORTA,3 ;DESELECT THE SLAVE
;;;;;TURN OFF TRANSMITTER, DISABLE THE TX REGISTER
;TURN ON RECEIVER CHAIN, TRANSMITTER OFF
BCF PORTA,3 ;SLAVE SELECT
MOVF PMCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x80
IORWF PMCREGLO,W ;AND W WITH 20h, RESULT IN W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
;ENABLE THE FIFO
BCF PORTA,3 ;SLAVE SELECT
MOVF GENCREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x40
IORWF GENCREGLO,W
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
;ENABLE THE SYNCHRON LATCH
BCF PORTA,3 ;SLAVE SELECT
MOVF FIFORSTREGHI,W
MOVWF SSPBUF
CALL RDMRFHI
MOVLW 0x02
IORWF FIFORSTREGLO,W ;MOVE LITERAL 02h into w, and with fiforstreglo
MOVWF SSPBUF
CALL RDMRFLO
BSF PORTA,3 ;SLAVE DE-SELECTION
;DISPLAY TO THE LCD
CALL CLRDISP
BCF PORTA,1
BCF PORTA,4
MOVLW 80H ;THIS CODE BLOCK MOVES THE CURSOR TO
MOVWF PORTB ;THE 2ND SPACE ON THE TOP LEFT OF THE DISPLAY
CALL CLOCK
MOVLW 0H
MOVWF PORTB
CALL CLOCK ;CURSOR SHOULD BE AT TOP, 2ND SPOT NOW
CALL T
CALL X
CALL GAP
CALL D
CALL O
CALL N
CALL E
CALL SECDLAY
CALL MRFSTATRD
;BUTTON TO SEE IF A RETRANSMIT SHOULD OCCUR
RETX BTFSC PORTA,0
GOTO RETX
CALL DELAYP1
RETX2 BTFSS PORTA,0
GOTO RETX2
CALL DELAYP1
GOTO TXBUT
END
If 433/434Mhz is allowed for low power licence-free RF devices in Australia then that will be fine.First Question about Config 1
Band Select will be 433? (01)
No you dont need to set those, just disable the CLK out by setting the "dc" bit in the Power Management Command register.Regarding d2,d1&d0;CLK frequency, do I need to worry about this if my PIC has its own clock/crystal/intosc?
No, the X0:X3 bits are a means of fine tuning the internal oscillator in the RF02(But if it were used the cystal load capacitor setting (x3-x0) would be set to suit the clock frequency of the PIC????)
Nothing to do with the CLK out feature, but you do need to worry about it.But what is the 4th setting? m2-m0;frequency deviation?
Do I need to worry about this if I am not using the CLK out feature?
Yes I found the data on the HOPE website.Here is the receiver chip i am using RF01
**broken link removed**
It is built into this module i have from hope RFM01
I will go through and try and put together all the configuration settings and post them here for checking/discussion.A good idea.
I did a bit of searching and found that 433.05 to 434.79Mhz is allowed for this type of transmission in Australia.
If I understand the RF02 programming guide correctly it defaults to 435Mhz on power on reset (POR), which is a bit outside the allocation!
My suggestion would be to set the frequency to 434Mhz +/- and make the deviation 60khz.
I dont know, I have never done either of them!Another thing, is it worth using a PIC with a SPI (SSP - Synchronous Serial Port), or just doing all the communication maually with code. Think they call it bit banging?
JimB
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?