How do I discern Maidenhead Locator from GPS lat long info.


Closed Thread
Results 1 to 40 of 126

Hybrid View

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

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    and to emphasize the advantage of an algorithmic approach over spaghetti code


    Code:
     '****************************************************************
    '*  Name    : NOKIA_DEMO.PBP                                     *
    '*  Author  : richard                                            *
    '*  Notice  :                                                    *
    '*          :                                                    *
    '*  Date    : 16/5/2018                                          *
    '*  Version :  mssp1 version  with bigtxt                        *
    '*  Notes   :                                                    *
    '*          :FOR pic 16F1847@32MHZ           NOKIA               *
    '****************************************************************
    #CONFIG ; 16FF1847.
            __config _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF
            __config _CONFIG2, _PLLEN_OFF & _LVP_OFF
    #ENDCONFIG
    define      OSC         32
     
    ; --- *** Oscillator  *** ---------------------------------------------------
    OSCCON = %11110000           ;32 MHz, 
    ANSELb = 0
    ANSELA = 0
    TRISA=%10010000
    TRISB=%11101011
    ch var byte
    BUFF VAR BYTE [16]
     ;DEFINES FOR DISPLAY   use   font7x5_16.bas   or  font7x5_18.bas     for pic18
     #DEFINE PIC16 1            
     #define use_mssp 1
     lcdheight con 5      ;  6 PAGES   
     lcdwidth  con 83     ; 84 PIXELS WIDE
    ' LCD_CLK     var     LATB.4       ' SCK1     pin needs to be set as dig o/p
    ' LCD_DIN     var     LATB.2       ' SDO1     pin needs to be set as dig o/p
     LCD_RST     var     LATA.4 
     LCD_DC      var     LATA.3
     LCD_CE      var     LATA.6
     LCD_LIGHT   var     LATA.0
    nmea var byte[80]
    h var byte
    m var byte
    s var byte
    Include "nokia_ds.INC"  ' bring it in
    include "font7x5_16.bas"
    @ #DEFINE   TOKEN_DESTROY 1
    include "strtok.pbpmod"
    '==========================    MAIN  Routine    ==============================
        gosub lcd_init
        LCDCLR
        ARRAYWRITE BUFF,["READY",0]
        LCDSTR  5,0,BUFF 
        PAUSE 1000
        LCDCLR
      
    looper:
        'start=$ end=*
        arraywrite nmea,["GNRMC,090045.000,A,3823.6645,N,02353.3600,E,0.02,195.80,170518,,,A",0] 
        strtok nmea,0,","
        ARRAYREAD nmea, 5, GNGGA,[wait("GNRMC")]
        GOSUB SH_MSG
        GOSUB SH_TIME 
        strtok nmea ;fix
        GOSUB SH_LON
        GOSUB SH_LAT
        arraywrite buff,["speed",0]
        LCDSTR  0,3,BUFF
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 36,3,buff  
        strtok nmea
        arraywrite buff,["hdg",0]
        LCDSTR  0,4,BUFF
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 36,4,buff 
        strtok nmea
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),dec2 h,dec2 m,dec2 s]
        arraywrite buff,[dec2 h,"/",dec2 m,"/",dec2 s,0]
        LCDSTR  36,5,BUFF 
        PAUSE 1000
    GNGGA:
        arraywrite nmea,["GNGGA,140405.000,3823.6010,N,02353.3054,E,1,9,0.88,0.8,M,35.9,M,,",0] 
        strtok nmea,0,","
        ARRAYREAD nmea, 5, XXX,[wait("GNGGA")] 
        GOSUB SH_MSG
        GOSUB SH_TIME
        GOSUB SH_LON
        GOSUB SH_LAT
        strtok nmea
        strtok nmea
        strtok nmea
        strtok nmea
        strtok nmea
        arraywrite buff,["M",0]
        LCDSTR  28,5,BUFF
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 0,5,buff
        PAUSE 1000 
    GOTO LOOPER
      
    XXX:    
        LCDCLR
        arraywrite buff,["Oops",0]
        LCDSTR  0,1,BUFF   
    end
    
    SH_MSG:
        LCDSTR  0,0,nmea    ;sentence type 
        strtok nmea
    RETURN
    SH_TIME:
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),dec2 h,dec2 m,dec2 s]
        arraywrite buff,[dec2 h,":",dec2 m,":",dec2 s,0]
        LCDSTR  36,0,BUFF
        strtok nmea
    RETURN
    SH_LON:
        arraywrite buff,["lon",0]
        LCDSTR  0,1,BUFF 
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 20,1,buff 
        strtok nmea
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 77,1,buff 
        strtok nmea
    RETURN
     
    SH_LAT:
        arraywrite buff,["lt",0]
        LCDSTR  0,2,BUFF 
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 13,2,buff 
        strtok nmea
        ARRAYREAD  nmea ,[SKIP (STRTOK_INX-STRTOK_LEN),str buff\16] 
        LCDSTR 77,2,buff 
        strtok nmea
    RETURN
    Warning I'm not a teacher

  2. #2
    Join Date
    Oct 2010
    Posts
    413

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    Hi richard,

    really appreciate your help. I will print out your post and code, because i need to understand it first.

    Im a person that i understand something when i make notes and then i test my notes to see if i got it. Maybe this seems a bit stupid to others, but for me at the end works.

    Thanks a lot once again.

    Yesterday night i figured out that i need to correct TIME 24 hour, as im located on South of Europe --> Greece and we are +3 from UTC. So if it is 22:00 at UTC the time on display is +3....and shows 25.

    Then i need to say also that as we are +3 from UTC, when the time at UTC is 21:00 here will be 00:00, so the code must also change the date. (at them moment DATE follows the UTC time)

    Up to now i know what i have done with the code, even if it is wrong and even if there are lots of bugs. I'm happy at least i understand what i have done.

    Hopefully the following days i will have good news.
    Last edited by astanapane; - 22nd May 2018 at 14:06.

  3. #3
    Join Date
    Oct 2010
    Posts
    413

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    this is what i get up to now on the display. But is not stable.

    Name:  20180522_200216.jpg
Views: 10328
Size:  463.6 KB

    Date is loosing data sometimes and presents zeros.

    My code refresh the display in order to get newer update on time, Sats, coordinates. Because i havent found the way to have always on the data and just refresh the digits need, for example the seconds.

    i keep working on it.

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

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    this is what i get up to now on the display. But is not stable.
    i'm not surprised , given that :-
    not all nmea fields are filled in for every message
    not all nmea fields are fixed length

    I can't think of a more difficult way to approach this task than what you are trying to do.
    I can't think of a more difficult to debug approach for this task than what you are trying to do

    here is a snap of mine hooked to actual data, it has no trouble keeping up with the 4 or 5 messages
    per second that the gps spits out


    managed to snap the pic as the message type was updated so it a bit vague as to what its type is/was
    and the lat/lon are bogus who would trust the internet these days
    Attached Images Attached Images  
    Attached Files Attached Files
    Last edited by richard; - 23rd May 2018 at 08:38. Reason: ps the solder on pin8 looks a bit dodgy
    Warning I'm not a teacher

  5. #5
    Join Date
    Oct 2010
    Posts
    413

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    Im from mobile so i will Post a line of the code for the following question when i will be on computer.

    I read the Data from the GPS, especially for the time and date.....
    Serin2.....

    Then i display the needed info......

    Serout2......

    What is the command to use inside the Serout2 in order to jump to a LABEL and Correct the UTC?

    It will be useful if i understand the command inside the Serout2 that give me the access to jump to a LABEL.

    One more question. I see most of You are using the HSERIN2, HSEROUT2,

    And You Richard on your code are using the arrayread arraywrite.

    I need to check the manual and see what is the difference between those.

  6. #6
    Join Date
    Oct 2010
    Posts
    413

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    ok i'm stack.

    i place my code up to now. I dont want anyone to write a code for me, i just want from you to give me direction to solve my following problem.

    I know i have many mistakes and maybe i aproach the code in a wrong way, in a difficult direction.

    So one of my problems i would like to solve, is to give the right time, in 24H.

    I have in mind that i need to use interrupts.

    Is there any solution at the moment to use the SEROUT2 command

    Code:
    serout2  lcd,32,[$73,$00,$04,$00,$FF,$E0,"  TIME: ",dec2 hh+3," :",dec2 mm," :",dec2 ss,$00]
    pause 100
    and jump at a label ???

    Code:
    Plusthree:
      hh = hh + 3
      IF hh = 25 THEN hh = 0  
    RETURN
    I would like first to solve time issue, even if i have to refresh/clear the display.....then my next problem to solve is to keep the data on the screen and replace only the numbers or characters needed to be change.

    Following is the code up to now.

    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
    Last edited by astanapane; - 25th May 2018 at 20:56.

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

    Default Re: How do I discern Maidenhead Locator from GPS lat long info.

    I have found that inline math for lcdout cmd on a pic16 turns to crap, serout2 may have the same issues

    you probably need to do the math first then print result

    i would do it this way

    hh=hh+3 ;utc+3
    hh=hh//24 ;REALLY SHOULD ADD A DAY TO DATE TOO IF day changes
    serout2 lcd,32,[$73,$00,$04,$00,$FF,$E0," TIME: ",dec2 hh," :",dec2 mm," :",dec2 ss,$00]
    pause 100
    Warning I'm not a teacher

Similar Threads

  1. LAT replaces PORT command?
    By markscotford in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 3rd December 2011, 16:37
  2. Need Info for PBP?
    By azmax100 in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 30th January 2009, 07:44
  3. Replies: 1
    Last Post: - 27th July 2008, 06:14
  4. dmx info.
    By oscar in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 8th May 2005, 11:54

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts