MRF90XAM9A interfacing help - Page 2


Closed Thread
Page 2 of 2 FirstFirst 12
Results 41 to 64 of 64
  1. #41
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Changed the registers one more time - still no PLL lock being reported.
    Below:
    Code:
         RF_Init_Values[0] = $2A                                                   'Standby mode, 915-928 MHz, VTune by inductors, ENABLE R1/P1/S1
         RF_Init_Values[1] = $8C                                                   'FSK, max IF gain, Packet Mode
         RF_Init_Values[2] = $03                                                   '100KHz Freq Dev
         RF_Init_Values[3] = $07                                                   '25kbps
         RF_Init_Values[4] = $0C                                                   'for OOK mode, not apliable
         RF_Init_Values[5] = $01                                                   '16Bytes FIFO, 1 byte threshold FIFO interrupt
         RF_Init_Values[6] = $77                                                   '915MHz R1 Reg
         RF_Init_Values[7] = $64                                                   '915MHz P1 Reg
         RF_Init_Values[8] = $32                                                   '915MHz S1 Reg
         RF_Init_Values[9] = $74                                                   '920MHz R2 Reg
         RF_Init_Values[10] = $62                                                  '920MHz P2 Reg
         RF_Init_Values[11] = $32                                                  '920MHz S2 Reg
         RF_Init_Values[12] = $38                                                  'config mode for OOK, not apliable
         RF_Init_Values[13] = $00                                                 'RCV:IRQ0=payload ready + IRQ1=CRC OK
                                                                                   'TX: IRQ1=TXdone
         RF_Init_Values[14] = $01                                                  'FIFO starts filling when SYNC detected,TXDONE goes hi when done,
                                                                                   'RSSI IRQ when is above level set, enable PLL lock
         RF_Init_Values[15] = $00                                                  'RSSI interupt level zero - minimum
         RF_Init_Values[16] = $A3                                                  'default filters config
         RF_Init_Values[17] = $38                                                  'default filters config
         RF_Init_Values[18] = $30                                                  'sync word ON, 24bits, 0 errors tolerance
         RF_Init_Values[19] = $07                                                  'reserved reg
         RF_Init_Values[20] = $00                                                  'RSII status read register, 0.5dB / bit
         RF_Init_Values[21] = $00                                                  'OOK config reg
         RF_Init_Values[22] = $53                                                  '"S" 1st byte of sync word
         RF_Init_Values[23] = $53                                                  '"S" 2nd byte of sync word
         RF_Init_Values[24] = $53                                                  '"S" 3rd byte of sync word  - my initials!
         RF_Init_Values[25] = $53                                                  '"S" just in case
         RF_Init_Values[26] = $72                                                  'Cutoff fcy = 200KHz, output power = 13dBm 0b000
         RF_Init_Values[27] = $3C                                                  'clk out disabled - default 427KHz
         RF_Init_Values[28] = $03                                                  '3 bytes payload
         RF_Init_Values[29] = $01                                                  'initial MAC ADDRESS, only for test
         RF_Init_Values[30] = $5E                                                  'Fix Packet Lenght, 3 bytes preamble, whitening ON, CRC ON, Node ADDR|0x00|0xFF filtering
         RF_Init_Values[31] = $00                                                  'FIFO autocreal enable if CRC fails, Write to FIFO in stby mode
    I'm frustrated ......
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  2. #42
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    I now get a PLL lock indication, I put a wait until PLL lock bit was true before moving on.
    Code:
                'Verify PLL Lock Flag
    PLLwait:    bReg_Address = $0E                                                  'FTPRIREG
                gosub RegisterRead
                PLL_LOCK = 0
                PLL_LOCK = bReg_Value.1
                         'You can test this bit to see if PLL Is Locked
    debug "waiting for PLL lock",13
                if PLL_LOCK=0 then PLLwait
    PLLdone:
    debug "PLL Lock=",bin1 PLL_LOCK,13
    Still no received data or IRQs however.
    Transmitter gives both IRQ0 and IRQ1 outputs - making some progress.
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  3. #43
    Join Date
    Jan 2013
    Location
    Texas USA
    Posts
    229


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Progress for sure.
    When in TX mode your IRQ0 says you have crossed the FIFO Input threshold and IRQ1 says FIFOFull.

    Why don't you try changing your definition of IRQ1 for TX (IRQ1TX) from 0 = FIFOFULL (default) to 1 = TXDONE. This is your RF_Init_Values[13] value.
    Then in the Send_Packet: routine after changing the mode to RF_TRANSMITTER, instead of a hard pause 5, use a loop to test for IRQ1 to go high (TXDONE).
    This way you can explicitly test for the Transmitter to complete.
    Regards,
    TABSoft

  4. #44
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Thanks for the additional input TABSoft, I had already changed the $0D register to $08, and still saw no interrupt.
    One thing I had noticed, In the Send_Packet routine, I saw you re-write the registers. I had changed your original code changing registers $1F, $0D, $0E, in which you re-wrote the registers to the original value, I changed to read the register 1st, then performed the logic manipulation thinking it may have been an oversight on your part. Still no output:
    Code:
    Send_Packet:    
                'Set Standby mode
                bRF_Mode = RF_STANDBY
                gosub SetRFMode
        
                'Enable FIFO access in Standby mode
                bReg_Address = $1F  'Register 31
                gosub RegisterRead
                bReg_Value = ((bReg_Value & $BF) | $00)
    '            bReg_Value = (RF_Init_Values(bReg_Address) & $BF) | $00
                gosub RegisterSet
                'Clear FIFO Overrun
                bReg_Address = $0D  'Register 13
                gosub RegisterRead
                bReg_Value = bReg_Value | $01
    '            bReg_Value = (RF_Init_Values(bReg_Address) | $01)
                gosub RegisterSet
                'Set PLL Locked
                bReg_Address = $0E  'Register 14
                gosub RegisterRead
                bReg_Value = bReg_Value | $02                                       'Set LSTLPLL to 1
    '            bReg_Value = (RF_Init_Values(bReg_Address) | $02)
                gosub RegisterSet
    'debug "Send Packet: waiting for PLL lock",13
    '            gosub PLLchk  'Verify PLL Lock Flag
    'debug "Send Packet: PLL locked",13
        
                For i = 0 to (TxPacketLen-1)
                'Wite the Packets to the FIFO
                wr_FIFO_Val = TxPacket[i]
                gosub WriteFIFO
                Next i 
       
                'Set RFMode to Transmit
                bRF_Mode = RF_TRANSMITTER
                gosub SetRFMode
                return
    Then as you can also see, I also added a bit test to see if in fact the PLL locked - it never did. Just sat there and spun waiting. I don't know what that is telling me. The 2 other places I have the wait until PLL lock do seem to change; the initial initialization and the RCV loop. Don't know what that is telling me either......

    I like your advice, and I had thought of doing something similar but my observations in the no IRQ0 or IRQ1 being set, I was looking for a way to test the register to see if the FIFO was ready. Some kind of flag I could use.
    I still haven't found it - an easy one.

    I have been on MC site and found numerous people grumbling over this radio - I can't believe this is so hard! One guy could never get the packet to work and went for the buffered approach. Many, Many posters have had interrupt issues as well. Seems I am not alone. All the more reason to post actual working code.

    My current drain is higher on the transmitter, so I think it is transmitting, and I actually believe the receiver is receiving - I just don't have it set to flag me so I can get the data!

    Thanks again for the assist, I owe you several beers! Any other ideas?
    Regards.
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  5. #45
    Join Date
    Jan 2013
    Location
    Texas USA
    Posts
    229


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Sorry I've been busy on other items.
    Have you made any further headway or are you still stuck?
    Regards,
    TABSoft

  6. #46
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Thanks for asking, I haven't done any more on it. I don't have a spectrum analyzer to see if its transmitting, so its really frustrating.
    It looks like it should work, but it doesn't so I am still missing something basic I feel.
    I appreciate your help, but, I am stuck and like you, I have things I should be doing besides this 'fun' item.
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  7. #47
    Join Date
    May 2013
    Location
    australia
    Posts
    2,379


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    these rfm69 chips are easy to use and have loads of working examples to draw information from and are really cheap too

    http://www.ebay.com.au/itm/RFM69CW-HopeRF-433Mhz-Wireless-Transceiver-with-RFM12B-compatible-Footprint-/181643908981?pt=LH_DefaultDomain_0&hash=item2a4ad2 1775

    I started out with the rfm12b modules and now have developed code that can successfully network the rfm69's with the old rfm12b's . I had similar issues to you trying to get the rfm69's up an running , not having the right gear to see what is really happening makes life difficult . in my case the known working rfm12b net allowed me to get pkt reception code working first after that the tx side just fell into place.

  8. #48
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Richard, Thanks for the link. My only desire (if I stick with it) to use the MC modules, is I think it would be interesting to build my own PAN using the Zigbee stuff.
    HOWEVER, as I have not demonstrated that I am smart enough to figure it out, another module may be in need.
    Do they make these with an integrated antenna?
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  9. #49
    Join Date
    Jan 2013
    Location
    Texas USA
    Posts
    229


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Just curious.

    Did you ever get these modules working for your project?
    Regards,
    TABSoft

  10. #50
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    No I did not. I had used up so much time on this 'friendly' project I wasn't getting any of my fun projects moved forward.
    I have shelved it for the time.
    Are you trying to do the same thing?
    If you succeed, please share what you found out. I think my problem is in the interrupt settings - I think its transmitting, and receiving, just not getting out?!?
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  11. #51
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Tabsoft-
    Did you get anywhere ?
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  12. #52
    Join Date
    Jan 2013
    Location
    Texas USA
    Posts
    229


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Sorry for the delay.

    No I didn't get anywhere with this as I didn't pursue it further.
    Got off on different projects.
    Regards,
    TABSoft

  13. #53
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    I know, frustrating.
    I have a ticket with Microchip, perhaps they can shed some light....
    Regards.
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  14. #54
    Join Date
    Oct 2010
    Posts
    411


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    i've seen most of the RFM topics are not completed. I'm about to use the Adafruit RFM 69HCW for sending GPS data from one side to the other. (embedded the modules and the code on this project http://www.picbasic.co.uk/forum/show...936#post143936)

    I've seen other posts as well, whicht a guy tried to do the same thing with the GPS, but didnt see any luck.

    Has anyone finally succeed to those modules? I'm on holidays right now, and the following days i will try to configure the registers at first.

    It is sad that this amazing unique forum, not to have a start up code for each major application. Just for all the users to see and experiment with every single application.

    There are still very helpful guys here but non of them have posted a startup code for those modules. And i believe that not only me would love to see that kind of help.

    Thanks so much again for your time.

  15. #55
    Join Date
    May 2013
    Location
    australia
    Posts
    2,379


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    It is sad that this amazing unique forum, not to have a start up code for each major application
    [rant]
    its not the fault of the forum its pbp's total lack of development that causes the issue.
    pbp cannot easily manage memory/memory structures or most of the pic inbuilt hardware modules. its difficult to
    make easy to use flexible pin definitions to use in include files so that library functionality can be created.
    most of my stuff uses asm and usercommand to overcome some of these hurdles but that leads to another level
    of complexity for code that translates between pic16/18 platforms. half the people here never even upgraded to pbp3
    the lack of usercommand in pbp2 kills that sort of combability anyway. you would have to wonder if more people upgraded to
    pbp3 in the past if development would have continued instead of becoming a backwater. all this stuff is dead easy in C .plug and play in Arduino


    the rfm69 family of modules are a quite complex device to use , their range and speed make the effort worthwhile
    if warranted. i have used them for several years now and did initially use them with pbp3. i did not publish
    my code for a number of reasons :-
    i wrote it specifically to suit my application , to be compatabile with rfm12bs[a retrograde step] , the code is completey undocumented .
    you could write a small novel explaining usage of a rfm69w/cw/hcw... . i look back on other less complex things i have posted
    code for like TFT modules, i went to a lot of trouble to make it easy-ish and adaptable . i think 3 people have had some
    success in using the code . three people in the whole world FFS. the rfm69 code can be more complex and they are more exotic why would i
    bother.
    unless you really need the speed/range then there a many less complex devices to use. you thought my suggestions for your gps project
    were overly complex rfm69 code is of the same ilk maybe more so.
    i was going to say nrf24L01 is a candidate ,very cheap not too hard to use but just noticed i did not even bother to create a pbp include for them , its all C from here
    Warning I'm not a teacher

  16. #56
    Join Date
    Oct 2010
    Posts
    411


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Quote Originally Posted by richard View Post
    [rant]
    its not the fault of the forum its pbp's total lack of development that causes the issue.
    pbp cannot easily manage memory/memory structures or most of the pic inbuilt hardware modules. its difficult to
    make easy to use flexible pin definitions to use in include files so that library functionality can be created.
    most of my stuff uses asm and usercommand to overcome some of these hurdles but that leads to another level
    of complexity for code that translates between pic16/18 platforms. half the people here never even upgraded to pbp3
    the lack of usercommand in pbp2 kills that sort of combability anyway. you would have to wonder if more people upgraded to
    pbp3 in the past if development would have continued instead of becoming a backwater. all this stuff is dead easy in C .plug and play in Arduino


    the rfm69 family of modules are a quite complex device to use , their range and speed make the effort worthwhile
    if warranted. i have used them for several years now and did initially use them with pbp3. i did not publish
    my code for a number of reasons :-
    i wrote it specifically to suit my application , to be compatabile with rfm12bs[a retrograde step] , the code is completey undocumented .
    you could write a small novel explaining usage of a rfm69w/cw/hcw... . i look back on other less complex things i have posted
    code for like TFT modules, i went to a lot of trouble to make it easy-ish and adaptable . i think 3 people have had some
    success in using the code . three people in the whole world FFS. the rfm69 code can be more complex and they are more exotic why would i
    bother.
    unless you really need the speed/range then there a many less complex devices to use. you thought my suggestions for your gps project
    were overly complex rfm69 code is of the same ilk maybe more so.
    i was going to say nrf24L01 is a candidate ,very cheap not too hard to use but just noticed i did not even bother to create a pbp include for them , its all C from here
    Hi Richard,

    thanks once again for your kind reply. I'm not familiar with programming as you have already understood, so for me will be really difficult to make any of these modules to work. I always think, technology make things easier and as those modules are "new" then it would be much easier for a user to embed those small and nice systems.

    I also thought that PBP, is capable of making thinks easier for most of the users. I've seen over the internet the Arduino users, have ready libraries for everything and even sample programs that are functioned. I was wonder why not here.

    PBP is it quite friendly and can become complicated, but in arduino world, things looks much easier when libraries are documented and registered for every single application. To be honest now i'm quite old to start understanding C language, and as being on a completely different area of interest (3D printing in Medicine) i do not have much time.

    I do what i do for my own experiments and hobby.

    I dont want you share any of your code, but it would be really nice, if anyone could simply start developing a code for those applications using RFM69 or even Lora modules.

    thanks a lot once again.

  17. #57
    Join Date
    May 2013
    Location
    australia
    Posts
    2,379


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    but it would be really nice, if anyone could simply start developing a code for those applications using RFM69 or even Lora modules.
    I think you have missed the point of my post , I don't think it can happen the pic environment is awash with veritable plethora of hardware combinations
    the "simple" Arduino style libraries you seek exist because the Arduino is a rigid series of products , each one has a fixed osc ,fixed pin definitions ,
    a fixed setup routine ,a fixed software shell , a fixed interrupt handler etc.... the user can change none of these things . the hardware is abstracted away from the user
    hell even the pwm freq is fixed .you need some level skill to manipulate any of the hardware and the Arduino ide makes sure its going to stay that way and will
    hide as much as it can from you
    Warning I'm not a teacher

  18. #58
    Join Date
    Oct 2010
    Posts
    411


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Quote Originally Posted by richard View Post
    I think you have missed the point of my post , I don't think it can happen the pic environment is awash with veritable plethora of hardware combinations
    the "simple" Arduino style libraries you seek exist because the Arduino is a rigid series of products , each one has a fixed osc ,fixed pin definitions ,
    a fixed setup routine ,a fixed software shell , a fixed interrupt handler etc.... the user can change none of these things . the hardware is abstracted away from the user
    hell even the pwm freq is fixed .you need some level skill to manipulate any of the hardware and the Arduino ide makes sure its going to stay that way and will
    hide as much as it can from you
    Many people told me to stay away from arduino.

    So you are saying that in pic environment will never happen something like this, because of its complexity. People do not bother to learn and configure a complex hardware, so they move to a fixed and standardized hardware, that effort is eliminated.

  19. #59
    Join Date
    May 2013
    Location
    australia
    Posts
    2,379


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    People do not bother to learn and configure a complex hardware, so they move to a fixed and standardized hardware, that effort is eliminated.
    its not that people don't bother , its that there are no pbp tools to do it properly.

    i will give you an simple example of the problem that demonstrates why i don't bother making anymore "hardware module" code for pbp any longer
    if you extrapolate this to include port/pin choices,on chip hardware and complex memory needs its no wonder that no "libraries" exist .
    take my tm1637 demo
    http://www.picbasic.co.uk/forum/showthread.php?t=23417
    the code is small, efficient and feature rich and works wonderfully, usercommand allows it fit seemlessy into pbp as though it was a pbp function.
    problem is it only works on enhanced core pic16 devices.
    to use it on a older chip like a pic12f683 it needs a bit of work these chips have only got one 8 bit FSR and no BRW opcode
    whereas the modern chips have 2 16 bit FSR's and a BRW opcode .
    therefore my rjust function can't work on these old chips and the rest of the code needs a bit of a tweak too
    the asm portion of the code becomes :-
    Code:
    SEG_val         ;VALID INPUT  0-9 ,A-F, a-f ," " ,-
        CHK?RP  _TM_TMP
        MOVWF   _TM_TMP
        SUBLW   0x21
        btfsc   STATUS, C
        retlw   0   ;" "
        MOVF    _TM_TMP,W
        SUBLW   0x2f
        btfsc   STATUS, C
        retlw   64   ;"-"
        MOVF    _TM_TMP,W
        MOVLW   0X40
        SUBWF   _TM_TMP,W
        btfsC   STATUS, C
        GOTO    TM_ALPHA
        MOVF    _TM_TMP,W
        ANDLW   0X0F
        GOTO    TM_LU
    TM_ALPHA 
        ANDLW   0xdf    ;ucase
        SUBLW   6
        btfsS   STATUS, C
        retlw   0       ;ERROR
        MOVLW   0X37
        SUBWF   _TM_TMP,W
        ANDLW   0xdf    ;ucase
    TM_LU     
        addwf   PCL, F                                          
        retlw  0X3F    ;0   
        retlw  6             
        retlw  0X5B   
        retlw  0X4F 
        retlw  0X66
        retlw  0X6D                        
        retlw  0X7D  
        retlw  7   
        retlw  0X7F          
        retlw  0X67    ;9
        retlw  0X77    ;A
        retlw  0X7C    ;b
        retlw  0X39    ;C
        retlw  0X5E    ;d
        retlw  0X79    ;E
        retlw  0X71    ;F
        
    TM_START  
    _TM_START   
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_CLK
        BSF    TM_OUT_PORT,TM_DIO
        NOP
        BCF    TM_OUT_PORT,TM_DIO
        NOP
        BCF    TM_OUT_PORT,TM_CLK
        ;NOP
        RETURN
        
    TM_STOP 
    _TM_STOP 
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_CLK 
        BCF    TM_OUT_PORT,TM_DIO 
        NOP
        BSF    TM_OUT_PORT,TM_CLK 
        NOP
        BSF    TM_OUT_PORT,TM_DIO 
        ;NOP
        RETURN
        
    TM_WRITE  
    _TM_WRITE
        MOVLW  8 
        CHK?RP _TM_BIT
        MOVWF  _TM_BIT
    NXBT   
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_CLK 
        CHK?RP _TM_DAT
        BTFSS  _TM_DAT,0
        GOTO   TM_0
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_DIO 
        GOTO   TM_NB
    TM_0    
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_DIO  
    TM_NB   
        CHK?RP _TM_DAT
        RRF    _TM_DAT,F
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_CLK 
        CHK?RP _TM_BIT
        DECFSZ _TM_BIT,F
        GOTO   NXBT
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_CLK 
        CHK?RP TM_TRIS
        BSF    TM_TRIS,TM_DIO 
        CHK?RP TM_IN_PORT
        BTFSC  TM_IN_PORT,TM_DIO 
        BSF    _TM_NAK,7
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_CLK 
        NOP
        NOP
        NOP
        NOP
        BCF    TM_OUT_PORT,TM_CLK 
        CHK?RP TM_TRIS 
        BCF    TM_TRIS ,TM_DIO 
        BANKSEL 0
        RETURN
    _TM_INIT
        CHK?RP  _TM_COLON
        CLRF    _TM_COLON
        CLRF    _TM_BRIGHT
        CHK?RP TM_TRIS
        BCF    TM_TRIS ,TM_DIO
        BCF    TM_TRIS ,TM_CLK
        BANKSEL 0
        RETURN
        
    _TM_DISP4
        CHK?RP  _TM_DAT
        MOVLW   _CMD_AUTO_ADDR
        MOVWF   _TM_DAT
        CLRF    _TM_NAK
        CALL    TM_START
        CALL    TM_WRITE
        CALL    TM_STOP
        MOVLW   _NUM_DIGITS          
        CHK?RP  _TM_DIG
        MOVWF   _TM_DIG
        MOVLW   _START_ADDR
        CHK?RP  _TM_DAT
        MOVWF   _TM_DAT
        CALL    TM_START
        CALL    TM_WRITE 
    NXDIG
        MOVF INDF,W
        INCF FSR ,f
        CALL    SEG_val
        CHK?RP  _TM_DAT
        IORWF   _TM_COLON ,W
        movwf   _TM_DAT
        CALL    TM_WRITE
        CHK?RP  _TM_DIG
        DECFSZ  _TM_DIG,F
        GOTO    NXDIG
        CALL    TM_STOP
        CHK?RP  _TM_BRIGHT 
        MOVF    _TM_BRIGHT ,W
        ANDLW   7
        IORLW   _DISPLAY_ON
        CHK?RP  _TM_DAT
        MOVWF   _TM_DAT
        CALL    TM_START
        CALL    TM_WRITE
        CALL    TM_STOP
        BANKSEL 0
        RETURN
    ENDASM
    but it still wont work on a pic18 they have no MOVIW, MOVWI OR BRW opcodes.
    so it needs a rework for them too. apita .its not easy to cover all the bases . i wrote the code to suit my app
    at that time . if i need to use the code on a different chip i don't want to keep reinventing the wheel, a modular approach
    is what i'm looking for. pbp simply has no tools to make that process a pleasant one.
    to do the same thing in C needs no asm code other than a few NOPs for timing and is fully portable with no changes needed
    eg
    c source :-
    Code:
    #include "tm1637.h"
    /*pin manager DEFINES :-
     TM_DIO ,TM_CLK 
     */
    char TM_BRIGHT=1,TM_COLON=COLON_OFF ;
    void SET_TM_COLON(char d){
        if (d) 
            TM_COLON=COLON_ON;
        else
            TM_COLON=COLON_OFF;           
    }
    void SET_TM_BRIGHT(char d){
        TM_BRIGHT = d&7;            
    }
    void TM_START(){
        TM_CLK_LAT=1;
        TM_DIO_LAT=1;
        asm ("NOP");        
        TM_DIO_LAT=0;
        asm ("NOP");
        TM_CLK_LAT=0;
    }
        
    void TM_STOP(){ 
        TM_CLK_LAT=0; 
        TM_DIO_LAT=0;
        asm ("NOP"); 
        TM_CLK_LAT=1;
        asm ("NOP");   
        TM_DIO_LAT=1; 
    }
    char TM_WRITE(char dat){ 
        char bit_cnt;
        for (bit_cnt=0;bit_cnt<8;bit_cnt++){    
        TM_CLK_LAT=0;  
        TM_DIO_LAT=dat&1;  
        dat>>=1;   
        TM_CLK_LAT=1;
        }
        TM_CLK_LAT=0; 
        TM_DIO_SetDigitalInput();
        bit_cnt=TM_DIO_GetValue();
        TM_CLK_LAT=1;
        #asm
        NOP
        NOP
        NOP
        NOP
        #endasm
        TM_CLK_LAT=1;
        TM_DIO_SetDigitalOutput();
        return bit_cnt;  //NAK IF SET
    }
                
    void TM_DISP(char* buff){
        char dat,TM_DIG,tmp;
        dat=CMD_AUTO_ADDR;
        TM_START();
        TM_WRITE(dat);
        TM_STOP();    
        dat=START_ADDR;
        TM_START();
        TM_WRITE(dat); 
        for(TM_DIG=0;TM_DIG<NUM_DIGITS;TM_DIG++ ){
            tmp=buff[TM_DIG];
            dat=SEG_VAL(tmp)|TM_COLON;
            TM_WRITE(dat);
        }
        TM_STOP();
        dat=(TM_BRIGHT&7)|DISPLAY_ON;
        TM_START();
        TM_WRITE(dat);
        TM_STOP();
    }           
                
    char  SEG_VAL(char dat){
        const char seg_data[]={ 0X3F,6,0X5B,0X4F,0X66,0X6D,0X7D,7,0X7F,0X67,0X77,0X7C,0X39,0X5E,0X79,0X71};
          if (isdigit(dat))
                return seg_data[dat-'0'];
          else if (isxdigit(dat))
                return seg_data[toupper(dat)-'A'+10];
          else if (dat=='-')
                return 64;
          else 
                return 0;
    }
    and the header file :-
    Code:
    /* 
     * File:   tm1637.h
     * Author: rc
     *
     * Created on January 3, 2018, 4:42 PM
     */
    #ifndef TM1637_H
    #define TM1637_H
    #ifdef __cplusplus
    extern "C" {
    #endif
        
    #include <ctype.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include <stdio.h>    
        
    #include "mcc_generated_files/mcc.h"   
    #include "mcc_generated_files/pin_manager.h"
    #define    CMD_AUTO_ADDR 0x40 
    #define    START_ADDR    0xc0 
    #define    NUM_DIGITS    0x4               //number of 7seg leds
    #define    COLON_ON      0x80 
    #define    DISPLAY_ON    0x88
    #define    COLON_OFF     0
    void  TM_START();
    void  TM_STOP();
    char  TM_WRITE(char);
    char  SEG_VAL(char);
    void  TM_DISP(char*);
    void SET_TM_COLON(char);
    void SET_TM_BRIGHT(char);
    #ifdef __cplusplus
    }
    #endif
    #endif /* TM1637_H */
    and a C example of usage
    Code:
    #include <xc.h>
    #include  "mcc_generated_files/mcc.h"
    #include  "mcc_generated_files/pin_manager.h"
    #include <ctype.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include <stdio.h>
    #include  "tm1637.h" 
    #include  "hx711.h" 
    /*pin manager DEFINES :-
     TM_DIO ,TM_CLK   
     HX_OUT,HX_SCH
     ZERO_SW
     */
     
    void main(void)
    {
        short long  cnt;
        char buffer[5];
        SYSTEM_Initialize();
        SET_TM_BRIGHT(2);
        while ( HX_OUT_GetValue()){} ;     
        while (1)
        {
          if(!ZERO_SW_GetValue() ) {
             SET_HX_ZERO();
            while (!ZERO_SW_GetValue() ) {}; 
          } 
          cnt = READ_HX711();
          cnt >>=5;
          SET_TM_COLON(0);
          sprintf(buffer,"%4d",cnt);
          TM_DISP(buffer);
          __delay_ms(500);
        }
    }
    to do the same in pbp code is possible but twice the size and half as fast with less features . and that is for a very simple device
    http://www.picbasic.co.uk/forum/show...196#post144196
    Warning I'm not a teacher

  20. #60
    Join Date
    Oct 2010
    Posts
    411


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    After all that, i have the simplest question.

    Why after all these years, PBP havent improve itself with a newer and more competitive version? Then Everyone could buy the compiler with no thought.

    Because as far as i see C is not only higher level language, but doesnt need asm.

    Now i'm stack at this stage with the GPS project. Not that the code i have done is efficient or a super smart, but i thought i could send those GPS info, easier from one side to the other by using those modules. I thought that it would be a setup for TX -RX and then using only few command to send GPS data.

    I think that i need to start learning C from the beginning.

    Richard, thanks once again for all of your time and help.

  21. #61
    Join Date
    Apr 2014
    Location
    OK
    Posts
    557


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Quote Originally Posted by astanapane View Post
    After all that, i have the simplest question.

    Why after all these years, PBP havent improve itself with a newer and more competitive version? Then Everyone could buy the compiler with no thought.
    Daryl Taylor was involved in the development of PBP up till about 3 years ago when he passed away. Charles Leo now carries the entire burden of running ME Labs. ME Labs has been bought out by a racing products company. The real money is in the racing products. Charles continues to support PBP users in spite of the fact that the revenue from PBP sales barely pays the light bills. For above-and-beyond type support, we, as a community, must help each other. Creating cool modules and sharing them helps keep our group moving forward. It's a mixed bag I suppose.

    I think that i need to start learning C from the beginning.
    I just bought a couple books to do just that. I see many benefits from learning C.

  22. #62
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    3,793


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    There is an alternative to PBP, Proton Basic.

    As for the lib's comparing to Arduino platform, Richard hit the point well. You have to accept using ONLY one or two chips, with a lot of peripherals to support as many as possible features.

    But this takes away from you the choice. You cannot select a cheaper chip for mass production of a product, tailored to the project needs.

    Can you accept that? I am not as this reduces my range of selection. Then I have to pay the price of doing myself the rest of programming and if I am lucky have some good friends here to help overcome any, usually, silly mistake.

    So, you have to select the right tool for the job.

    Go to Arduino and just download the library for the GPS, Fingerprint reader, RF communication module or Graphic LCD and just power up. Minimal effort on programming but very narrow hardware selection range. And also a strange lanquage.

    ++i? Not for me.

    Ioannis

  23. #63
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    3,793


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    There is an alternative to PBP, Proton Basic.

    As for the lib's comparing to Arduino platform, Richard hit the point well. You have to accept using ONLY one or two chips, with a lot of peripherals to support as many as possible features.

    But this takes away from you the choice. You cannot select a cheaper chip for mass production of a product, tailored to the project needs.

    Can you accept that? I am not as this reduces my range of selection. Then I have to pay the price of doing myself the rest of programming and if I am lucky have some good friends here to help overcome any, usually, silly mistake.

    So, you have to select the right tool for the job.

    Go to Arduino and just download the library for the GPS, Fingerprint reader, RF communication module or Graphic LCD and just power up. Minimal effort on programming but very narrow hardware selection range. And also a strange lanquage.

    ++i? Not for me.

    Ioannis

  24. #64
    Join Date
    Nov 2007
    Location
    West Covina, CA
    Posts
    219


    Did you find this post helpful? Yes | No

    Default Re: MRF90XAM9A interfacing help

    Been awhile since I been here and found this post while trying to bring the same module to life.

    After a lot of reading and comparing "working" code not in PBP, I found that a lot of confusion starts at the datasheet on this RF module.
    Some information led me into the boonies until I realized the Microchip datasheet writer laid it out in almost a story telling fashion. Setting up in TX or RX Mode as listed on page 89 of datasheet makes some assumptions as to "auto" this or that, didn't really work that way.
    Unfortunately, I've been finding a lot of copy/paste going on in the datasheets without corrected info in some of the new PIC parts as well, but that's another gripe.

    I managed to get these guys talking back and forth using a PIC16F1705 but left out the PIC setup particulars for this chip so only the MRF89XAM9A configurations can be focused on. Plus it really helps to have a spectrum analyzer or RF service monitor on hand.

    As a note, the RX code register loading is done sequentially where the TX code is set up using a For/Next loop the way ecoli-557 started in this post. I like his way better because all the registers are listed and commented in one place at the top. This makes it easier to make changes.

    The code set up contains TX/RX mode for both ends but only one mode is selected in each list here.

    RX Mode:

    Code:
    ' MRF89XAM9A Receiver mode
    
    '*  OSC set to 4MHz because MRF89XA FIFO max CLK frequency is 1MHz.
    OSCCON = %01101000       ' Set to 4MHz
    ' PLL enabled on :7
    '  1 = 4x PLL is enabled
    '  0 = 4x PLL is disabled
    ' OSC setting 6:3
    '  1111 = 16MHz
    '  1110 = 8Mhz or 32MHz when bit 7 set (SPLLEN)
    '  1101 = 4MHz
    '  1100 = 2MHz
    '  1011 = 1MHz
    
    DEFINE OSC 4
    
    '***** SPI Setup for channel 1 *******
    SSP1STAT.7 = 1           ' Data_In sampled at end of Data_out
    SSP1STAT.6 = 1           ' Data transmitted on rising edge of SCK
    SSP1CON1 = %00100000     ' :5 En/Disbles serial port, :4 low level Idle state, 3:0 CLK = Fosc/4
    
    '========================================================================
    '                        Variable PORT Definitions      
    '========================================================================
    
    INT3        VAR PORTA.4    ' RF INT1
    INT4        VAR PORTA.5    ' RF INT2
    
    CSDAT       VAR LATC.3     ' RF module MRF89XAM9A FIFO CS
    CSCON       VAR LATC.5     ' RF module MRF89XAM9A Config CS
    
    '========================================================================
    '                        Variable Definitions      
    '========================================================================
    RX_data    VAR BYTE[16]
    TX_data    VAR BYTE[16]
    x          VAR BYTE
    
    '=========================================================================
    '                       Set values to variables       
    '=========================================================================
    CSDAT = 1      ' /CSData set high
    CSCON = 1      ' /CSCON set high
    
    PAUSE 500
    
    GOTO Prestart
    
    '=========================================================================
    '                           RF module configuration
    ' Data in consists of Address followed with new value for that address.
    ' Toggling /CS between Writes not needed, see MRF89XA DS 2.11.1
    '
    ' Address header:
    '   7: Start bit = 0
    '   6: R/W bit. Read = 1, Write = 0
    '   5:1 register address
    '   0: Stop bit = 0
    '
    ' The OSC is set to 16MHz during Writes to 31 config registers so the time
    ' can be reduced from 1.34ms @4MHz to 335us @16MHz
    '
    ' ***************** Deviation and Bit Rate calculations ****************** 
    ' fdev = 12.8MHz/(32*(FDVAL+1))
    ' BitRate = 12.8MHz/(64*(BRVAL+1)), where BitRate = 0<= BRVAL >=127
    ' Beta must be = (2*fdev)/BR >= 2
    '                (2*50kHz)/40kbs = 2.5
    '*************************************************************************
    '
    ' ********************* Frequency calculation ****************************
    ' Freq = 9/8 * 12.8MHz/R+1 * [75*(P+1)+S]
    '
    '
    '
    '
    '=========================================================================
    MRF_Init:
       CSCON = 0               ' Enable Chip Select    
    ' GCONREG value            ' 2.14.1
       SSP1BUF = %00000000     ' Write bit with $00 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00101110     ' STBY mode, 915-928MHz band, Vtune +180mV
                               ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       
    ' DMODREG value            ' 2.14.2
       SSP1BUF = %00000010     ' Write bit with $01 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %10100100     ' FSK Mod, Packet data and max IF gain
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' FDEVREG value            ' 2.14.3
       SSP1BUF = %00000100     ' Write bit with $02 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000111     ' Freq deviation, calc = 50kHz 40k
       GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    ' BRSREG value             ' 2.14.4
       SSP1BUF = %00000110     ' Write bit with $03 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00010011     ' Bit Rate, calc = 10kbs
       GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    ' FLTHREG value            ' 2.14.5
       SSP1BUF = %00001000     ' Write bit with $04 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000000     ' Floor threshold for for OOK mode only
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' FIFOREG value            ' 2.14.6
       SSP1BUF = %00001010     ' Write bit with $05 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00001110     ' 16 byte FIFO and 14 byte Threshold
       GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    ' R1CREG value             ' 2.14.7
       SSP1BUF = %00001100     ' Write bit with $06 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01110111     ' $77 R1+P1+S1 = 921.00MHz
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' P1CREG value             ' 2.14.8
       SSP1BUF = %00001110     ' Write bit with $07 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01100101     ' $65
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' S1CREG value             ' 2.14.9
       SSP1BUF = %00010000     ' Write bit with $08 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00011001     ' $19
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' R2CREG value             ' 2.14.10
       SSP1BUF = %00010010     ' Write bit with $09 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01110111     ' $77 R2+P2+S2 = 908.04MHz
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' P2CREG value             ' 2.14.11
       SSP1BUF = %00010100     ' Write bit with $0A address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01100011     ' $63
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' S2CREG value             ' 2.14.12
       SSP1BUF = %00010110     ' Write bit with $0B address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01000011     ' $43
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' PACREG value             ' 2.14.13
       SSP1BUF = %00011000     ' Write bit with $0C address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000000     ' PA ramp control for OOK mode only
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
                               
    ' FTXRXIREG value          ' 2.15.1
       SSP1BUF = %00011010     ' Write bit with $0D address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00100001     ' IRQ0RXS = PLReady, IRQ1RXS = RSSI
                               ' IRQ1TX = TX Done,       IRQ1TX = FIFO full
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
                               
    ' FTPRIREG value           ' 2.15.2
       SSP1BUF = %00011100     ' Write bit with $0E address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00111001     ' 5:IRQ0 TX Done, 4:TX start FIFO !empty, 0: 1 = Clear PLL lock
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' RSTHIREG value           ' 2.15.3
       SSP1BUF = %00011110     ' Write bit with $0F address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01101110     ' RSSI threshold set to -60dBm. See 3.4.7.3, Fig 3-9
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' FILCREG value            ' 2.16.1
       SSP1BUF = %00100000     ' Write bit with $10 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00110011     ' Passive filter = 137kHz, Butterworth = 100kHz
       GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    ' PFCREG value             ' 2.16.2
       SSP1BUF = %00100010     ' Write bit with $11 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00111000     ' Polyphase Center Freq. set to 100kHz default
                               ' for OOK only
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' SYNCREG value            ' 2.16.3
       SSP1BUF = %00100100     ' Write bit with $12 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00110000     ' Sync word EN, 24bit, no errors allowed
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' RSTSREG value            ' 2.16.4
       SSP1BUF = %00100110     ' Write bit with $13 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000111     ' Reserved, non zero value
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' RSVREG value              ' 2.16.5
       SSP1BUF = %00101000     ' Write bit with $14 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000000     ' RSSI read only value
                               ' RSSI[dBm] = 0.55 * RSSIVAL - 118.5[dBm]
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' OOKCREG value            ' 2.16.6
       SSP1BUF = %00101010     ' Write bit with $15 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000000     ' OOK only, default value
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' SYNCV31REG value         ' 2.17.1
       SSP1BUF = %00101100     ' Write bit with $16 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %10101010     ' Sync value, 1st byte = $AA
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' SYNCV23REG value         ' 2.17.2
       SSP1BUF = %00101110     ' Write bit with $17 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01010101     ' Sync value, 2nd byte = $55
       GOSUB SSP_INT           ' Wait until MSSP module finishes task    
    
    ' SYNCV15REG value         ' 2.17.3
       SSP1BUF = %00110000     ' Write bit with $18 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %10101010     ' Sync value, 3rd byte = $AA
       GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    ' SYNCV07REG value         ' 2.17.4
       SSP1BUF = %00110010     ' Write bit with $19 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01010101     ' Sync value, 4th byte = $55
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' TXCONVREG value          ' 2.18.1
       SSP1BUF = %00110100     ' Write bit with $1A address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01110000     ' TX filter default = 200kHz, TX Pwr = +13dBm
       GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    ' CLKOREG value            ' 2.19.1
       SSP1BUF = %00110110     ' Write bit with $1B address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00000000     ' Clock out control disabled
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' PLOADREG value           ' 2.20.1
       SSP1BUF = %00111000     ' Write bit with $1C address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00010000     ' Manchester disabled, Packet length = 16 byte
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' NADDSREG value           ' 2.20.2
       SSP1BUF = %00111010     ' Write bit with $1D address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %11001100     ' Node address = $CC
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' PKTCREG value            ' 2.20.3
       SSP1BUF = %00111100     ' Write bit with $1E address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01011000     ' Pkt length fixed, preamble = 3 bytes, White ON
                               ' CRC EN, 2:1 Address filter OFF
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    ' FCRCREG value            ' 2.20.4
       SSP1BUF = %00111110     ' Write bit with $1F address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task            
       SSP1BUF = %00000000     ' FIFO auto clear if/CRC, FIFO Write on STBY
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       
       CSCON = 1               ' Disable Chip Select
    
    RETURN
    
    ' Allow MSSP module to finish task
    SSP_INT: 
       WHILE !PIR1.3: WEND
       PIR1.3 = 0
    RETURN
    
    '=========================================================================
    '                           RF module RX mode config
    ' This routine takes xxxms to complete where the receive time uses xxxms
    ' of it with 16 bytes at 10kbs.
    '=========================================================================
    RX_mode:
       CSCON = 0               ' Enable Chip Select
       
    '************ Set IRQ0 to /FIFOEmpty and IRQ1 to FIFO Threshold ***********
    ' FTXRXIREG value (INT3 & 4)   ' 2.15.1
       SSP1BUF = %00011010     ' Write bit with $0D address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00100001     ' 7:6 IRQ0 = PLReady, 5:4 IRQ1 = CRCOK  11000001
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '************************* RX mode **************************************
    ' GCONREG value            ' 2.14.1
       SSP1BUF = %00000000     ' Write bit with $00 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01101000     ' RX mode, 915-928MHz band, Vtune via inductors
                               ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
       CSCON = 1               ' Disable Chip Select
       
    RETURN
    
    '************************* Read FIFO **************************************
    ' Reading the FIFO will clear IRQ0.
    ' This routine takes 696us to complete.
    '**************************************************************************  
    Read_FIFO:
      FOR x = 0 TO 15
        CSDAT = 0               ' Enable Chip Select
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        CSDAT = 1               ' Disable Chip Select
        RX_data[x] = SSP1BUF    ' Assign RX data to array (adds 150us to loop)
      NEXT x
    
    RETURN
    '=========================================================================
    '                           RF module TX mode config
    ' This routine takes 20.9ms to complete where the transmit time uses 20.1ms
    ' of it with 16 bytes at 10kbs.
    '=========================================================================
    TX_mode:
       CSCON = 0               ' Enable Chip Select    
    
    '********************** Set IRQ1 to TX Done *******************************
    ' FTXRXIREG value (INT4)   ' 2.15.1
       SSP1BUF = %00011010     ' Write bit with $0D address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %11001101     ' 3: IRQ1TX = TX Done
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '************************* STBY mode **************************************
    ' GCONREG value            ' 2.14.1
       SSP1BUF = %00000000     ' Write bit with $00 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00100001     ' STBY mode, 902-915MHz band, Vtune via inductors
                               ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '************************* FIFO Write on STBY *****************************
    ' FCRCREG value            ' 2.20.4
       SSP1BUF = %00111110     ' Write bit with $1F address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task            
       SSP1BUF = %00000000     ' FIFO auto clear if/CRC, FIFO Write on STBY
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
       CSCON = 1               ' Disable Chip Select
       
    '************************* Fill FIFO **************************************  
      FOR x = 1 TO 16
        CSDAT = 0             ' Enable Chip Select
        SSP1BUF = x           ' Write value
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
        CSDAT = 1             ' Disable Chip Select 
      NEXT x
       
    '************************* Enable TX mode *********************************      
    ' GCONREG value           ' 2.14.1
      CSCON = 0               ' Enable Chip Select
        SSP1BUF = %00000000   ' Write bit with $00 address
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
        SSP1BUF = %10000001   ' TX mode, 902-915MHz band, Vtune via inductors
                              ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
        GOSUB SSP_INT         ' Wait until MSSP module finishes task  
      CSCON = 1               ' Disable Chip Select
       
      WHILE !INT4: WEND       ' Wait until transmission is complete
      PAUSEUS 100             ' Wait a little
      
    '************************* Enable Sleep mode*******************************  
    ' GCONREG value           ' 2.14.1
      CSCON = 0               ' Enable Chip Select
        SSP1BUF = %00000000   ' Write bit with $00 address
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
        SSP1BUF = %00101000   ' Sleep mode, 915-928MHz band, Vtune via inductors
                              ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
      CSCON = 1               ' Disable Chip Select
          
    RETURN
    
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    
    Reg_check:
      CSCON = 0                 ' Enable Chip Select  
        SSP1BUF = %01011010     ' Read bit with $0D address
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task  
      
        SSP1BUF = %01011100     ' Read bit with $0E address
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        x = SSPBUF       
      CSCON = 1                 ' Disable Chip Select
    RETURN
    
    RIRQS_clear:
    ' FTPRIREG value            ' 2.15.2
      CSCON = 0                 ' Enable Chip Select
        SSP1BUF = %00011100     ' Write bit with $0E address
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        SSP1BUF = %00111101     ' 2: Clear RIRQS bit 0: 1 = Clear PLL lock
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
      CSCON = 1                 ' Disable Chip Select  
    RETURN
    
    Reg_read:
      CSCON = 0                 ' Enable Chip Select
      FOR x = 0 TO 31    
        SSP1BUF = ((x << 1) | $40)  ' Shifts left 1 bit, sets $40 bit
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task        
      NEXT x
      CSCON = 1                 ' Disable Chip Select
    RETURN  
    
    
    '=========================================================================
    '                           Prestart settings       
    '=========================================================================
    Prestart:
    GOSUB MRF_Init            ' Config the RF module
    GOSUB RX_mode             ' Put into RX mode
    
    Main:
      
    ' Monitor INT3 indicating data in RX buffer
      IF INT3 THEN 
        GOSUB Read_FIFO
      ENDIF
    
    '*************************************************************************
    ' My test code here checked the last incoming byte value. If valid then
    ' switch to TX mode and send 16 bytes and revert back to RX mode.
    '*************************************************************************
    '  IF RX_data[15] = $10 THEN
    '    RX_data[15] = 0       ' Clear the value for next RX
    '    GOSUB TX_mode         ' Send 16 bytes with values 1~16
    '    PAUSE 10 
    '    GOSUB RX_mode         ' Switch back to RX mode
    '  ENDIF  
    
    GOTO Main
    
    
    END
    TX Mode:

    Code:
    ' MRF89XAM9A Transmitter mode
    
    '*  OSC set to 4MHz because MRF89XA FIFO max CLK frequency is 1MHz.
    OSCCON = %01101000       ' Set to 4MHz
    ' PLL enabled on :7
    '  1 = 4x PLL is enabled
    '  0 = 4x PLL is disabled
    ' OSC setting 6:3
    '  1111 = 16MHz
    '  1110 = 8Mhz or 32MHz when bit 7 set (SPLLEN)
    '  1101 = 4MHz
    '  1100 = 2MHz
    '  1011 = 1MHz
    
    DEFINE OSC 4
    
    '***** SPI Setup for channel 1 *******
    SSP1STAT.7 = 1           ' Data_In sampled at end of Data_out
    SSP1STAT.6 = 1           ' Data transmitted on rising edge of SCK
    SSP1CON1 = %00100000     ' :5 En/Disbles serial port, :4 low level Idle state, 3:0 CLK = Fosc/4
    
    '========================================================================
    '                        Variable PORT Definitions      
    '========================================================================
    
    INT3        VAR PORTA.4    ' RF INT1
    INT4        VAR PORTA.5    ' RF INT2
    
    CSDAT       VAR LATC.3     ' RF module MRF89XAM9A FIFO CS
    CSCON       VAR LATC.5     ' RF module MRF89XAM9A Config CS
    
    '========================================================================
    '                        Variable Definitions      
    '========================================================================
    
    MRF_Config  VAR BYTE[32]
    RX_data     VAR BYTE[16]
    TX_data     VAR BYTE[16]
    inc         VAR BYTE      ' Increment variable counter
    x           VAR BYTE
    y           VAR WORD
    
    
    '///// MRF configuration list, D/S sect, Config name: Description /////////
    MRF_Config[0] = $2E     ' 2.14.1, GCONREG: STBY mode, 915-928MHz band, Vtune +180mV, $2E = Enable R1/P1/S1, $2F = Enable R2/P2/S2 
    MRF_Config[1] = $84     ' 2.14.2, DMODREG: FSK Mod, Packet data and max IF gain
    MRF_Config[2] = $07     ' 2.14.3, FDEVREG: Freq deviation, calc = 50kHz 40k
    MRF_Config[3] = $13     ' 2.14.4, BRSREG: Bit Rate, calc = 10kbs
    MRF_Config[4] = $00     ' 2.14.5, FLTHREG: Floor threshold for for OOK mode only
    MRF_Config[5] = $0E     ' 2.14.6, FIFOREG: 16 byte FIFO and 14 byte Threshold
    MRF_Config[6] = $77     ' 2.14.7, R1CREG: R1    (R1+P1+S1) = 921.00MHz
    MRF_Config[7] = $65     ' 2.14.8, P1CREG: P1
    MRF_Config[8] = $19     ' 2.14.9, S1CREG: S1
    MRF_Config[9] = $77     ' 2.14.10, R2CREG: R2   (R2+P2+S2) = 908.04MHz
    MRF_Config[10] = $63    ' 2.14.11, P2CREG: P2
    MRF_Config[11] = $43    ' 2.14.12, S2CREG: S1
    MRF_Config[12] = $00    ' 2.14.13, PACREG: PA ramp control for OOK mode only
    MRF_Config[13] = $CC    ' 2.15.1, FTXRXIREG: IRQ0RX = RX Sync match, IRQ1RX = RX CRC Okay, IRQ1TX = TX Done, IRQ1TX = FIFO full
    MRF_Config[14] = $39    ' 2.15.2, FTPRIREG: 5:IRQ0 TX Done, 4:TX start FIFO !empty, 0: 1 = Clear PLL lock
    MRF_Config[15] = $2D    ' 2.15.3, RSTHIREG: RSSI threshold set to -95dBm. See 3.4.7.3
    MRF_Config[16] = $33    ' 2.16.1, FILCREG: Passive filter = 137kHz, Butterworth = 100kHz
    MRF_Config[17] = $38    ' 2.16.2, PFCREG: Polyphase Center Freq. set to 100kHz default for OOK only
    MRF_Config[18] = $30    ' 2.16.3, SYNCREG: Sync word EN, 24bit, no errors allowed
    MRF_Config[19] = $07    ' 2.16.4, RSTSREG: Reserved, non zero value
    MRF_Config[20] = $00    ' 2.16.5, RSVREG: RSSI read only value, RSSI[dBm] = 0.55 * RSSIVAL - 118.5[dBm]
    MRF_Config[21] = $00    ' 2.16.6, OOKCREG: OOK only, default value 
    MRF_Config[22] = $AA    ' 2.17.1, SYNCV31REG: Sync value, 1st byte = $AA
    MRF_Config[23] = $55    ' 2.17.2, SYNCV23REG: Sync value, 2nd byte = $55
    MRF_Config[24] = $AA    ' 2.17.3, SYNCV15REG: Sync value, 3rd byte = $AA
    MRF_Config[25] = $55    ' 2.17.4, SYNCV07REG: Sync value, 4th byte = $55
    MRF_Config[26] = $70    ' 2.18.1, TXCONVREG: TX filter default = 200kHz, TX Pwr = +13dBm
    MRF_Config[27] = $00    ' 2.19.1, CLKOREG: Clock out control disabled 
    MRF_Config[28] = $10    ' 2.20.1, PLOADREG: Manchester disabled, Packet length = 16 byte
    MRF_Config[29] = $CC    ' 2.20.2, NADDSREG: Node address = $CC
    MRF_Config[30] = $58    ' 2.20.3, PKTCREG: Pkt length fixed, preamble = 3 bytes, White ON, CRC EN, Address filter OFF
    MRF_Config[31] = $00    ' 2.20.4, FCRCREG: FIFO auto clear if/CRC, FIFO Write on STBY
    
    '=========================================================================
    '                       Set values to variables       
    '=========================================================================
    CSDAT = 1      ' /CSData set high
    CSCON = 1      ' /CSCON set high
    
    PAUSE 500
    
    GOTO Prestart
    
    '=========================================================================
    '                           RF module configuration
    ' Data in consists of Address followed with new value for that address.
    ' Toggling /CS between Writes not needed, see MRF89XA DS 2.11.1
    '
    ' Address header:
    '   7: Start bit = 0
    '   6: R/W bit. Read = 1, Write = 0
    '   5:1 register address
    '   0: Stop bit = 0
    '
    ' The OSC can be set to 16MHz during Writes to 31 config registers so the 
    ' time can be reduced from 1.34ms @4MHz to 335us @16MHz
    '
    ' ***************** Deviation and Bit Rate calculations ****************** 
    ' fdev = 12.8MHz/(32*(FDVAL+1))
    ' BitRate = 12.8MHz/(64*(BRVAL+1)), where BitRate = 0<= BRVAL >=127
    ' Beta must be = (2*fdev)/BR >= 2
    '                (2*50kHz)/40kbs = 2.5
    '*************************************************************************
    '
    ' ********************* Frequency calculation ****************************
    ' Freq = 9/8 * 12.8MHz/R+1 * [75*(P+1)+S]
    '
    '
    '
    '
    '=========================================================================
    MRF_Init:
    
    ' This For/Next technique uses 341 less Words but takes 2.06ms compared to
    ' 1.34ms sequentially
      CSCON = 0                   ' Enable Chip Select 
      FOR inc = 0 TO 31
        SSP1BUF = inc << 1        ' Write bit with address
        GOSUB SSP_INT             ' Wait until MSSP module finishes task
        SSP1BUF = MRF_Config[inc] ' Write config value from list
        GOSUB SSP_INT             ' Wait until MSSP module finishes task
      NEXT inc
      CSCON = 1                   ' Disable Chip Select
    RETURN  
    
    ' Same function as above but sequentially. Left here for comparison only
    '
    '   CSCON = 0               ' Enable Chip Select    
    '' GCONREG value            ' 2.14.1
    '   SSP1BUF = %00000000     ' Write bit with $00 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00101110     ' STBY mode, 915-928MHz band, Vtune +180mV
    '                           ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
       
    '' DMODREG value            ' 2.14.2
    '   SSP1BUF = %00000010     ' Write bit with $01 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %10000100     ' FSK Mod, Packet data and max IF gain
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' FDEVREG value            ' 2.14.3
    '   SSP1BUF = %00000100     ' Write bit with $02 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000111     ' Freq deviation, calc = 50kHz 40k
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    '' BRSREG value             ' 2.14.4
    '   SSP1BUF = %00000110     ' Write bit with $03 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00010011     ' Bit Rate, calc = 10kbs
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    '' FLTHREG value            ' 2.14.5
    '   SSP1BUF = %00001000     ' Write bit with $04 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000000     ' Floor threshold for for OOK mode only
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' FIFOREG value            ' 2.14.6
    '   SSP1BUF = %00001010     ' Write bit with $05 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00001110     ' 16 byte FIFO and 14 byte Threshold
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    '' R1CREG value             ' 2.14.7
    '   SSP1BUF = %00001100     ' Write bit with $06 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01110111     ' $77 R1+P1+S1 = 921.00MHz
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' P1CREG value             ' 2.14.8
    '   SSP1BUF = %00001110     ' Write bit with $07 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01100101     ' $65
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' S1CREG value             ' 2.14.9
    '   SSP1BUF = %00010000     ' Write bit with $08 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00011001     ' $19
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' R2CREG value             ' 2.14.10
    '   SSP1BUF = %00010010     ' Write bit with $09 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01110111     ' $77 R2+P2+S2 = 908.04MHz
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' P2CREG value             ' 2.14.11
    '   SSP1BUF = %00010100     ' Write bit with $0A address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01100011     ' $63
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' S2CREG value             ' 2.14.12
    '   SSP1BUF = %00010110     ' Write bit with $0B address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01000011     ' $43
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' PACREG value             ' 2.14.13
    '   SSP1BUF = %00011000     ' Write bit with $0C address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000000     ' PA ramp control for OOK mode only
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
                               
    '' FTXRXIREG value          ' 2.15.1
    '   SSP1BUF = %00011010     ' Write bit with $0D address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %11001100     ' IRQ0RX = RX Sync match, IRQ1RX = RX CRC Okay
    '                           ' IRQ1TX = TX Done,       IRQ1TX = FIFO full
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
                               
    '' FTPRIREG value           ' 2.15.2
    '   SSP1BUF = %00011100     ' Write bit with $0E address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00111001     ' 5:IRQ0 TX Done, 4:TX start FIFO !empty, 0: 1 = Clear PLL lock
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' RSTHIREG value           ' 2.15.3
    '   SSP1BUF = %00011110     ' Write bit with $0F address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00101101     ' RSSI threshold set to -95dBm. See 3.4.7.3
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' FILCREG value            ' 2.16.1
    '   SSP1BUF = %00100000     ' Write bit with $10 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00110011     ' Passive filter = 137kHz, Butterworth = 100kHz
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    '' PFCREG value             ' 2.16.2
    '   SSP1BUF = %00100010     ' Write bit with $11 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00111000     ' Polyphase Center Freq. set to 100kHz default
    '                           ' for OOK only
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' SYNCREG value            ' 2.16.3
    '   SSP1BUF = %00100100     ' Write bit with $12 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00110000     ' Sync word EN, 24bit, no errors allowed
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' RSTSREG value            ' 2.16.4
    '   SSP1BUF = %00100110     ' Write bit with $13 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000111     ' Reserved, non zero value
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' RSVREG value              ' 2.16.5
    '   SSP1BUF = %00101000     ' Write bit with $14 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000000     ' RSSI read only value
    '                           ' RSSI[dBm] = 0.55 * RSSIVAL - 118.5[dBm]
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' OOKCREG value            ' 2.16.6
    '   SSP1BUF = %00101010     ' Write bit with $15 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000000     ' OOK only, default value
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' SYNCV31REG value         ' 2.17.1
    '   SSP1BUF = %00101100     ' Write bit with $16 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %10101010     ' Sync value, 1st byte = $AA
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' SYNCV23REG value         ' 2.17.2
    '   SSP1BUF = %00101110     ' Write bit with $17 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01010101     ' Sync value, 2nd byte = $55
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task    
    
    '' SYNCV15REG value         ' 2.17.3
    '   SSP1BUF = %00110000     ' Write bit with $18 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %10101010     ' Sync value, 3rd byte = $AA
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task   
    
    '' SYNCV07REG value         ' 2.17.4
    '   SSP1BUF = %00110010     ' Write bit with $19 address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01010101     ' Sync value, 4th byte = $55
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' TXCONVREG value          ' 2.18.1
    '   SSP1BUF = %00110100     ' Write bit with $1A address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01110000     ' TX filter default = 200kHz, TX Pwr = +13dBm
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task  
    
    '' CLKOREG value            ' 2.19.1
    '   SSP1BUF = %00110110     ' Write bit with $1B address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00000000     ' Clock out control disabled
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' PLOADREG value           ' 2.20.1
    '   SSP1BUF = %00111000     ' Write bit with $1C address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %00010000     ' Manchester disabled, Packet length = 16 byte
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' NADDSREG value           ' 2.20.2
    '   SSP1BUF = %00111010     ' Write bit with $1D address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %11001100     ' Node address = $CC
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' PKTCREG value            ' 2.20.3
    '   SSP1BUF = %00111100     ' Write bit with $1E address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    '   SSP1BUF = %01011000     ' Pkt length fixed, preamble = 3 bytes, White ON
    '                           ' CRC EN, Address filter OFF
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '' FCRCREG value            ' 2.20.4
    '   SSP1BUF = %00111110     ' Write bit with $1F address
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task            
    '   SSP1BUF = %00000000     ' FIFO auto clear if/CRC, FIFO Write on STBY
    '   GOSUB SSP_INT           ' Wait until MSSP module finishes task
       
    '   CSCON = 1               ' Disable Chip Select
    
    'RETURN
    
    ' Allow MSSP module to finish task
    SSP_INT: 
       WHILE !PIR1.3: WEND
       PIR1.3 = 0
    RETURN
    
    '=========================================================================
    '                           RF module RX mode config
    ' This routine takes xxxms to complete where the receive time uses xxxms
    ' of it with 16 bytes at 10kbs.
    '=========================================================================
    RX_mode:
       CSCON = 0               ' Enable Chip Select
       
    '************ Set IRQ0 to /FIFOEmpty and IRQ1 to FIFO Threshold ***********
    ' FTXRXIREG value (INT3 & 4)   ' 2.15.1
       SSP1BUF = %00011010     ' Write bit with $0D address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00100001     ' 7:6 IRQ0 = PLReady, 5:4 IRQ1 = CRCOK  11000001
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '************************* RX mode **************************************
    ' GCONREG value            ' 2.14.1
       SSP1BUF = %00000000     ' Write bit with $00 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %01100001     ' RX mode, 902-915MHz band, Vtune via inductors
                               ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
       CSCON = 1               ' Disable Chip Select
       
    RETURN
    
    '************************* Read FIFO **************************************
    ' Reading the FIFO will clear IRQ0.
    ' Max clock allowed here is 1MHz
    ' This routine takes 696us to complete.
    '**************************************************************************  
    Read_FIFO:
      FOR x = 0 TO 15
        CSDAT = 0               ' Enable Chip Select
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        CSDAT = 1               ' Disable Chip Select
        RX_data[x] = SSP1BUF    ' Assign RX data to array (adds 150us to loop)
      NEXT x
    
    RETURN
    
    
    '=========================================================================
    '                           RF module TX mode config
    ' This routine takes 20.9ms to complete where the transmit time uses 20.1ms
    ' of it with 16 bytes at 10kbs.
    '=========================================================================
    TX_mode:
       CSCON = 0               ' Enable Chip Select    
    
    '********************** Set IRQ1 to TX Done *******************************
    ' FTXRXIREG value (INT4)   ' 2.15.1
       SSP1BUF = %00011010     ' Write bit with $0D address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %11001101     ' 3: IRQ1TX = TX Done
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '************************* STBY mode **************************************
    ' GCONREG value            ' 2.14.1
       SSP1BUF = %00000000     ' Write bit with $00 address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
       SSP1BUF = %00101000     ' STBY mode, 915-928MHz band, Vtune via inductors
                               ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
    '************************* FIFO Write on STBY *****************************
    ' FCRCREG value            ' 2.20.4
       SSP1BUF = %00111110     ' Write bit with $1F address
       GOSUB SSP_INT           ' Wait until MSSP module finishes task            
       SSP1BUF = %00000000     ' FIFO auto clear if/CRC, FIFO Write on STBY
       GOSUB SSP_INT           ' Wait until MSSP module finishes task
    
       CSCON = 1               ' Disable Chip Select
       
    '************************* Fill FIFO **************************************  
      FOR x = 1 TO 16
        CSDAT = 0             ' Enable Chip Select
        SSP1BUF = x           ' Write value
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
        CSDAT = 1             ' Disable Chip Select
      NEXT x
       
    '************************* Enable TX mode *********************************      
    ' GCONREG value           ' 2.14.1
      CSCON = 0               ' Enable Chip Select
        SSP1BUF = %00000000   ' Write bit with $00 address
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
        SSP1BUF = %10001000   ' TX mode, 915-928MHz band, Vtune via inductors
                              ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
        GOSUB SSP_INT         ' Wait until MSSP module finishes task  
      CSCON = 1               ' Disable Chip Select
       
      WHILE !INT4: WEND       ' Wait until transmission is complete
      PAUSEUS 100             ' Wait a little
      
    '************* Enable Sleep mode to turn Off transmitter*******************
    ' GCONREG value           ' 2.14.1
      CSCON = 0               ' Enable Chip Select
        SSP1BUF = %00000000   ' Write bit with $00 address
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
        SSP1BUF = %00101000   ' Sleep mode, 915-928MHz band, Vtune via inductors
                              ' :0, 0 = Enable R1/P1/S1, 1 = Enable R2/P2/S2 
        GOSUB SSP_INT         ' Wait until MSSP module finishes task
      CSCON = 1               ' Disable Chip Select
          
    RETURN
    
    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    
    PLL_check:
    ' FTPRIREG value            ' 2.15.2
      CSCON = 0                 ' Enable Chip Select
        SSP1BUF = %01011100     ' Read bit with $0E address
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task       
      CSCON = 1                 ' Disable Chip Select
    RETURN
    
    Reg_read:
      CSCON = 0                 ' Enable Chip Select
      FOR x = 0 TO 31    
        SSP1BUF = ((x << 1) | $40)  ' Shifts left 1 bit, sets $40 bit
        GOSUB SSP_INT           ' Wait until MSSP module finishes task
        SSPBUF = $0             ' Send 8 clock cycles
        GOSUB SSP_INT           ' Wait until MSSP module finishes task        
      NEXT x
      CSCON = 1                 ' Disable Chip Select
    RETURN  
    
    '=========================================================================
    '                           Prestart settings       
    '=========================================================================
    Prestart:
    GOSUB MRF_Init        ' Configure the Radio module, xxxms
    PAUSEUS 100
    
    Main:
      
     GOSUB TX_mode        ' Send 16 bytes with value 1~16
     PAUSE 50             ' every 50ms
    
    
    '*************************************************************************
    ' Original test code had the transceiver: 
    '   * send 16 bytes
    '   * switch to RX mode
    '   * monitor INT3 for 50ms, checking for RX data in FIFO buffer
    '   * check last byte value and clear it and wait 200ms before repeating
    '
    ' This allowed a ping pong function between the transmitter and receiver
    ' every 200ms when valid data was exchanged or the transmitter sent every
    ' 50ms when receiver was not active.
    '*************************************************************************
    
    '  IF RX_data[15] != 16 THEN
    '    GOSUB TX_mode
    '    GOSUB RX_mode
    '  ENDIF  
      
    '  FOR y = 0 TO 49
    '    IF INT3 THEN 
    '      GOSUB Read_FIFO      
    '    ENDIF
    '    PAUSE 1
    '  NEXT y   
      
    '  IF RX_data[15] = 16 THEN
    '    RX_data[15] = 0
    '    PAUSE 200
    '  ENDIF
    
    GOTO Main
    
    
    END
    Louie

Similar Threads

  1. Interfacing LC75854
    By MR2010 in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 18th July 2010, 03:42
  2. Keypad Interfacing
    By uaf5000 in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 15th June 2010, 03:35
  3. Interfacing with the ISD4003
    By lerameur in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 2nd June 2008, 16:25
  4. SPI Interfacing
    By toofastdave in forum Serial
    Replies: 8
    Last Post: - 18th November 2007, 12:15
  5. interfacing LCD
    By husakhalid in forum mel PIC BASIC
    Replies: 3
    Last Post: - 30th May 2006, 23:53

Members who have read this thread : 2

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts