'**************************************************************** '* Name : rfm69.BAS * '* Author : richard * '* Notice : * '* : pic18f26k22@64mhz * '* Date : 8/27/2018 * '* Version : 2.0 lcd on ep7 board * '* Notes : simple version for 433mhz rfm69hw on mssp1 * '* : node=4,payload of 16 bytes ,19.2k bps * '* broadcast address is 1 on 435.00 mhz * '**************************************************************** #CONFIG CONFIG FOSC = INTIO67 CONFIG PLLCFG = OFF CONFIG PRICLKEN = ON CONFIG FCMEN = OFF CONFIG IESO = OFF CONFIG PWRTEN = ON CONFIG BOREN = SBORDIS CONFIG BORV = 190 CONFIG WDTEN = OFF CONFIG WDTPS = 32768 CONFIG CCP2MX = PORTC1 CONFIG PBADEN = OFF CONFIG CCP3MX = PORTB5 CONFIG T3CMX = PORTC0 CONFIG HFOFST = ON CONFIG P2BMX = PORTB5 CONFIG MCLRE = EXTMCLR CONFIG STVREN = ON CONFIG LVP = OFF CONFIG XINST = OFF CONFIG DEBUG = OFF CONFIG CP0 = OFF CONFIG CP1 = OFF CONFIG CP2 = OFF CONFIG CP3 = OFF CONFIG CPB = OFF CONFIG CPD = OFF CONFIG WRT0 = OFF CONFIG WRT1 = OFF CONFIG WRT2 = OFF CONFIG WRT3 = OFF CONFIG WRTC = OFF CONFIG WRTB = OFF CONFIG WRTD = OFF CONFIG EBTR0 = OFF CONFIG EBTR1 = OFF CONFIG EBTR2 = OFF CONFIG EBTR3 = OFF CONFIG EBTRB = OFF #ENDCONFIG DEFINE OSC 64 DEFINE LCD_BITS 4 DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 0 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 4 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 5 DEFINE LCD_COMMANDUS 1500 DEFINE LCD_DATAUS 50 sdata var byte tmpa var word tmpb var word tmp var word rxflg var byte i var byte dest var byte rfbuff var byte[17] rfm_int var portc.1 ;dio0 rfm_cs var lata.5 ;nss butt var portc.0 goto overrfm rfm: asm dw 0x0104,0x0200,0x0306,0x0483,0x0503,0x06d7,0x076c,0x08c0 dw 0x0900,0x131a,0x1942,0x2540,0x29dc,0x2c00,0x2d05,0x2e90 dw 0x2fde,0x30ad,0x3163,0x3734,0x3811,0x3904,0x3a01,0x3C8c dw 0x6F30 GLetAddress macro Label, Wout CHK?RP Wout movlw low Label ; get low byte movwf Wout movlw High Label ; get high byte movwf Wout + 1 BANKSEL 0 endm endasm sendFrame: ;tx to dest tmpb = $0104 gosub writeReg pauseus 800 TMPB=$2810 GOSUB WRITEREG TMPB=$2800 GOSUB WRITEREG TMPB=$2500 GOSUB WRITEREG RFM_CS=0 sdata=$80 gosub xspi sdata=dest gosub xspi for i = 0 to 15 sdata=rfbuff[i] gosub xspi next RFM_CS=1 tmpb = $010c GOSUB WRITEREG while rfm_int == 0 : wend tmpb = $0104 gosub writeReg pauseus 800 TMPB=$2540 GOSUB WRITEREG return xspi: ;spi xfer SSP1CON1.7 = 0 SSP1BUF = sdata while(SSP1STAT.0 ==0) :wend sdata = SSP1BUF return writeReg: RFM_CS=0 sdata=tmpb.highbyte|$80 ;reg gosub xspi sdata=tmpb ;data gosub xspi RFM_CS=1 return readReg: RFM_CS=0 sdata=tmpb.highbyte&$7f ;reg gosub xspi sdata=0 gosub xspi RFM_CS=1 tmpb=sdata ;reply return r69Init: @ GLetAddress _rfm ,_tmpa SSPCON1=$21 SSPSTAT=$c0 for tmp=0 to 24 READCODE tmpa,tmpb tmpa=tmpa+2 ; +1 for pic16 +2 for pic18 gosub writeReg next gosub rfm_set_highpower ; "h" modules only return rfm_set_highpower: ; "h" modules only turns on power amp tmpb=$130F gosub writeReg tmpb=$1200 gosub readReg tmpb=tmpb&$1f tmpb=tmpb|$1160 gosub writeReg tmpb=$5a5d gosub writeReg tmpb=$5c7c gosub writeReg return overrfm: OSCCON=$70 OSCTUNE.6=1 while ! osccon2.7 :WEND ;wait for pll trisa=%11011111 trisc=%11010111 ANSELB=0 anselc =0 ANSELa=0 Pause 500 ' LCD initialize time rxflg =0 RFBUFF[16]=0 ;null terminate gosub r69Init tmpb = $0110 ;listen gosub writeReg pauseus 800 lcdout $FE,1 loopy: if rfm_int then ; poll for pkt recieved tmpb = $0104 ;standby gosub writeReg pauseus 800 tmpb=0 gosub readreg if tmpb = 4 then rxflg =1 ;a pkt for me ? i=0 ; while (i<16) tmpb=0 gosub readreg rfbuff[i] = tmpb i=i+1 wend lcdout $FE,$80 lcdout str rfbuff ;print pkt tmpb = $0110 gosub writeReg endif if rxflg then dest=4 gosub sendframe ;don't care what we send just want acknowledgement rxflg=0 tmpb = $0110 gosub writeReg endif goto loopy ' remote end description ' sends a timestamp of 5 digits and "a to h" string to fill payload every second to node 4 ' replies with broadcast packet "hello" when any packet is recieved ' while (1) { ' if (txtf){ // txtf is set every 1 sec by isr ' LED_SetHigh(); ' sprintf(rfm_rxbuff,"ts %5dabcdefgh",timestamp); ' rfm69_SendFrame(4,rfm_rxbuff); ' txtf=0; ' LED_SetLow(); ' rfm69_SetMode(RF69_MODE_RX); ' } ' if (RFM_INT_GetValue())rfm69_Interrupt(rfm_rxbuff); //poll rfm69 ' if (rxdone) { //rxdone flag set on pkt reception ' rfm69_SetMode(RF69_MODE_STANDBY); ' rxdone = 0; ' strcpy(rfm_rxbuff,"hello") ; ' __delay_ms(100); ' rfm69_SendFrame(1,rfm_rxbuff); ' rfm69_SetMode(RF69_MODE_RX); ' } ' }