MRF90XAM9A interfacing help


Closed Thread
Results 1 to 40 of 64

Hybrid View

  1. #1
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    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

  2. #2
    Join Date
    Oct 2010
    Posts
    413


    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.

  3. #3
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    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

  4. #4
    Join Date
    Oct 2010
    Posts
    413


    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.

  5. #5
    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.

  6. #6
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,132


    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

  7. #7
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,132


    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

  8. #8
    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, 02:42
  2. Keypad Interfacing
    By uaf5000 in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 15th June 2010, 02:35
  3. Interfacing with the ISD4003
    By lerameur in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 2nd June 2008, 15:25
  4. SPI Interfacing
    By toofastdave in forum Serial
    Replies: 8
    Last Post: - 18th November 2007, 11:15
  5. interfacing LCD
    By husakhalid in forum mel PIC BASIC
    Replies: 3
    Last Post: - 30th May 2006, 22:53

Members who have read this thread : 0

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