Code:
'* Author : LEONARDO BILALIS *
'* Notice : Copyright (c) 2017 [LEONARDOS BILALIS] *
'* : All Rights Reserved *
'* Date : 24/5/2018 *
'* Version : 1.0 *
'* Notes : This is a GPS *
'* : *
'****************************************************************
@ ERRORLEVEL -306 ; this command prevents the compiler to give you a notice of
; crossing page boundary - make sure bits are set
@ __config _CONFIG1, _HS_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF
Include "MODEDEFS.BAS"
DEFINE OSC 8
OSCCON=%01111000 '8 Mhz
CMCON = 7 'turn comparators off
ANSEL = 0 'All digital
PORTB = 0 'make low all ports at B range
input portb.0 'make input portb.0
'-----------------------------------------------------------------------------/
' [ ULCD 1'44 4D System ] /
'---------------------------------------------------------------------------/
' "o" degree character is manual created for degree value
'----------------------------------------------------------------------------/
' [ PIC Variables ] /
'--------------------------------------------------------------------------/
PWRLED var PORTb.1 ; this shows that the initialization is finished
LCD var PORTb.2 ; to LCD operation
GPS_TX var PORTb.0 ; info from GPS
GPS_RX var PORTb.4 ; COMMANDS TO GPS
Testled var PORTb.5
dots var byte
dots = 22
countremain var byte ; we use a countremain to check the incoming from portb.0
pause 1000
' --------------------[ 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 /
' /
'-------------------------------------------------------------------------/
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
knots var word 'speed over ground
knots2 var byte 'speed over ground
course var word 'course
course2 var byte 'course
day var byte 'day
month var byte 'month
year var byte 'year
i var word
GNRMC var word 'protocol
GNGGA var WORD 'protocol
FIX var word 'fix sat V/A
Modefix var byte 'mode fix 1 or 2 or 3 depens
horizon var byte
precision var byte
meter var byte
METERS var byte
Meters2 var byte
marker2 var byte 'UTC OR GRT (GREEK TIME)
' -------------------------------------------------------------------------/
' [ LCD Initialization ] /
'------------------------------------------------------------------------/
serout2 LCD,32,[$55] ' uOLED Initialize
pause 2000
serout2 lcd,32,[$56,$01]
pause 1000
serout2 lcd,32,[$45] ' clear the lcd
pause 500
serout2 lcd,32,[$55]
pause 500
serout2 lcd,32,[$45] ' clesr the lcd
pause 500
serout2 lcd,32,[$73,$00,$03,$11,$ff,$ff," Leonardo Bilalis",$00]
pause 200
serout2 lcd,32,[$73,$02,$06,$10,$ff," Copyright 2018",$00]
pause 3000
serout2 lcd,32,[$45]
pause 1000
serout2 lcd,32,[$73,$02,$06,$10,$ff,$ff," GPS.........",$00]
pause 500
serout2 lcd,32,[$45]
pause 200
'----------------------------------------------------------------------/
' [ After the lcd initialization we power the Led at PIC ] /
'--------------------------------------------------------------------/
HIGH pwrled
'----------------------sent a centence to gps------------------------
;serout gps_rx,84,[$PMTK_103*30]
pause 100
'-------------------------------------------------------------------/
' [MAIN Program] /
'-----------------------------------------------------------------/
Main:
;gosub clearlcd
serin2 gps_tx,84,[countremain] ; we check what is coming from the port
if countremain = 0 then lostcable ; if nothing is coming the we check the cable
;gosub clearlcd
'-------------------------------------------------------------------------------/
' /
' [ 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,[wait("$GNRMC"),_ ;we wait for $GNRMC
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
wait(","),dec3 degrees2,dec2 minutes2,wait("."),dec4 minutesd2,_;we wait for 02353.3600
wait(","),dir2,_ ;we wait for E
wait(","),dec1 knots,wait("."),dec2 knots2,_ ;we wait for 0.02
wait(","),dec3 course,wait("."),dec2 course2,_ ;we wait for 195.80
wait(","),dec2 day,dec2 month,dec2 year] ;we wait for 170518
pause 500
'------------------------------------------------------------------------------/
' /
' [ 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,[wait("$GNGGA"),_ ;we wait for GNGGA
wait(","),dec2 hh,dec2 mm,dec2 ss,wait("."),dec3 sss,_ ;we wait for 140405.000 which is the time when we got info
wait(","),dec2 degrees,dec2 minutes,wait("."),dec4 minutesd,_ ;we wait for 3823.6010 longitude
wait(","),dir,_ ;we wait for the N/S
wait(","),dec3 degrees2,dec2 minutes2,wait("."),dec4 minutesd2,_;we wait for 02353.3054 latitude
wait(","),dir2,_ ;we wait for E/W
wait(","),modefix,_ ;we wait for modefix 1,2 or 3 check gps manual for NMEA
wait(","),dec2 satno,_ ;we wait for the number of fixed satellites, this is impoetant info
wait(","),dec3 horizon,dec precision,_ ;we wait for horizon
wait(","),meter,dec2 METERS,dec Meters2] ;we wait for the meters
pause 100
'---------------------------------------------------------------------------------/
' Here if the GPS module havent been fixed to any satellite will jump to notfix /
'-------------------------------------------------------------------------------/
if fix = "V" then notfix
pause 100
'-----------------------------------------------------------------------------/
' [ Return from notfix ] /
' [ We clear any character on the display ] /
'--------------------------------------------------------------------------/
gosub clearlcd
;serout2 lcd,32,[$45]
;pause 500
'--------------------------------------------------------------------------/
' here is where the code dispays the stored info from the NMEA sentenses /
'------------------------------------------------------------------------/
serout2 lcd,32,[$73,$03,$00,$00,$FF,$FF,"Protocol:","NMEA",$00]
pause 100
serout2 lcd,32,[$73,$01,$02,$01,$07,$E0,"Date:",dec2 day,"/",dec2 month,"/",dec2 year,$00]
pause 100
serout2 lcd,32,[$73,$00,$04,$00,$FF,$E0," TIME: ",dec2 hh+3," :",dec2 mm," :",dec2 ss,$00]
pause 100
serout2 lcd,32,[$73,$00,$07,$00,$FF,$FF," Satellites",$00]
pause 100
serout2 lcd,32,[$73,$03,$09,$11,$07,$FF,dec2 satno,$00]
pause 100
serout2 lcd,32,[$73,$00,$07,$00,$FF,$FF," Fixed",$00]
pause 100
serout2 lcd,32,[$73,$0D,$09,$11,$07,$FF,fix,$00]
pause 100
serout2 lcd,32,[$73,$00,$0B,$00,$ff,$ff,"Lat : ",dec2 degrees,"*",dec2 minutes,"'",dec4 minutesd," ",dir,$00]
pause 100
serout2 lcd,32,[$73,$00,$0D,$00,$ff,$ff,"Lon : ",dec3 degrees2,"*",dec2 minutes2,"'",dec4 minutesd2," ",dir2,$00]
pause 100
;serout2 lcd,32,[$73,$00,$0C,$00,$ff,$ff,"GND SPEED : ",(dec knots,".",dec2 knots2)*/1.852,$00]
;pause 200
;serout2 lcd,32,[$73,$00,$0E,$00,$ff,$ff,"Meters : ",dec2 METERS,dec Meters2,$00]
pause 5000
serout2 lcd,32,[$45] ' clears the LCD
pause 100
goto main
'-----------------------------------------------------------------------------/
' [ SUB ROUTINES ] /
'---------------------------------------------------------------------------/
notfix: ' Still looking for fixed signal
serout2 lcd,32,[$73,$00,$03,$11,$ff,$ff," Waiting for GPS",$00]
pause 100
serout2 lcd,32,[$73,$03,$06,$10,$ff," Time:",dec2 hh+3," :",dec2 mm," :",dec2 ss,$00]
pause 1000
serout2 lcd,32,[$73,$00,$08,$10,$ff,rep "." \22,$00]
pause 200
serout2 lcd,32,[$45] ' clears the LCD
pause 100
goto main 'returns to main
lostcable:
serout2 lcd,32,[$73,$00,$03,$11,$ff,$ff," Connection lost",$00]
pause 100
serout2 lcd,32,[$73,$01,$06,$10,$ff," Please check cable",$00]
pause 2000
serout2 lcd,32,[$45] ' clears the LCD
pause 100
goto main
'-------------------------------------------------------------------------/
' GREEK TIME and Correcrion /
'-----------------------------------------------------------------------/
' at the moment this is not connected to any part of the code
Plusthree:
hh = hh + 3
IF hh = 25 THEN hh = 0
RETURN
'---------------------------------------------------------------------------/
' [ CLEAR LCD ] /
'-------------------------------------------------------------------------/
Clearlcd:
serout2 lcd,32,[$45]
pause 500
RETURN
Bookmarks