'18F4620 8MHz 5110 GPS BMP280 AK8963C HC-12 151218 0900 TEST Define CONFIG1L = 0x00 Define CONFIG1H = 0x08 'INT OSC Define CONFIG2L = 0x1e Define CONFIG2H = 0x00 Define CONFIG3L = 0x00 Define CONFIG3H = 0x81 Define CONFIG4L = 0x80 Define CONFIG4H = 0x00 Define CONFIG5L = 0x0f Define CONFIG5H = 0xc0 Define CONFIG6L = 0x0f Define CONFIG6H = 0xe0 Define CONFIG7L = 0x0f Define CONFIG7H = 0x40 'Define SIMULATION_WAITMS_VALUE = 1 'Comment in for SIM out for PIC Define CLOCK_FREQUENCY = 8 Define SINGLE_DECIMAL_PLACES = 2 Define STRING_MAX_LENGTH = 40 'Needs raising to fit the whole NMEA sentence for transmit AllDigital 'SET PIN IN/OUT TRISA = %00000001 TRISB = %00000000 TRISC = %10010000 '7=RX=1 4=SDI=1 1=RST=0 TRISD = %00000000 '7=compss c/s=0 5=altmtr c/s=0 4=lcd5110 c/s=0 TRISE = %00000100 '2=Button 1=RLED 0=YLED 'SET BITS ON/OFF PORTA = %00000000 'ON/OFF PORTB = %00000000 PORTC = %00000000 PORTD = %11110000 'ALL C/S HIGH PORTE = %00000000 'POSS MCLR RE3 1=RLED 0=YLED ADCON0 = 0x03 'AN0-1-2-3 Can be used as Analogue inputs. ADCON1 = 0x0e ADCON2 = %10100100 T1CON = %00111101 '1:8 -> Timer1 clock = 1MHz'<<<<<<<<<<<<<<<<<<<<<<<<< T2CON = 0 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< T3CON = 0 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< PIR1 = 0 PIR2 = 0 PIE1 = 0 PIE2 = 0 'PIE1.RCIE = 1 'rxd Intr , used for GPS serial input work '#186 extinct AAC'CHECKCHECKCHECK~###### IPR1 = 0 IPR2 = 0 IPR1.TMR1IP = 1 RCON.IPEN = 1 'This MUST be included when using Interrupts OSCCON = %01110010 'internal 8Mhz clock 'OSCTUNE.PLLEN = 1 '*4 PLL enabled so Fosc = 32MHZ'CHECK<<<<<<<<<<<<<<<<<<<< 'SSPCON1 = %00010000 'CHECK<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WaitMs 10 'SPI 'Define SPI_CS_REG = PORTD 'Only used when in slave mode. 'Define SPI_CS_BIT = 4 Define SPI_SCK_REG = PORTC Define SPI_SCK_BIT = 3 Define SPI_SDI_REG = PORTC 'not used, but left in so OSH does not burp Define SPI_SDI_BIT = 4 Define SPI_SDO_REG = PORTC Define SPI_SDO_BIT = 5 Symbol yled = LATE.0 Symbol rled = LATE.1 Symbol lcd_mode = LATC.0 '1=DATA ,0=COMMAND Symbol lcd_reset = LATC.1 'LCD_RESET Symbol radset = LATD.3 'HC-12 RADSET 0=COMMAND ON 1=DATA ON Symbol lcd5110 = LATD.4 '5110 LCD Symbol altmtr = LATD.5 'BMP280 BAROMETER/TEMP Symbol compss = LATD.6 'AK8963C Symbol dataswitch = LATD.7 'RX 2to1 switch 1=GPS 0=HC-12 Symbol tick = LATB.0 'Program test point 'DD>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D GPS DD>D>D>D>D>D>D>D>D>D>D>D>D>D>D ''''''''SERVOS Dim tmr1word As Word Dim servo1 As Single 'dim servo1 As Word 'servo 1 ontime Dim servo2 As Single 'dim servo2 As Word 'servo 2 ontime Dim servo3 As Single 'dim servo3 As Word 'Servo 3 ontime Dim servo4 As Single 'dim servo4 As Word 'Servo 4 ontime Dim tot As Word '22ms - T0 - T3 Dim servo As Byte Dim strbase As String '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Dim st0 As String Dim st1 As String Dim st2 As String Dim st3 As String Dim wt0 As Single Dim wt1 As Single Dim wt2 As Single Dim wt3 As Single Dim arg1 As String '??????????????????????????????? 'D 32767 Then ax = 65535 - ax ax = ax + 1 Endif If ay > 32767 Then ay = 65535 - ay ay = ay + 1 Endif 'AAAAAAAAAAAAAAAAAAAAAAAAAAAA 2'S COMPLIMENT CALC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 'If ax < ay Then 'If ax > 0 And ay > 0 Then 'azi = arctn(ax, ay) 'Endif 'Endif 'strazimuth = #azi 'FOR 5110 SCREEN strx1 = #x1 stry1 = #y1 strz1 = #z1 strx2 = #x2 stry2 = #y2 strz2 = #z2 'strxword = #ax 'stryword = #ay Hserout "DATAC ", " ", #x1, " ", #x2, " ", #y1, " ", #y2, " ", #z1, " ", #z2, CrLf '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Hserout "DATAA ", #strtp, " ", #strpr, " ", CrLf Goto main End 'Await NEO GPS RXD ''''''PASTE: $GPGGA,123459.00,5001.00000,N,00059.00000,W,1,04,1.80,1.2,M,47.7,M,,*7F? '''OR PASTE: $BASE,1100,1200,1300,1400,? On Low Interrupt Save System PIR1.RCIF = 0 PIE1.RCIE = 0 If RCSTA.OERR = 1 Then 'if over run error then flush RXD buffer RCSTA.CREN = 0 RCSTA.CREN = 1 charg = RCREG charg = RCREG Hserout "RX Err!", CrLf Goto skip1 Endif Hserin charg If charg = "$" Then 'start str1(0) = charg rxi = 1 Else Goto skip1 Endif nxt_rxin: Hserin charg If charg = "?" Or charg = 0x0a Then Goto msg_eol str1(rxi) = charg 'Hserout str1(rxi) 'show for testing only rxi = rxi + 1 Goto nxt_rxin 'Hserout CrLf msg_eol: For x = 0 To 70 Hserout str1(x) Next x Hserout CrLf, CrLf If str1(4) = "G" Then 'G' csv = 0 For txi = 1 To 73 charg = str1(txi) strchr = Chr(charg) If strchr <> "," Then msg1 = msg1 + strchr Else csv = csv + 1 Gosub get_val Endif Next txi Else msg1 = "" Endif Hserout " T=", strtim, " N=", strlat, " W=", strlong, CrLf skip1: PIE1.RCIE = 1 Resume 'This subr extracts the main values from the GPS string, into named value messages 'also converts the string to a named numeric value, for maths 'NOTE: hserouts for demo test only get_val: Select Case csv 'COMMA POSITION VALUES Case 1 Case 2 strtim = LeftStr(msg1, 2) + ":" + MidStr(msg1, 3, 2) + ":" + MidStr(msg1, 5, 2) Case 3 strlat = LeftStr(msg1, 10) sinlat = StrValS(strlat) Case 5 strlong = RightStr(msg1, 11) sinlong = StrValS(strlong) Case 12 Case Else EndSelect msg1 = "" Return calc: 'BMP280 'Calculate temperature var1 = ((adc_t / 16384 - (dig_t1 / 1024))) * dig_t2 var2 = (((adc_t) / 131072 - (dig_t1) / 8192) * (adc_t / 131072 - dig_t1 / 8192) * dig_t3) t_fine = var1 + var2 tp = (var1 + var2) / 5120 'Calculate pressure var1 = t_fine / 2 - 64000 var2 = var1 * var1 * dig_p6 / 32768 var2 = var2 + var1 * dig_p5 * 2 var2 = var2 / 4 + dig_p4 * 65536 var1 = ((dig_p3) * var1 * var1 / 524288 + dig_p2 * var1) / 524288 var1 = (1 + var1 / 32768) * dig_p1 pr = 1048576 - adc_p pr = (pr - (var2 / 4096)) * 6250 / var1 var1 = dig_p9 * pr * pr / 2147483648 var2 = pr * dig_p8 / 32768 pr = pr + (var1 + var2 + dig_p7) / 16 Return ''Writes the msg To the lcd at xp [column] And yp {row] [WRITES SMALL DIGITS] Proc wr_msg(xp As Byte, yp As Byte, msg1 As String) lcd_mode = 0 'cmd xp = xp * 6 xp = 0x80 Or xp yp = 0x40 Or yp SPICSOn lcd5110 = 0 '5110 LCD ON SPISend xp SPISend yp lcd5110 = 1 '5110 LCD OFF SPICSOff lcd_mode = 1 'data y = Len(msg1) For x = 1 To y ascval = MidStr(msg1, x, 1) Gosub chr2lcd 'in fontsml.bas Next x End Proc Proc clear() For yp = 0 To 5 Call clr_row(yp) Next yp End Proc 'Clears all normal font row xp Proc clr_row(yp As Byte) xp = 0 lcd_mode = 0 xp = xp * 6 xp = 0x80 Or xp yp = 0x40 Or yp SPICSOn lcd5110 = 0 '5110 LCD ON[[[[C/S DOESN'T MAKE ANY DIFFERENCE]]] SPISend xp SPISend yp lcd5110 = 1 '5110 LCD OFF SPICSOff lcd_mode = 1 SPICSOn lcd5110 = 0 '5110 LCD ON For x = 0 To 83 'all pixels across SPISend 0x00 Next x lcd5110 = 1 '5110 LCD OFF SPICSOff End Proc 'Initialise 5110 and set lcd writing direction cmd5110: lcd_reset = 0 'THERE IS ALSO an LCD_RESET PIN<<<<<<<<<<<<<<<<<<<<<<<<<< WaitMs 100 lcd_reset = 1 WaitMs 10 lcd_mode = 0 'cmd mode WaitMs 10 SPICSOn lcd5110 = 0 '5110 LCD ON SPISend 0x21 WaitUs 100 SPISend 0xb1 'b8 contrast was b0Set LCD Vop 0xB0 for 5V, 0XB1 for 3.3v, 0XBF if screen too dark] WaitUs 100 SPISend 0x04 WaitUs 100 SPISend 0x14 'lcd bias WaitUs 100 SPISend 0x20 WaitUs 100 SPISend 0x0c '' 09 now normal data write mode WaitUs 100 lcd5110 = 1 '5110 LCD OFF SPICSOff 'this is for setting top left of lcd and bit write direction. lcd_mode = 0 xp = xp * 6 xp = 0x80 Or xp yp = 0x40 Or yp SPICSOn lcd5110 = 0 '5110 LCD ON SPISend xp '0x80 SPISend yp '0x40 lcd5110 = 1 '5110 LCD OFF SPICSOff WaitMs 5 ''' Return 'Reset the lcd rst_lcd: lcd_reset = 1 WaitMs 10 lcd_reset = 0 WaitMs 10 lcd_reset = 1 Return