-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Dear all,
i did the following....
Code:
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 1 Configuration | --------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
'CLROERR = 1 ' Clear overflow automatically
SPBRG = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 2 Configuration | --------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
RCSTA2 = $90 ' Enable serial port & continuous receive
TXSTA2 = $24 ' Enable transmit, BRGH = 1
'CLROERR2 1 ' Clear overflow automatically
SPBRG2 = 130 ' 9600 Baud @ 64MHz, -0,02%
SPBRGH2 = 6
BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
'------------------------------------------------------------------------------|
'-----------sent a sentence to gps, this is not working at the moment----------|
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
' $PMTK011,MTKGPS*08
' $PMTK010,001*2E
' $PMTK010,002*2D
pause 800
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
Pause 500
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
It works the part of a baudrate change, when i send the command to the gps
Code:
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
but i think the following it goes to GPS but for some reason is not set.
Code:
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
When you switch the baudrate you have to set both SPBRG2 and SPBRGH2.
Try:
Code:
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
Pause 500
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
Originally Posted by
tumbleweed
When you switch the baudrate you have to set both SPBRG2 and SPBRGH2.
Try:
Code:
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
Pause 500
It worked!!! I will post later on what i have done up to now. Maybe i need to set up a small indication when those commands are set. So i know that program is working up to that stage.
This is the code for changing the baudrate to GPS and the hz rate at 10Hz at the NMEA data.
Code:
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 1 Configuration | --------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
'CLROERR = 1 ' Clear overflow automatically
SPBRG = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 2 Configuration | --------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
RCSTA2 = $90 ' Enable serial port & continuous receive
TXSTA2 = $24 ' Enable transmit, BRGH = 1
'CLROERR2 1 ' Clear overflow automatically
SPBRG2 = 130 ' 9600 Baud @ 64MHz, -0,02%
SPBRGH2 = 6
BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
'------------------------------------------------------------------------------|
'-----------sent a sentence to gps, this is not working at the moment----------|
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
' $PMTK011,MTKGPS*08
' $PMTK010,001*2E
' $PMTK010,002*2D
pause 800
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
Pause 500
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Dear all,
i need you help.
After removing all the DEFINEs and use only the following
Code:
'RCSTA2 = $90 ' Enable serial port & continuous receive
'TXSTA2 = $24 ' Enable transmit, BRGH = 1
'DEFINE HSER_CLROERR2 1 ' Clear overflow automatically
'SPBRG2 = 130 ' 9600 Baud @ 64MHz, -0,02%
'SPBRGH2 = 6
'BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
and for changing the baudrate and the frequency for the Second Serial,
Code:
pause 800
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
Pause 500
;HSEROUT2 ["$PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0*29",13,10]
HSEROUT2 ["$PMTK314,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28",13,10]
pause 100
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
I found out that on SERIAL TERMINAL on the computer of course i see the data coming from the GPS but unfortunately when i connect an LCD to PIC using the first Serial, the data cannot be displayed.
It seems that when i use
Code:
HSERIN2[wait("$GPRMC")
the data cannot be read from the GPS to the RX of the PIC.
I tried to check if there is a problem with the LCD, but i can send text to the LCD.
I tried to check and use only the DEFINEs with 9600 because the default for the GPS is 9600 and it worked.
so when i do not use the defines, it looks like that RX port on the PIC doesnt work.
Could you please help?
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
I don't know about other members of the forum, but I got confused.
Best throw in both codes that work and don't work.
Do they compile OK?
Are you sure about your connections?
Ioannis
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Ioanni,
thanks for your reply.
The problem is when i use the code to change on the fly as of the guys on the forum advice, without using the "DEFINE" word.
So using the registers like in the following code:
Code:
'RCSTA2 = $90 ' Enable serial port & continuous receive
'TXSTA2 = $24 ' Enable transmit, BRGH = 1
'DEFINE HSER_CLROERR2 1 ' Clear overflow automatically
'SPBRG2 = 130 ' 9600 Baud @ 64MHz, -0,02%
'SPBRGH2 = 6
'BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
and later in order to change the baudrate i use the following:
Code:
pause 800
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
Pause 500
;HSEROUT2 ["$PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0*29",13,10]
HSEROUT2 ["$PMTK314,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28",13,10]
pause 100
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
The GPS gets the command and set correctly the new configuration.
So up to here we are fine. I checked this by using a Serial Terminal and i see that both Baudrate and frequency have changed.
That means that TX is working well, for the first command to the GPS
Code:
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
and changing on the fly the Baudrate the following command to GPS is working fine as well with the NEW baudrate.
Code:
HSEROUT2 ["$PMTK314,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28",13,10]
pause 100
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
[/CODE]
Now what is the problem.
I used a uLCD to send the VTG and RCM data to the display as i have done in the past using both SEROUT and HSEROUT2 command (for the HSEROUT2 i used the following code with the "DEFINE" and worked well)
Code:
'DEFINE HSER2_RCSTA 90h ' Enable serial port & continuous receive
'DEFINE HSER2_TXSTA 24h ' Enable transmit, BRGH = 1
'DEFINE HSER2_CLROERR 1 ' Clear overflow automatically
'DEFINE HSER2_SPBRG 130 ' 9600 Baud @ 64MHz, -0,02%
'SPBRGH2 = 6
'BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
Now using the registers without the "DEFINEs" the RX on the PIC seems that it doesnt work, something like it is closed or cannot read data from GPS.
Forgot to mention that 2 hours now i have tried most of the different settings for the
Code:
BAUDCON2 = %xxxxxxxx
without any luck.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Compile is ok, the same circuit as when the code is working with the "DEFINE" code.
Something is wrong with the new code that i change the baudrate on the fly.
there is something going really wrong. Maybe i need to give more PAUSE time?
I try that as well.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Are you aware of what's been commented out in the code you're showing?
Post the entire code as it is.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Page 281 of the K22 PIC has all the settings of the BRGH, BRG16, SPBRGx in relation to the system Clock.
Also, depending whether you have RS232 driver or not you have to set or reset the BAUDCONx bits 4 and 5.
If you will use on both Rx and Tx pins a driver (like the MAX232) then these bits should be 0. If you connect directly to another TTL serial port then these bits should be 1.
Ioannis
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
Originally Posted by
tumbleweed
Are you aware of what's been commented out in the code you're showing?
Post the entire code as it is.
Thanks for the reply. Yes i will post later today the code. But i understand the logic using MISTERE's calculator for EUART and it worked fine. But As the GPS at default is working at 9600, i need to speed it up to 38400. So at this point baudarate change on the fly needs a different settings.
I have configured the code in order to change the baudrate as mentioned on my previous posts, and from the SERIAL TERMINAL, on the computer i see that TX from PIC to GPS is working fine.
But the RX of the PIC looks like is not receiving or is not reading the info.
In any case i will post the entire code later.
Thanks once again.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Here is the code that is not working.
Code:
'*********************************************************************************
@ ERRORLEVEL -306 ; this command prevents the compiler to give you a notice of *
; crossing page boundary - make sure bits are set *
'*********************************************************************************
#CONFIG ; The PBP configuration for the PIC18F26K22 is:
; CONFIG FOSC = RCIO6 ; External RC oscillator
CONFIG FOSC = HSHP ; HS oscillator (high power > 16 MHz)
;*---------------------------------4x PLL ENABLE--------------------------------------*|
;* 4X PLL Enable *|
;* CONFIG PLLCFG = OFF ;Oscillator used directly *|
CONFIG PLLCFG = ON ;Oscillator multiplied by 4 *|
;*------------------------------------------------------------------------------------*|
;
; Primary clock enable bit
; CONFIG PRICLKEN = OFF ;Primary clock can be disabled by software
CONFIG PRICLKEN = ON ;Primary clock enabled
;
; Fail-Safe Clock Monitor Enable bit
CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor disabled
; CONFIG FCMEN = ON ;Fail-Safe Clock Monitor enabled
;
; Internal/External Oscillator Switchover bit
CONFIG IESO = OFF ;Oscillator Switchover mode disabled
; CONFIG IESO = ON ;Oscillator Switchover mode enabled
CONFIG BOREN = SBORDIS ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
;*--------------------------------------------------------------------------------------------------------;|
CONFIG WDTEN = ON ; WDT is always enabled. SWDTEN bit has no effect ;|
CONFIG WDTPS = 32768 ; 1:32768 ---> HERE enable the watchdog timer with a 1:32768 postscale;|
;*--------------------------------------------------------------------------------------------------------;|
CONFIG PWRTEN = ON
CONFIG HFOFST = ON ; HFINTOSC output and ready status are not delayed by the oscillator stable status
CONFIG MCLRE = EXTMCLR ; MCLR pin enabled, RE3 input pin disabled
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Disabled
;*----------------------------------------------------------------------------------|
;*---------------Available configuration settings for PIC18F26K22-------------------|
;*----------------------------------------------------------------------------------|
;
; Oscillator Selection bits
; CONFIG FOSC = RC ;111X External RC oscillator, CLKOUT function on RA6
; CONFIG FOSC = ECLPIO6 ;EC oscillator (low power, <500 kHz)
; CONFIG FOSC = ECLP ;EC oscillator, CLKOUT function on OSC2 (low power, <500 kHz)
; CONFIG FOSC = ECMPIO6 ;EC oscillator (medium power, 500 kHz-16 MHz)
; CONFIG FOSC = ECMP ;EC oscillator, CLKOUT function on OSC2 (medium power, 500 kHz-16 MHz)
; CONFIG FOSC = INTIO7 ;Internal oscillator block, CLKOUT function on OSC2
; CONFIG FOSC = INTIO67 ;Internal oscillator block
; CONFIG FOSC = RCIO6 ;External RC oscillator
; CONFIG FOSC = RC ;External RC oscillator, CLKOUT function on OSC2
; CONFIG FOSC = ECHPIO6 ;EC oscillator (high power, >16 MHz)
; CONFIG FOSC = ECHP ;EC oscillator, CLKOUT function on OSC2 (high power, >16 MHz)
; CONFIG FOSC = HSMP ;HS oscillator (medium power 4-16 MHz)
; CONFIG FOSC = HSHP ;HS oscillator (high power > 16 MHz)
; CONFIG FOSC = XT ;XT oscillator
; CONFIG FOSC = LP ;LP oscillator
;*--------------------------------------------------------------------------------------------------------|
;* | -------------------------- | |
;* ----------------------------- | [PROTECTED OPTION FUSES] | ------------------------------------ |
;* | -------------------------- | |
;*--------------------------------------------------------------------------------------------------------|
CONFIG CP0 = OFF ; Block 0 (000800-003FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (004000-007FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (008000-00BFFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (00C000-00FFFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-003FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (004000-007FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (008000-00BFFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (00C000-00FFFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot Block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (004000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF ; Boot Block (000000-0007FFh) not protected from table reads executed in other blocks
#ENDCONFIG
;*---------------------------------------------------------------------------------------------------------|
;*---------------------------------------------------------------------------------------------------------|
define OSC 64
INCLUDE "modedefs.bas"
INCLUDE "ALLDIGITAL.pbp" ; Make all ports Digital
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts
OSCCON = %01110000 ; 64Mhz
OSCTUNE.6 = 1 ; Enable 4x PLL
while ! osccon2.7 :WEND ; to make sure the pll has stabilised before you run any other code
'*-----------------------------------------------------------------------------|
'------------------------------------------------------------------------------|
' INITIALIZE RAM |
'------------------------------------------------------------------------------|
initialize:
CLEAR
'-------------------------------------------------------------------------------------------------------------------------------------------------------------
TRISA = %00000000 'use TRISA to specify which pin is (1 = input) and which (0 = output) (ALL pins are output)
TRISB = %10000000 'use TRISB to specify which pin is (1 = input) and which (0 = output) (RB7 PORTB.7 is the RX input pin of the EUART, the rest are output)
TRISC = %10000000 'use TRISC to specify which pin is (1 = input) and which (0 = output) (RC7 PORTC.7 is the RX input pin of the EUART, the rest are output)
'in PORTC the RC3 attached is an LED.
'------------------------------------------------------------------------|
'--------------------------- TRIS A B C ---------------------------------|
'------------------------------------------------------------------------|
' PORTA.7 PORTA.6 PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0 |
' bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
' 0 0 0 0 0 0 0 0 |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
' PORTB.7 PORTB.6 PORTB.5 PORTB.4 PORTB.3 PORTB.2 PORTB.1 PORTB.0 |
' bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
' 1 0 0 0 0 0 0 0 |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
' PORTC.7 PORTC.6 PORTC.5 PORTC.4 PORTC.3 PORTC.2 PORTC.1 PORTC.0 |
' bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
' 1 0 0 0 0 0 0 0 |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
'----------------------- At start all PORTS LOW -------------------------|
'------------------------------------------------------------------------|
PORTA = 0 'make low all ports at A range |
PORTB = 0 'make low all ports at B range |
PORTC = 0 'make low all ports at C range |
PORTE = 0 'make low all ports at E range |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
'-------------------------- COMPARATORS OFF -----------------------------|
'------------------------------------------------------------------------|
CM1CON0.7 = 0 'Disable comparator1 |
CM2CON0.7 = 0 'Disable comparator2 |
'------------------------------------------------------------------------|
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 1 Configuration | --------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
'DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
'DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
'DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'DEFINE HSER_SPBRG 160 ' 38400 Baud @ 64MHz, -0,08%
'SPBRGH = 1
'BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR = 1 ' Clear overflow automatically
SPBRG = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 2 Configuration | --------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
'DEFINE HSER2_RCSTA 90h ' Enable serial port & continuous receive
'DEFINE HSER2_TXSTA 24h ' Enable transmit, BRGH = 1
'DEFINE HSER2_CLROERR 1 ' Clear overflow automatically
'DEFINE HSER2_SPBRG 130 ' 9600 Baud @ 64MHz, -0,02%
'SPBRGH2 = 6
'BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
RCSTA2 = $90 ' Enable serial port & continuous receive
TXSTA2 = $24 ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR2 1 ' Clear overflow automatically
SPBRG2 = 130 ' 9600 Baud @ 64MHz, -0,02%
SPBRGH2 = 6
BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
'BAUDCON2.5 = 1
'------------------------------------------------------------------------------|
'-----------sent a sentence to gps, this is not working at the moment----------|
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
' $PMTK011,MTKGPS*08
' $PMTK010,001*2E
' $PMTK010,002*2D
Pause 800
HSEROUT2 ["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
pause 800
SPBRG2 = 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
Pause 500
;HSEROUT2 ["$PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0*29",13,10]
HSEROUT2 ["$PMTK314,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28",13,10]
pause 100
HSEROUT2 ["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
'------------------------------------------------------------------------------|
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR0_INT, _ToggleLED, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
T0CON = %10010110 ; T0 = 16-bit, Prescaler 8
@ INT_ENABLE TMR0_INT ; enable Timer 0 interrupts
'*-----------------------------------------------------------------------------|
timeout con 2000
LED VAR PORTC.4
PWRLED var PORTC.3 ' indicates that PIC is working on port C.4
TOGPS var PORTB.5 ' this is the pin serout to GPS rx port
hh var byte 'hours
mm var byte 'minutes
ss var byte 'seconds
sss var word 'milisecs
degrees VAR BYTE 'latitude/longitude degrees
minutes VAR BYTE 'latitude/Longitude minutes
minutesD VAR word 'latitude/LONGITUDE DECIMAL MINUTES
dir VAR BYTE ' direction (latitude: 0 = N, 1 = S / longitude: 0 = E, 1 = W)
degrees2 VAR BYTE 'latitude/longitude degrees
minutes2 VAR BYTE 'latitude/Longitude minutes
minutesD2 VAR word 'latitude/LONGITUDE DECIMAL MINUTES
dir2 var byte 'direction (latitude: 0 = N, 1 = S / longitude: 0 = E, 1 = W)
SatNo VAR BYTE 'number of satellites connected
day var byte 'day
month var byte 'month
year var byte 'year
SPEED var word 'speed with conversion ASCII to dec -48
Km var byte 'this is a letter K --> KM/H om the GPVTG sentence
TS var byte[4] 'TOTAL SPEED. we create an array to combine each possible character for speed
decimal var byte
i var word 'we use this for Total speed point
FIX var byte 'fix sat V/A
Modefix var byte 'mode fix 1 or 2 or 3 depens
RED var PORTA.3
GREEN var PORTA.2
BLUE VAR PORTA.1
' -----------------------------------------------------------------------------|
' [ LCD Initialization ] |
'------------------------------------------------------------------------------|
' FIRST TIME BOOTUP: We give plenty of time for tbe LCD '
pause 2000
HSEROUT[$55] ' uOLED Initialize this is the 'U' character of autoband rate to LCD
Hserin [wait(6)]
hserout[$56,$01] ' this is the Version info --> '01 10 17 28 28 -->> "(("
Hserin [wait(1),wait(16),wait(23),wait(40),wait(40)]
HSEROUT [$45] ' clear the LCD
Hserin [wait(6)]
pause 500
hserout[$73,$00,$03,$11,$ff,$ff," Leonardo Bilalis",$00]
Hserin [wait(6)]
hserout[$73,$02,$06,$10,$ff," Copyright 2018",$00]
Hserin [wait(6)]
pause 3000
Hserout [$4F,01] 'Set transparent / opaque TEXT ($00 for transparent or $01 for opaque)
Hserin [wait(6)]
HSEROUT [$45] ' clear the LCD
Hserin [wait(6)]
'-------------------------------------------------------------------------------------
high led
Main:
;serin2 gps_tx,84,timeout,lostcable,[wait("$GNRMC"),_ ;we wait for $GNRMC
HSERIN2[wait("$GPRMC"),_ ;we wait for $GPRMC
wait(","),dec2 hh,dec2 mm,dec2 ss,wait("."),dec3 sss,_ ;we wait for 090045.000 which is the time when we got the info
wait(","),fix,_ ;we wait for A
wait(","),dec2 degrees,dec2 minutes,wait("."),dec4 minutesd,_ ;we wait for 3823.6645
wait(","),dir,_ ;we wait for N/S ;wait(","),dec3 degrees2,dec2 minutes2,wait("."),dec4 minutesd2,_;we wait for 02353.3600
wait(","),dec3 degrees2,dec2 minutes2,wait("."),dec4 minutesd2,_;we wait for 02353.3600
wait(","),dir2,_ ;we wait for E/W
wait(","),wait(","),_
wait(","),dec2 day,dec2 month,dec2 year,_ ;we wait for 170518
wait(","),SKIP 3]
if fix = "V" then gps
'serin2 gps_tx,84,timeout,lostcable,[wait("GNVTG"),_
HSERIN2[wait("GPVTG"),wait("N"),_
wait(","),TS[0],TS[1],TS[2],TS[3],TS[4],_
wait(","),SKIP 3]
for i = 1 to 3
if TS[i]="." then decimal = i 'TOTAL SPEED. find which character is the decimal point
next i
select case decimal 'if the gps shows 1.45 it may be 145
'for the conversion ASCII to number we can use the -48
case 1 'decimal position is x.xx
SPEED = (10*(TS[0]-48))+(TS[2]-48)
case 2 'decimal position is xx.xx
SPEED = (100*(TS[0]-48))+(10*(TS[1]-48))+(TS[3]-48)
case 3 'decimal position is xxx.xx
SPEED = (1000*(TS[0]-48))+(100*(TS[1]-48))+(10*(TS[2]-48))
end select
gosub OVERSPEED
HSEROUT [$73,$05,$06,$11,$FF,$E0," SPEED",$00]
Hserin [wait(6)]
HSEROUT [$73,$06,$05,$12,$6D,$BF,TS[0],TS[1],TS[2],TS[3],$00]
Hserin [wait(6)]
HSEROUT [$73,$06,$06,$12,$FF,$E0,"Km/h",$00]
Hserin [wait(6)]
goto main
'-----------------------------------------------------------------------------/
' [ SUB ROUTINES ] /
'---------------------------------------------------------------------------/
OVERSPEED:
if SPEED > 1000 then ' 100Km/h
high BLUE
low GREEN
low RED
else
LOW BLUE
if SPEED > 500 then ' 50Km/h
high GREEN
low RED
else
LOW GREEN
if SPEED > 100 then ' 10Km/h
high RED
else
LOW RED
endif
endif
endif
return
GPS:
HSEROUT [$45] ' clears the LCD
Hserin [wait(6)]
HSEROUT [$73,$00,$03,$11,$6D,$BF," Waiting for GPS",$00]
Hserin [wait(6)]
HSEROUT [$73,$04,$07,$12,$F8,$00,"NOT FIXED",$00]
Hserin [wait(6)]
pause 3000
HSEROUT [$45] ' clears the LCD
Hserin [wait(6)]
goto main 'returns to notfix
'---[INT - interrupt handler]---------------------------------------------------
ToggleLED:
TOGGLE pwrled
@ INT_RETURN
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Try changing this:
Code:
DEFINE HSER_CLROERR2 1 ' Clear overflow automatically
to this:
Code:
DEFINE HSER2_CLROERR 1 ' Clear overflow automatically
You'll definitely be getting overrun errors, so if they're not cleared properly it'll stop receiving.
I'd also try some a LOT simpler to start with. I'd be amazed if those HSERIN2 commands in your main loop work reliably... one thing out of place and it'll likely take a long time to sync up again (if ever).
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Hi tumbleweed,
that was the typo mistake really. Now it works. thanks a lot.
I was stuck for a day! Now i can move forward to the next target. :)
Really appreciate your help.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Dear all,
as for the last step, changing the baudrate of the GPS on the fly, the same time as the PIC chip it self on PORT EUART 2, i've notice that not all the time the configuration work.
Sometimes the GPS doesn't get the command. I tried to see if i could get an ACK but couldn't see anything coming on RX.
Base on the manufacturer datasheet there should be a reply message for every command we send. But really didn't see any reply.
Is there anything i could do, to help the GPS to receive always the command and not "reject" it? Should i give more time at start up?
I have already place the following commands on the code in order to check if the GPS has successfully powered up.
Code:
' -----------------------------------------------------------------------------|
' [ GPS Initialization ] |
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
HSERIN2 [wait("PMTK011,MTKGPS*08")]
HSERIN2 [wait("PMTK010,001*2E")]
HSERIN2 [wait("PMTK010,002*2D")]
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
I'd be amazed if those HSERIN2 commands in your main loop work reliably
I agree with tumbleweeds thought, increasing baud rate to 38k cuts the time available to process that streamed data to one quarter of what was available at 9600 baud . its asking for trouble .
what possible advantage are you seeking with the higher baud rate ?
there is great merit in sending data to the serial display as fast as possible but I have difficulty seeing any benefit in getting nmea data at higher speeds.
now that you have a chip with adequate memory and horsepower why not use a buffer to store and process the sentences?
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
Originally Posted by
richard
I agree with tumbleweeds thought, increasing baud rate to 38k cuts the time available to process that streamed data to one quarter of what was available at 9600 baud . its asking for trouble .
what possible advantage are you seeking with the higher baud rate ?
there is great merit in sending data to the serial display as fast as possible but I have difficulty seeing any benefit in getting nmea data at higher speeds.
now that you have a chip with adequate memory and horsepower why not use a buffer to store and process the sentences?
Hi Richard, to be honest i dont know the way to store and process the sentences , but i will search for it and come back with some question. First i will try to understand the concept.
Now at the moment i need to speed up the serial communication because i need to use to fastest refresh rate of NMEA data from GPS at 10Hz.
As from the manufacturer and datasheet of the GPS, if you need to go at 5Hz or 10Hz then you need at least to speed up the GPS communication rate at 38400.
The SERIN command inside the main look, do not have any issue. Only at the beginning of the initialization and changing the baudrate and refresh rate.
Apart from that everything else works fine at that rate. At the end of the project which may not be able to complete, i will not use the GPS at 10Hz.
Now i do some fancy test to see how fast the Speed on the Display can be refreshed. As you better understand than me, in order to achieve that, the GPS data must be at a very high rate and the serial communication as well. Actually is a simple speedometer.
Thanks once again all of you for your time and effort to help me.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Do you control power to the GPS?
The sequence of what to do depends on who powers up first. You probably shouldn't assume that the mcu is powered up and initialized before the GPS. It would be good to know how long the GPS takes to powerup and start sending those initial strings.
The sequence might look something like:
- wait several seconds at powerup for the GPS to initialize
leave the uart set for 9600 baud
You'll likely miss any initial serial transmissions that the GPS sends you, but that's ok.
- send a string to the GPS that you know the response for, and wait for that response with a timeout.
The simpler the better... a single response that's easy to parse would work a lot better than a sequence of responses.
loop doing this until you have sync with the GPS.
- now you can switch to 38400
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
Originally Posted by
tumbleweed
Do you control power to the GPS?
The sequence of what to do depends on who powers up first. You probably shouldn't assume that the mcu is powered up and initialized before the GPS. It would be good to know how long the GPS takes to powerup and start sending those initial strings.
The sequence might look something like:
- wait several seconds at powerup for the GPS to initialize
leave the uart set for 9600 baud
You'll likely miss any initial serial transmissions that the GPS sends you, but that's ok.
- send a string to the GPS that you know the response for, and wait for that response with a timeout.
The simpler the better... a single response that's easy to parse would work a lot better than a sequence of responses.
loop doing this until you have sync with the GPS.
- now you can switch to 38400
Hi tumbleweed,
i think i could control the GPS module via Enable pin.
The GPS based on the datasheet, powerup and start sending commands after the following PMTKs.
Code:
' -----------------------------------------------------------------------------|
' [ GPS Initialization ] |
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
HSERIN2 [wait("PMTK011,MTKGPS*08")]
HSERIN2 [wait("PMTK010,001*2E")]
HSERIN2 [wait("PMTK010,002*2D")]
I guess that by using the above code, i wait for each of this commands, and the program only continues if those PMKT sentences from GPS has been received and read. Is that right?
May i use a timeout in there?
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
i think i could control the GPS module via Enable pin.
Does the Enable act like a reset? Do you have a link to the datasheet?
Maybe you could keep the GPS disabled until the main uC powers up and is ready...
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Hmm i need to check that. For the datasheet the gps module is from the MKT with MK3339 chip in it.
Datasheet is on the following Page on the Links mention PA6H
https://www.adafruit.com/product/790
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Enable pin has only the MKT3333 chip, which i also have but i wont use at the moment the MK3333 chip.
http://www.alphamicrowireless.com/me...asheet-v0e.pdf
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Both of those have an NRESET input which is a low-active signal that will reset the module.
Connect that to one of the pic's IO pins (as long as you're powering the pic at 3.3V).
At startup, init the uart to 9600.
Then set NRESET low, delay 1msec, and set it high. They don't have any timing specs for the NRESET input, but that should do it.
After you get the initial sequence from the GPS then you can switch it to 38400.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
Originally Posted by
tumbleweed
Both of those have an NRESET input which is a low-active signal that will reset the module.
Connect that to one of the pic's IO pins (as long as you're powering the pic at 3.3V).
At startup, init the uart to 9600.
Then set NRESET low, delay 1msec, and set it high. They don't have any timing specs for the NRESET input, but that should do it.
After you get the initial sequence from the GPS then you can switch it to 38400.
Thanks a lot, i'll do that tomorrow and i will post the result. :)
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
I was checking the manual but at the same time the pcb board, which is an adafruit ultimate GPS. They do have an ENABLE pin but this is not coming from the GPS module but from the mic5225 3.3V legulator.
So i guess that via EN pin on the regulator we can hold the pin to GND or LOW for a 1ms and will do the job. I think it will work. Thanks a lot once again.
I would also like to thank you all, because i learn everyday more things step by step.
Apologize for my limited knowlegde, i know that i cannot help you, and it is difficult for you to understand my questions in order to help me as well.
Appreciate your patience.....
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
The EN to the regulator should work as well, but since that will shut off power to the GPS you should make sure to set any IO pins that are outputs to the GPS to tri-state (ie inputs), or drive them low while you have the power off.
For the UART TX output that means disabling the uart to get control of the IO pins.
Also, you may need to pull EN low for longer than 1ms. When the regulator shuts off it'll probably take a while for the GPS 3.3V to drop.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
What i did, is to have all ports low, until the LCD is powered up. Then i set one of the PIC's port to high to enable the GPS's regulator.
That's all and it works up to now fine. Should i leave the PIC's pin to high? Or should i add a transistor and use it as a switch to control the EN pin of the regulator? So setting the PIC's pin to high, close the transistor EC to GND, and the EN pin is set to 0. Then release the PIC pin to LOW, and the same time open the EC from the transistor, and enable the GPS.
But with this method i will have one more component in my final circuit and couple of resistors at B and E.
EDITED:....................
I did make the portb.2 as an input after i powered up the GPS. It seems that works the same.
Code:
'------------------------------------------------------------------------------|
' [ GPS HOLD ON RESET for a bit ] |
'------------------------------------------------------------------------------|
high portb.2 ' we set high the ENABLE pin at GPS |
' -----------------------------------------------------------------------------|
' [ GPS Initialization ] |
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
HSERIN2 [wait("PMTK011,MTKGPS*08")]
HSERIN2 [wait("PMTK010,001*2E")]
HSERIN2 [wait("PMTK010,002*2D")]
HSEROUT [$73,$01,$03,$00,$ff,$ff,"GPS is ENABLED",$00]
Hserin [wait(6)]
pause 1500
HSEROUT [$45] ' clear the LCD
Hserin [wait(6)]
'------------------------------------------------------------------------------|
input portb.2 'release the pic's pin and the ENABLE pin of the GPS's regulator|
'------------------------------------------------------------------------------|
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Sorry, I should have explained better.
The PIC IO pin is fine for driving the regulator ENable input... you shouldn't need any other circuitry. Set PORTB.2 as an output low to power off the GPS, and then set it high to turn on the GPS. Leave it as an output high, otherwise the regulator may shut itself off.
However, when you have the GPS power off you must make sure that NONE of the PIC output pins that connect to the GPS are high, otherwise the GPS could get partially powered from those logic lines that are sourcing 3.3V.
The UART TX output pin idles high once the UART is enabled (RCSTA2.SPEN, bit 7 = 1), which I think happens during initialization. With SPEN = 0 the uart TX and RX pins are under control of the ports.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
Quote:
Originally Posted by
tumbleweed
Sorry, I should have explained better.
The PIC IO pin is fine for driving the regulator ENable input... you shouldn't need any other circuitry. Set PORTB.2 as an output low to power off the GPS, and then set it high to turn on the GPS. Leave it as an output high, otherwise the regulator may shut itself off.
However, when you have the GPS power off you must make sure that NONE of the PIC output pins that connect to the GPS are high, otherwise the GPS could get partially powered from those logic lines that are sourcing 3.3V.
The UART TX output pin idles high once the UART is enabled (RCSTA2.SPEN, bit 7 = 1), which I think happens during initialization. With SPEN = 0 the uart TX and RX pins are under control of the ports.
Now it is clear. I did it as you advised. Thank a lot.
-
Re: GPS Project: PIC18F26K22 or PIC18F46K22
i havent post for some days now, because i have changed the Display from 1'44 to 3.2 and the old serial interface code from 1'44 to SPE as 4D Systems calls it.
I have changed also the GPS and the firmware which is configured at 115200 bps. Still the code is very simple.
Code:
'**********************************************************************
'* Name : 18F26K22.BAS *
'* Author : [Leonardo Bilalis] *
'* Notice : Copyright (c) 2018 [Leonardo Bilalis] *
'* : All Rights Reserved *
'* Date : 18/Jul/2018 *
'* Version : 1.0 *
'* Notes : This is a GPS Tracker based on the following components *
'* : PIC18F26K22 or PIC18F46K22 @ 64Mhz *
'* : MKT 3333 or 3339 GPS MODULE *
'* : 4D Systems ULCD Goldelox or Picasso Graphic Processor *
'**********************************************************************
'**********************************************************************
'* AXN5.1.1_8524_3333_1152.1151100.1 *
'**********************************************************************
' --------------------[ GPS Variables for NMEA sentenses ]---------------------/
' /
' $GPRMC,090045.000,A,3823.6645,N,02353.3600,E,0.02,195.80,170518,,,A*62 /
' $GNGGA,140405.000,3823.6010,N,02353.3054,E,1,9,0.88,0.8,M,35.9,M,,*40 /
' $GPGSA,A,3,18,08,10,11,14,27,22,32,01,,,,2.62,1.11,2.37*03 /
' $GPVTG,215.60,T,,M,0.44,N,0.82,K,A*37 /
' /
'-----------------------------------------------------------------------/
' When the GPS Module is POWERED ON, then the following sentenses are received.
' $PMTK011,MTKGPS*08
' $PMTK010,001*2E
' $PMTK010,002*2D
'*********************************************************************************
@ ERRORLEVEL -306 ; this command prevents the compiler to give you a notice of *
; crossing page boundary - make sure bits are set *
'*********************************************************************************
#CONFIG ; The PBP configuration for the PIC18F26K22 is:
; CONFIG FOSC = RCIO6 ; External RC oscillator
CONFIG FOSC = HSHP ; HS oscillator (high power > 16 MHz)
;*---------------------------------4x PLL ENABLE--------------------------------------*|
;* 4X PLL Enable *|
;* CONFIG PLLCFG = OFF ;Oscillator used directly *|
CONFIG PLLCFG = ON ;Oscillator multiplied by 4 *|
;*------------------------------------------------------------------------------------*|
;
; Primary clock enable bit
; CONFIG PRICLKEN = OFF ;Primary clock can be disabled by software
CONFIG PRICLKEN = ON ;Primary clock enabled
;
; Fail-Safe Clock Monitor Enable bit
CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor disabled
; CONFIG FCMEN = ON ;Fail-Safe Clock Monitor enabled
;
; Internal/External Oscillator Switchover bit
CONFIG IESO = OFF ;Oscillator Switchover mode disabled
; CONFIG IESO = ON ;Oscillator Switchover mode enabled
CONFIG BOREN = SBORDIS ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
;*--------------------------------------------------------------------------------------------------------;|
CONFIG WDTEN = ON ; WDT is always enabled. SWDTEN bit has no effect ;|
CONFIG WDTPS = 32768 ; 1:32768 ---> HERE enable the watchdog timer with a 1:32768 postscale;|
;*--------------------------------------------------------------------------------------------------------;|
CONFIG PWRTEN = ON
CONFIG HFOFST = ON ; HFINTOSC output and ready status are not delayed by the oscillator stable status
CONFIG MCLRE = EXTMCLR ; MCLR pin enabled, RE3 input pin disabled
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Disabled
;*----------------------------------------------------------------------------------|
;*---------------Available configuration settings for PIC18F26K22-------------------|
;*----------------------------------------------------------------------------------|
;
; Oscillator Selection bits
; CONFIG FOSC = RC ;111X External RC oscillator, CLKOUT function on RA6
; CONFIG FOSC = ECLPIO6 ;EC oscillator (low power, <500 kHz)
; CONFIG FOSC = ECLP ;EC oscillator, CLKOUT function on OSC2 (low power, <500 kHz)
; CONFIG FOSC = ECMPIO6 ;EC oscillator (medium power, 500 kHz-16 MHz)
; CONFIG FOSC = ECMP ;EC oscillator, CLKOUT function on OSC2 (medium power, 500 kHz-16 MHz)
; CONFIG FOSC = INTIO7 ;Internal oscillator block, CLKOUT function on OSC2
; CONFIG FOSC = INTIO67 ;Internal oscillator block
; CONFIG FOSC = RCIO6 ;External RC oscillator
; CONFIG FOSC = RC ;External RC oscillator, CLKOUT function on OSC2
; CONFIG FOSC = ECHPIO6 ;EC oscillator (high power, >16 MHz)
; CONFIG FOSC = ECHP ;EC oscillator, CLKOUT function on OSC2 (high power, >16 MHz)
; CONFIG FOSC = HSMP ;HS oscillator (medium power 4-16 MHz)
; CONFIG FOSC = HSHP ;HS oscillator (high power > 16 MHz)
; CONFIG FOSC = XT ;XT oscillator
; CONFIG FOSC = LP ;LP oscillator
;*--------------------------------------------------------------------------------------------------------|
;* | -------------------------- | |
;* ----------------------------- | [PROTECTED OPTION FUSES] | ------------------------------------ |
;* | -------------------------- | |
;*--------------------------------------------------------------------------------------------------------|
CONFIG CP0 = OFF ; Block 0 (000800-003FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (004000-007FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (008000-00BFFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (00C000-00FFFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-003FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (004000-007FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (008000-00BFFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (00C000-00FFFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot Block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (004000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF ; Boot Block (000000-0007FFh) not protected from table reads executed in other blocks
#ENDCONFIG
;*---------------------------------------------------------------------------------------------------------|
;*---------------------------------------------------------------------------------------------------------|
define OSC 64
INCLUDE "modedefs.bas"
INCLUDE"ALLDIGITAL.pbp"
OSCCON = %01110000 ; 64Mhz
OSCTUNE.6 = 1 ; Enable 4x PLL
while ! osccon2.7 :WEND ; to make sure the pll has stabilised before you run any other code
'------------------------------------------------------------------------------|
' INITIALIZE RAM |
'------------------------------------------------------------------------------|
initialize:
CLEAR
'-------------------------------------------------------------------------------------------------------------------------------------------------------------
TRISA = %00000000 'use TRISA to specify which pin is (1 = input) and which (0 = output) (ALL pins are output)
TRISB = %10000000 'use TRISB to specify which pin is (1 = input) and which (0 = output) (RB7 PORTB.7 is the RX input pin of the EUART, the rest are output)
TRISC = %00000000 'use TRISC to specify which pin is (1 = input) and which (0 = output) (RC7 PORTC.7 is the RX input pin of the EUART, the rest are output)
'in PORTC the RC3 attached is an LED.
'------------------------------------------------------------------------|
'--------------------------- TRIS A B C ---------------------------------|
'------------------------------------------------------------------------|
' PORTA.7 PORTA.6 PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0 |
' bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
' 0 0 0 0 0 0 0 0 |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
' PORTB.7 PORTB.6 PORTB.5 PORTB.4 PORTB.3 PORTB.2 PORTB.1 PORTB.0 |
' bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
' 1 0 0 0 0 0 0 0 |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
' PORTC.7 PORTC.6 PORTC.5 PORTC.4 PORTC.3 PORTC.2 PORTC.1 PORTC.0 |
' bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
' 1 0 0 0 0 0 0 0 |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
'----------------------- At start all PORTS LOW -------------------------|
'------------------------------------------------------------------------|
PORTA = 0 'make low all ports at A range |
PORTB = 0 'make low all ports at B range |
PORTC = 0 'make low all ports at C range |
PORTE = 0 'make low all ports at E range |
'------------------------------------------------------------------------|
'------------------------------------------------------------------------|
'-------------------------- COMPARATORS OFF -----------------------------|
'------------------------------------------------------------------------|
CM1CON0.7 = 0 'Disable comparator1 |
CM2CON0.7 = 0 'Disable comparator2 |
'------------------------------------------------------------------------|
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 1 Configuration | ---------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
'RCSTA = $90 ' Enable serial port & continuous receive
'TXSTA = $24 ' Enable transmit, BRGH = 1
'DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'SPBRG = 130 ' 9600 Baud @ 64MHz, -0,02%
'SPBRGH = 6
'BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
'BAUDCON.5 = 1
'BAUDCON = %10001000
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 138 ' 115200 Baud @ 64MHz, -0,08%
SPBRGH = 0
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
'*-----------------------------------------------------------------------------|
'* | --------------------- | |
'*----------------------- | EUART 2 Configuration | ---------------------------|
'* | --------------------- | |
'*-----------------------------------------------------------------------------|
DEFINE HSER2_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER2_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER2_CLROERR 1 ' Clear overflow automatically
DEFINE HSER2_SPBRG 160 ' 38400 Baud @ 64MHz, -0,08%
SPBRGH2 = 1
BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
'*-----------------------------------------------------------------------------|
'*-----------------------------------------------------------------------------|
PWRLED var PORTA.0 ' indicates that PIC is working on port C.4
'------------------------------------------------------------------------------|
' FONTS FROM THE uSD |
'------------------------------------------------------------------------------|
'file_LoadImageControl[0009 "FONTST~2.d01" "FONTST~2.g01" 0001] 0,033 (ACK 5148 0x141C)
'file_LoadImageControl[0009 "FONTST~2.d02" "FONTST~2.g02" 0001] 0,038 (ACK 4845 0x12ED)
'file_LoadImageControl[0009 "FONTST~2.d03" "FONTST~2.g03" 0001] 0,037 (ACK 4542 0x11BE)
'file_LoadImageControl[0009 "FONTST~2.d04" "FONTST~2.g04" 0001] 0,039 (ACK 4239 0x108F)
'file_LoadImageControl[0009 "FONTST~2.d05" "FONTST~2.g05" 0001] 0,042 (ACK 3936 0x0F60)
'file_LoadImageControl[0009 "FONTST~2.d06" "FONTST~2.g06" 0001] 0,038 (ACK 3633 0x0E31)
'file_LoadImageControl[0009 "FONTST~2.d07" "FONTST~2.g07" 0001] 0,040 (ACK 3330 0x0D02)
'file_LoadImageControl[0009 "FONTST~2.d08" "FONTST~2.g08" 0001] 0,045 (ACK 3027 0x0BD3)
' -----------------------------------------------------------------------------|
' [ LCD Initialization ] |
'------------------------------------------------------------------------------|
' FIRST TIME BOOTUP: We give plenty of time for tbe LCD '
pause 3000
high pwrled
HSerout2[$FF,$9E,$00,$01] 'SPE serial graphic interface -SET THE LANDSCAPE R
Hserin2 [wait(6)]
HSEROUT2 [$FF,$03] ' MOUNT FILE, this is very imporntat command in here.
Hserin2 [wait(6)]
'HSEROUT2[$00,$09,"FONTST~2.d07","FONTST~2.g07",$00,$01] ' SPE serial graphic interface - CALL FONT from SD
'Hserin2 [wait(6)]
HSEROUT2 [$FF,$00,$00,$46] ' SOUND VOLUME to 70
Hserin2 [wait(6)]
Pause 100
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$7F] ' SPE serial graphic interface - SET COLOR (CYAN)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$01,$00,$02] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
pause 100
hserout2[$00,$18,"Leonardo Bilalis",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$03,$00,$03] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
pause 100
hserout2[$00,$18,"Copyright 2018",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$05,$00,$05] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$E0] ' SPE serial graphic interface - SET COLOR (YELLOW)
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
pause 100
hserout2[$00,$18,"GPS SYSTEM",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$07,$00,$03] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$01] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$01] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$E0] ' SPE serial graphic interface - SET COLOR (LIME)
Hserin2 [wait(6)]
hserout2[$00,$18,"G",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"P",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"S",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18," M",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"K",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"T",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18," 3",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"3",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"3",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"9",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18," a",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"n",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"d",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18," P",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"I",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"C",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"1",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"8",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"F",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"2",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"6",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"K",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"2",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
HSEROUT2 [$00,$0B,"SOUND.WAV",$00]
'HSEROUT2 [$00,$0B,"LASER2.WAV",$00]
Hserin2 [wait(6)]
hserout2[$00,$18,"2",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
pause 3000
HSEROUT2 [$FF,$CD] ' clear the LCD
Hserin2 [wait(6)]
'------------------------------------------------------------------------------|
' [ GPS HOLD ON RESET for a bit ] |
'------------------------------------------------------------------------------|
high portc.3 ' we set high the ENABLE pin at GPS |
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$E0] ' SPE serial graphic interface - SET COLOR (LIME)
Hserin2 [wait(6)]
'HSEROUT2[$FF,$DE,$00,$01] ' SPE serial graphic interface - SETO BOLD
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$01,$00,$00] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
hserout2[$00,$18,"Powering up the GPS",$00] 'SPE serial graphic interface - PUT STRING
Hserin2 [wait(6)]
' -----------------------------------------------------------------------------|
' [ GPS Initialization ] |
'------------------------------------------------------------------------------|
' When the GPS Module is POWERED ON, then the following sentenses are received.
HSERIN [wait("PMTK011,MTKGPS*08")]
HSERIN [wait("PMTK010,001*2E")]
HSERIN [wait("PMTK010,002*2D")]
HSEROUT2[$FF,$E9,$00,$03,$00,$03] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"GPS is ENABLED",$00]
Hserin2 [wait(6)]
pause 1500
'------------------------------------------------------------------------------|
' Changing Baudrate and Frequency |
'------------------------------------------------------------------------------|
HSEROUT ["$PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28",13,10]
'HSEROUT["$PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0*29",13,10] ' ZDA ONLY
pause 100
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$01] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$01] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$FF] ' SPE serial graphic interface - SET COLOR (WHITE)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$0C,$00,$02] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
hserout2[$00,$18,"NMEA:",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$0F,$00,$01] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$7F] ' SPE serial graphic interface - SET COLOR (CYAN)
Hserin2 [wait(6)]
hserout2[$00,$18,"RMC+VTG",$00]
Hserin2 [wait(6)]
'HSEROUT["$PMTK251,38400*27",13,10] ' 38400 boundrate, check MTK manual configuration
'pause 100
'HSEROUT2[$FF,$E9,$00,$0C,$00,$0F] ' SPE serial graphic interface - SET Y,X position
'Hserin2 [wait(6)]
'HSEROUT2[$FF,$E7,$FF,$FF] ' SPE serial graphic interface - SET COLOR (WHITE)
'Hserin2 [wait(6)]
'hserout2[$00,$18,"Baudrate:",$00]
'Hserin2 [wait(6)]
'HSEROUT2[$FF,$E9,$00,$0F,$00,$0F] ' SPE serial graphic interface - SET Y,X position
'Hserin2 [wait(6)]
'HSEROUT2[$FF,$E7,$07,$7F] ' SPE serial graphic interface - SET COLOR (CYAN)
'Hserin2 [wait(6)]
'hserout2[$00,$18,"38400 bps",$00]
'Hserin2 [wait(6)]
'SPBRG = 160 ' 38400 Baud @ 64MHz, -0,08%
'SPBRG2 = 21 ' 57600 Baud @ 64MHz, -0,08%
'SPBRG2 = 138 ' 115200 Baud @ 64MHz, -0,08%
'SPBRGH = 1
HSEROUt["$PMTK220,100*2F",13,10] ' 100(millisecond)=0.1(sec)-->1/0.1= 10Hz
pause 100
HSEROUT2[$FF,$E9,$00,$0C,$00,$1B] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$FF] ' SPE serial graphic interface - SET COLOR (WHITE)
Hserin2 [wait(6)]
hserout2 [$00,$18,"Refresh Rate:",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$0F,$00,$20] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$7F] ' SPE serial graphic interface - SET COLOR (CYAN)
Hserin2 [wait(6)]
hserout2 [$00,$18,"10Hz",$00]
Hserin2 [wait(6)]
pause 3000
HSEROUT2 [$FF,$CD] ' clears the LCD
Hserin2 [wait(6)]
'*-----------------------------------------------------------------------------|
timeout con 2000
hh var byte 'hours
mm var byte 'minutes
ss var byte 'seconds
sss var word 'milisecs
degrees VAR BYTE 'latitude/longitude degrees
minutes VAR BYTE 'latitude/Longitude minutes
minutesD VAR word 'latitude/LONGITUDE DECIMAL MINUTES
dir VAR BYTE 'direction (latitude: 0 = N, 1 = S / longitude: 0 = E, 1 = W)
degrees2 VAR BYTE 'latitude/longitude degrees
minutes2 VAR BYTE 'latitude/Longitude minutes
minutesD2 VAR word 'latitude/LONGITUDE DECIMAL MINUTES
dir2 var byte 'direction (latitude: 0 = N, 1 = S / longitude: 0 = E, 1 = W)
SatNo VAR BYTE 'number of satellites connected
day var byte 'day
month var byte 'month
year var byte 'year
SPEED var word 'speed with conversion ASCII to dec -48
Km var byte 'this is a letter K --> KM/H om the GPVTG sentence
TS var byte[4] 'TOTAL SPEED. we create an array to combine each possible character for speed
decimal var byte
i var word 'we use this for Total speed point
FIX var byte 'fix sat V/A
Modefix var byte 'mode fix 1 or 2 or 3 depens
Day_added var byte
Numofdays var byte 'these are the days of each months
LeapYear var byte 'this is a year leap
ndays var byte[13]'create an array with 13 byte location for Months values
mode2d3d var byte
RED var PORTA.3
GREEN var PORTA.2
BLUE VAR PORTA.1
'--------------------------------------------------------------------------------|
' |
' ---------------------------- [ MAIN ] ----------------------------------- |
' |
'--------------------------------------------------------------------------------|
Main:
'-------------------------------------------------------------------------------/
' /
' [ Example NMEA Sentense of GNRMC ] /
' [$GNRMC,090045.000,A,3823.6645,N,02353.3600,E,0.02,195.80,170518,,,A*62] /
' /
'--------------------------------------------------------------------------/
;serin2 gps_tx,84,timeout,lostcable,[wait("$GNRMC"),_ ;we wait for $GNRMC
HSERIN timeout,lostcable,[wait("$GNRMC"),_ ;we wait for $GPRMC
wait(","),dec2 hh,dec2 mm,dec2 ss,wait("."),dec3 sss,_ ;we wait for 090045.000 which is the time when we got the info
wait(","),fix,_ ;we wait for A
wait(","),dec2 degrees,dec2 minutes,wait("."),dec4 minutesd,_ ;we wait for 3823.6645
wait(","),dir,_ ;we wait for N/S ;wait(","),dec3 degrees2,dec2 minutes2,wait("."),dec4 minutesd2,_;we wait for 02353.3600
wait(","),dec3 degrees2,dec2 minutes2,wait("."),dec4 minutesd2,_;we wait for 02353.3600
wait(","),dir2,_ ;we wait for E/W
wait(","),wait(","),_
wait(","),dec2 day,dec2 month,dec2 year,_ ;we wait for 170518
wait(","),SKIP 3]
'------------------------------------------------------------------------------/
' /
' [ Example NMEA Sentense of GNGGA ] /
' [$GNGGA,140405.000,3823.6010,N,02353.3054,E,1,9,0.88,0.8,M,35.9,M,,*40 /
' /
'-------------------------------------------------------------------------/
'serin2 gps_tx,84,timeout,lostcable,[wait("$GNGGA"),_ ;we wait for GNGGA
HSERIN timeout,lostcable,[wait("$GNGGA"),_ ;we wait for GPGGA
wait(","),skip 41,_
wait(","),dec2 satno,_
wait(","),skip 19]
'wait(","),modefix,_ ;we wait for modefix 1,2 or 3 check gps manual for NMEA
'------------------------------------------------------------------------------/
' /
' [ Example NMEA Sentense of GPGSA ] /
' [$GPGSA,A,3,18,08,10,11,14,27,22,32,01,,,,2.62,1.11,2.37*03] /
' /
'-------------------------------------------------------------------------/
HSERIN timeout,lostcable,[wait("$GPGSA"),wait(","),wait(","),mode2d3d,wait(","),SKIP 50]
if fix = "V" then gps
'serin2 gps_tx,84,timeout,lostcable,[wait("GNVTG"),_
HSERIN timeout,lostcable,[wait("GNVTG"),wait("N"),_
wait(","),TS[0],TS[1],TS[2],TS[3],TS[4],_
wait(","),SKIP 3]
for i = 1 to 3
if TS[i]="." then decimal = i 'TOTAL SPEED. find which character is the decimal point at ulcd fort is the ":"
next i
select case decimal 'if the gps shows 1.45 it may be 145
'for the conversion ASCII to number we can use the -48
case 1 'decimal position is x.xx
SPEED = (10*(TS[0]-48))+(TS[2]-48)
case 2 'decimal position is xx.xx
SPEED = (100*(TS[0]-48))+(10*(TS[1]-48))+(TS[3]-48)
case 3 'decimal position is xxx.xx
SPEED = (1000*(TS[0]-48))+(100*(TS[1]-48))+(10*(TS[2]-48))
end select
gosub OVERSPEED
'-----------------------------------------------------------------------------/
' Here we start the calendar conversion /
'---------------------------------------------------------------------------/
arraywrite ndays,13,NDAY,[0,31,28,31,30,31,30,31,31,30,31,30,31]
if ndays = 2 then
if ((year//4 = 0) and (year//400 != 0)) then 'check the leap year
ndays[2] = 29 'then February has 29 days
else
ndays[2] = 28 'else has 28 days
endif
endif
hh = hh + 3 'the Hour from GPS is UTC so for our country in Greece we add +3
if hh>23 then 'if the hh+3 hour is greater than 23 (23:00) then
day = day + 1 'we check the day added is true
hh = hh//24 'but the hour not exceed the 24 so go to 00:00
if (day > ndays[month]) then
month = month + 1
day = 1
if (month > 12) then
year = year + 1
month = 1
endif
endif
endif
'--------------------------------------------------------------------------/
' here is where the code dispays the stored info from the NMEA sentenses /
'------------------------------------------------------------------------/
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$FF] ' SPE serial graphic interface - SET COLOR (WHITE)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$02,$00,$04] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"GROUND SPEED",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$06,$00,$08] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"Km/h",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$E0] ' SPE serial graphic interface - SET COLOR (LIME)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$05] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$06] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$01,$00,$02] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,TS[0],TS[1],TS[2],TS[3],$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$E0] ' SPE serial graphic interface - SET COLOR (Yellow)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$00,$00,$00] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,dec2 hh,":",dec2 mm,":",dec2 ss,$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$E0] ' SPE serial graphic interface - SET COLOR (Yellow)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$00,$00,$0C] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,dec2 day,"/",dec2 month,"/",dec2 year,$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$04,$00,$00] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"Sats",$00]
Hserin2 timeout,lostcable,[wait(6)]
HSEROUT2[$FF,$E7,$07,$FF] ' SPE serial graphic interface - SET COLOR (AQUA)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$05,$00,$01] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,dec2 satno,$00]
Hserin2 timeout,lostcable,[wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$04,$00,$11] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"Fix",$00]
Hserin2 timeout,lostcable,[wait(6)]
HSEROUT2[$FF,$E7,$07,$FF] ' SPE serial graphic interface - SET COLOR (AQUA)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$05,$00,$011] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,fix,mode2d3d,"D",$00]
Hserin2 timeout,lostcable,[wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$08,$00,$01] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$00,$18,"Lat:",$00]
Hserin2 timeout,lostcable,[wait(6)]
HSEROUT2[$FF,$E7,$FF,$E0] ' SPE serial graphic interface - SET COLOR (Yellow)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$08,$00,$06] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$00,$18,dec2 degrees,"°",dec2 minutes,".",dec4 minutesd,"'"," ",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$E0] ' SPE serial graphic interface - SET COLOR (LIME)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$08,$00,$11] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$00,$18,dir,$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$09,$00,$01] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$00,$18,"Lon:",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$E0] ' SPE serial graphic interface - SET COLOR (Yellow)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$09,$00,$05] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$00,$18,dec3 degrees2,"°",dec2 minutes2,".",dec4 minutesd2,"'"," ",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$07,$FF] ' SPE serial graphic interface - SET COLOR (CYAN)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$09,$00,$11] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$00,$18,dir2,$00]
Hserin2 [wait(6)]
goto main
'-----------------------------------------------------------------------------/
' [ SUB ROUTINES ] /
'---------------------------------------------------------------------------/
OVERSPEED:
if SPEED > 1000 then ' 100Km/h
high BLUE
low GREEN
low RED
else
LOW BLUE
if SPEED > 500 then ' 50Km/h
high GREEN
low RED
else
LOW GREEN
if SPEED > 100 then ' 10Km/h
high RED
else
LOW RED
endif
endif
endif
return
GPS:
HSEROUT2 [$FF,$CD] ' clear the LCD
Hserin2 [wait(6)]
hh = hh + 3
hh = hh//24
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$FF] ' SPE serial graphic interface - SET COLOR (WHITE)
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$01,$00,$05] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"PLEASE WAIT",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$04,$00,$09] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"GPS",$00]
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$06,$00,$06] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"NOT FIXED",$00]
Hserin2 [wait(6)]
pause 3000
HSEROUT2 [$FF,$CD] ' clear the LCD
Hserin2 [wait(6)]
goto main 'returns to main
'-----------------------------------------------------------------------------/
' [ Connection lost Please check the GPS ] /
'---------------------------------------------------------------------------/
lostcable:
HSEROUT2 [$FF,$CD] ' clear the LCD
Hserin2 [wait(6)]
HSEROUT2[$FF,$E5,$00,$02] ' SPE serial graphic interface - SET FONT
Hserin2 [wait(6)]
HSEROUT2[$FF,$E4,$00,$02] 'SPE serial graphic interface - SET WIDTH of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E3,$00,$02] ' SPE serial graphic interface - SET HEIGHT of the text
Hserin2 [wait(6)]
HSEROUT2[$FF,$E9,$00,$02,$00,$02] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$F8,$00] ' SPE serial graphic interface - SET COLOR (RED)
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"Connection lost",$00]
Hserin2 timeout,lostcable,[wait(6)]
HSEROUT2[$FF,$E9,$00,$04,$00,$01] ' SPE serial graphic interface - SET Y,X position
Hserin2 [wait(6)]
HSEROUT2[$FF,$E7,$FF,$E0] ' SPE serial graphic interface - SET COLOR (YELLOW)
Hserin2 [wait(6)]
HSEROUT2 [$00,$18,"Please check cable",$00]
Hserin2 timeout,lostcable,[wait(6)]
pause 2000
HSEROUT2 [$FF,$CD] ' clear the LCD
Hserin2 [wait(6)]
goto main
'-----------------------------------------------------------------------------/
' [ Calendar days in Months ] /
'---------------------------------------------------------------------------/
NDAY:
ndays[0] = 0
ndays[1] = 31 'January
ndays[2] = 28 'February
ndays[3] = 31 'March
ndays[4] = 30 'April
ndays[5] = 31 'May
ndays[6] = 30 'June
ndays[7] = 31 'July
ndays[8] = 31 'August
ndays[9] = 30 'September
ndays[10] = 31 'October
ndays[11] = 30 'November
ndays[12] = 31 'December