Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC e GPS

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC e GPS

Messaggioda Foto UtenteMarcoNa » 20 giu 2011, 0:32

Buona sera a tutti...
sto interfacciando un modulo gps (MN5010HS) al PIC (16F877A)
il collegamento funziona perfettamente e leggo le stringhe NMEA che invia il gps tutto tramite seriale (TTL)
Linguaggio C ambiente MPLAB con compilatore HI-TECH C

Esempio di stringa NMEA

Codice: Seleziona tutto
$GPGGA,221036.000,1353.9281,N,05311.0324,E,1,05,3.3,181.5,M,43.1,M,,0000*56
$GPGSA,A,3,18,06,15,21,22,,,,,,,,4.6,3.3,3.2*39
$GPRMC,221036.000,A,1353.9281,N,05311.0324,E,0.31,37.39,190611,,,A*58
$GPVTG,37.39,T,,M,0.31,N,0.6,K,A*37


questo è uno spezzone di codice

Codice: Seleziona tutto
char NMEA[82]="";    //singola stringa nmea
bit startNmea=0;     //se viene rilevato $
unsigned int idx=0;  //indice

void interrupt isr(void)
{
   if(RCIF)
   {
   switch (RCREG)
     {
      case '$':
         {
         startNmea=1;
         idx=0;
         break;
         }
      case '*':
         {
         startNmea=0;
         break;
         }
      default:
         NMEA[idx]=RCREG;
         idx++;
         break;
     }
   }
}


Per chi non lo sapesse:
RCIF è un flag è viene abilitato quando si riceve un byte sulla seriale del PIC
RCREG è un registro che contiene 1 byte quindi un singolo carattere delle stringhe NMEA

Lo spezzone di codice precedente ha il compito di:
1) leggere i dati dalla seriale
2) se il carattere letto è $ (dollaro) significa inizio stringa nmea
3) tutti i caratteri successivi al dollaro verranno scritti in NMEA[idx]
4) se il carattere è * (asterisco) verrà interrotto l'acquisizione dati

quindi adesso ho un array contenente:

GPGGA,221036.000,1353.9281,N,05311.0324,E,1,05,3.3,181.5,M,43.1,M,,0000

adesso il mio problema è suddividere tale stringa in sottostringhe (purtroppo la stringa ha lunghezza variabile) però ogni campo è suddiviso dalla virgola. Io ho provato ad utilizzare strtok la suddivisione avviene però non mi piace tanto. Io vorrei che facesse una cosa del genere
1) suddividere la stringa in sottostringhe
2) ogni sottostringa in una propria variabile o array tipo:
char intestazione[]="GPGGA";
char time[]="221036";
char latitudine[]="1353.9281";
e cosi via
cioè ogni singolo dato presente nella stringa nmea per conto suo in modo che posso gestirmi io la stampa su lcd o la modifica dei dati.
sperio di essermi spiegato correttamente.
grazie per l'aiuto
ps: chiunque abbia un idea è ben accetta....

grazie ancora O_/
Avatar utente
Foto UtenteMarcoNa
0 2
 
Messaggi: 4
Iscritto il: 6 nov 2010, 14:21

0
voti

[2] Re: PIC e GPS

Messaggioda Foto UtentePaolino » 20 giu 2011, 6:17

La butto lì, così su due piedi.

Potresti provare a scrivere tu la routine di analisi della stringa NMEA. Leggi il singolo carattere e lo metti nella stringa-destinazione che ti interessa. Quando trovi la virgola oppure il NULL ('\0') scarti il simbolo acquisito (virgola o NULL, appunto); passi alla stringa-destinazione successiva solo se l'ultimo carattere acquisito è "virgola". Se fosse stato NULL, chiudi il ciclo di scansione.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[3] Re: PIC e GPS

Messaggioda Foto UtenteAjKDAP » 20 giu 2011, 12:43

Quoto paolino,

ed inoltre all'inizio di questa routine potresti/dovresti controllare i caratteri dell'intestazione per capire se stai leggendo la stringa che effettivamente contiene i dati che ti interessano, no? :-)
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

1
voti

[4] Re: PIC e GPS

Messaggioda Foto Utentecarloc » 20 giu 2011, 18:14

Comunque 13°53'N 53°11'E.... Occhio ai pirati :D :D
posi.PNG
posi.PNG (17.28 KiB) Osservato 2657 volte
Se ti serve il valore di beta: hai sbagliato il progetto!
Avatar utente
Foto Utentecarloc
33,8k 6 11 13
G.Master EY
G.Master EY
 
Messaggi: 2153
Iscritto il: 7 set 2010, 19:23

0
voti

[5] Re: PIC e GPS

Messaggioda Foto Utenteaduri » 1 lug 2011, 14:29

Questo è un esempio di come avevo implementato il filtro per le frasi NMEA in Mikrobasic:

Codice: Seleziona tutto
if USART_Data_Ready=1 then
rxDataGarbage = USART_Read
end if

'filtro frase "$GPGGA,"

rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
     rxGPSData = USART_Read
       if (rxGPSData="$") then
             rxDone = 1
        else goto inizio
       end if
end if
wend

rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
      rxGPSData = USART_Read
       if (rxGPSData="G") then
           rxDone = 1
       else goto inizio
       end if
end if
wend

rxDone = 0
rxIndex = 0
while rxDone=0
    if USART_Data_Ready=1 then
         rxGPSData = USART_Read
         if (rxGPSData="P") then
            rxDone = 1
          else goto inizio
          end if
    end if
wend

rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
     rxGPSData = USART_Read
       if (rxGPSData="G") then
             rxDone = 1
        else goto inizio
       end if
end if
wend

rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
      rxGPSData = USART_Read
       if (rxGPSData="G") then
           rxDone = 1
       else goto inizio
       end if
end if
wend

rxDone = 0
rxIndex = 0
while rxDone=0
    if USART_Data_Ready=1 then
         rxGPSData = USART_Read
         if (rxGPSData="A") then
            rxDone = 1
          else goto inizio
          end if
    end if
wend

rxDone = 0
rxIndex = 0
while rxDone=0
    if USART_Data_Ready=1 then
         rxGPSData = USART_Read
        if (rxGPSData=",") then
            rxDone = 1
          else goto inizio
          end if
    end if
wend

rxIndex = 0
rxdone = 0
while rxDone=0
if USART_Data_Ready=1 then
   rxGPSData = USART_Read
   UTC[rxIndex] = rxGPSData ' UTC (ora)
                if (rxGPSData=44) then
                   rxdone=1
                end if
inc(rxIndex)
end if
wend


ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti