Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC 18 e GPS!

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[11] Re: PIC 18 e GPS!

Messaggioda Foto UtenteAjKDAP » 22 mag 2012, 21:44

Okey, quindi buffer è un array da 200bytes, io per sicurezza metterei un'IF per evitare di scrivere in locazioni di memoria fuori del buffer... tipo:

Codice: Seleziona tutto
if (PIR1bits.RC1IF == 1 && i<200) {
   LED_GIALLO = LED_GIALLO^1;
   buffer[i] = Read1USART();
   i++;
   }



cosi nel programma principale puoi fare cosi:

Codice: Seleziona tutto
unsigned char coordinata1[10];
unsigned char coordinata2[10];

i=0; //resetti l'indice
while(i<200); //aspetti mentre ricevi 200bytes
decodeNMEA(buffer,coordinata1,coordinata2);


ed ora ti puoi concentrare sulla funzione "decodeNMEA" per estrapolare le due coordinate che verranno salvate nei due array di char da 10bytes ciascuno:

Codice: Seleziona tutto
void decodeNMEA(unsigned char* buff, unsigned char* c1, unsigned char * c2){

const unsigned char stringaGPS[5]="GPRMC";
const unsigned char dimensioneBufferGPS=200;
const unsigned char dimensioneStringa=5;

unsigned char indice=0;
unsigned char trovato=0;
unsigned char i,j=0;

for(i=0; i<(dimensioneBufferGPS-dimensioneStringa) && !trovato; i++)
{
   if(bufferGPS[i]==stringaGPS[j])
   {
      j++;
      if(j==dimensioneStringa)
      {
         trovato=1;
         indice=i;
      }
   }else{
      if(j>0)
      {
         i=i-j;
         j=0;
      }     
   }
   
}

if(trovato){  //se abbiamo trovato la sequenza GPRMC ora dobbiamo contare tre virgole "," prima di leggere la prima coordinata


}

}


te come faresti?
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
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

0
voti

[12] Re: PIC 18 e GPS!

Messaggioda Foto Utentericello9 » 22 mag 2012, 22:17

A parole farei così:
Con un ciclo for scorro l'array buffergps ma partendo non da zero ma dal valore dell'indice memorizzato, all'interno del ciclo for
verifico con una if se il contenuto della buffergps è uguale al caratte ",", in caso positivo incremento un contatore che mi conteggia fino a 3.
A quel punto copio in una varibile il valore di i che corrisponde alla posizione della mia latitudine e longitudine.
Con un altro ciclo for copio i primi 10 byte nell'array coordinata1 e gli altri 10 byte nella coordinata2.
Cosa ne dici?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

1
voti

[13] Re: PIC 18 e GPS!

Messaggioda Foto UtenteAjKDAP » 22 mag 2012, 22:21

L'idea sembra ok, prova a buttare giù qualche riga di codice ora :D
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
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

0
voti

[14] Re: PIC 18 e GPS!

Messaggioda Foto Utentericello9 » 22 mag 2012, 22:36

Adesso devo scappare perché ho la donna che mi pressa.
Domani mattina provo a scrivere il codice.
Grazie per l'aiuto.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[15] Re: PIC 18 e GPS!

Messaggioda Foto Utentericello9 » 23 mag 2012, 9:49

Codice: Seleziona tutto
unsigned char c=0;   
unsigned char cont_virgola =0;
trovato=0;   //azzero il flag almeno lo posso riutilizzare

for(c=0;c<40 && !trovato;c++)
   {
   i++;
   if(bufferGPS[i] == ',' )
     {
     cont_virgola++;
     if(cont_virgola==3)
       {
       index=i;
       trovato=1;         
       cont_virgola=0;    //azzero il contatore delle virgole
       }
     }
   }
if(trovato)
{
  for(c=0; c<10; c++)
    {
     bufferGPS[i+c]=coordinata[i+c];
     bufferGPS[i+c+10]=coordinata[i+c+10];
     }
   trovato=0;
}

Cosa ne dici?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

1
voti

[16] Re: PIC 18 e GPS!

Messaggioda Foto UtenteAjKDAP » 23 mag 2012, 10:17

Ci siamo quasi,
alcune considerazioni:

il primo ciclo esce se trova 3 virgole, oppure se c raggiunge il valore 40. Sarebbe da inserire un ulteriore condizione d'uscita in caso di i>=200, in quanto se i è uguale a 180 per esempio potresti leggere locazioni di memoria esterne a bufferGPS[0..199].

comunque, una volta terminato il conteggio delle 3 virgole, l'indice attuale è proprio la posizione dell'ultima virgola trovata, quindi puoi vedere il tuo buffer in questo stato:

Codice: Seleziona tutto
,6548.4901,N,00335.8774,E


Quindi per estrapolare la coordinata devi:
-avanzare l'indice di una posizione,
-copiare le 11cifre/caratteri della prima coordinata (6548.4901,N)
-avanzare l'indice per saltare la virgola
-copiare le 12 cifre/caratteri della seconda coordinata (00335.8774,E)

anche qui devi includere un controllo per evitare di uscire oltre il limite dei 200bytes di bufferGPS.

In un secondo momento potresti migliorare il tutto partendo a leggere dalla seriale direttamente la stringa che inizia con "$GPRMC" cosi eviteresti di trovarti un bufferGPS che termina cosi ad esempio:
Codice: Seleziona tutto
...102 $GPRMC,201023.000,A

In questo caso la ricerca della stringa GPRMC avverrà con successo, ma poi le coordinate non saranno disponibili! :D
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
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

0
voti

[17] Re: PIC 18 e GPS!

Messaggioda Foto Utentericello9 » 23 mag 2012, 12:59

Provo ad inserire le modifiche che mi hai suggeirto:
Codice: Seleziona tutto
    unsigned char c=0;   
    unsigned char cont_virgola =0;
    trovato=0;   //azzero il flag almeno lo posso riutilizzare

    for(c=0;c<40 && i>=200 && !trovato;c++)
       {
       i++;
       if(bufferGPS[i] == ',' )
         {
         cont_virgola++;
         if(cont_virgola==3)
           {
           index=i;
           trovato=1;         
           cont_virgola=0;    //azzero il contatore delle virgole
           }
         }
       }
    if(trovato && index<174)
    {
      for(c=1; c<=11; c++)
           bufferGPS[i+c]=coordinata[i+c];
       for(c=13; c<=25; c++)
         bufferGPS[i+c]=coordinata[i+c];
       trovato=0;
    }
   else
    {
     trovato=0;
     i=0;
     }


Ma a questo punto una volta richiamata la funzione
Codice: Seleziona tutto
decodeNMEA(buffer,coordinata1,coordinata2);

cosa dovrei inserire come buffer,coordinata1,coordinata2 visto che così strutturata non accetta nessun dato di ritorno ma solo 3 parametri in ingresso.
MI sfugge qualcosa?
Grazie
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

1
voti

[18] Re: PIC 18 e GPS!

Messaggioda Foto UtenteAjKDAP » 23 mag 2012, 13:05

ricello9 ha scritto:MI sfugge qualcosa?


si, i parametri passati alla funzione non sono l'intero array, ma solamente il puntatore al primo elemento di ogni array.

Quindi se nella funzioni modifichi l'array c1 e c2, stai modificando proprio l'array coordinata1 e coordinata2 del main! :-)

Dovresti studiarti un po gli array, funzioni ed il passaggio di array alle funzioni per capire un po' meglio come funziona :)

ciao

PS.: nel for devi mettere la condizione di uscita i<200, che quindi esce quando i>=200 :ok:
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
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

0
voti

[19] Re: PIC 18 e GPS!

Messaggioda Foto Utentericello9 » 23 mag 2012, 14:49

Quindi se nella funzioni modifichi l'array c1 e c2, stai modificando proprio l'array coordinata1 e coordinata2 del main!


Adesso forse sto capendo; quando nel main andrò a richiamare la funzione decodeNMEA(); gli passero i paramteri buffer che sarebbe il mio array dove salvo la ricezione del gps,
con il puntatore c1 otterrò il il primo carattero dell'array coordinata1 e con il secondo puntatore c2 otterrò il primo carattere dell'array coordinata2.
Non riusivo a capire come mettevi in relazione il puntatore c1 con la coordinata1, ma mi sono accorto che lo si fa quando si richiama la funzione stessa decodeNMEA(buffer,coordinata1,coordinata2);
Se ad esempio al posto di coordinata1 creavo una array di nome posizione1[10]; la funzione decodeNMEA(buffer,posizione1,coordinata2);associerebbe il puntatore c1 all'array posizione1.
Giusto?

Di seguito posto l'intero codice:
Codice: Seleziona tutto
   
     if (PIR1bits.RC1IF == 1 && i<200) {
       LED_GIALLO = LED_GIALLO^1;
       buffer[i] = Read1USART();
       i++;
       }

    unsigned char coordinata1[10];
    unsigned char coordinata2[10];

    i=0; //resetti l'indice
    while(i<200); //aspetti mentre ricevi 200bytes
    decodeNMEA(buffer,coordinata1,coordinata2);

   void decodeNMEA(unsigned char* buff, unsigned char* c1, unsigned char * c2){

    const unsigned char stringaGPS[5]="GPRMC";
    const unsigned char dimensioneBufferGPS=200;
    const unsigned char dimensioneStringa=5;

    unsigned char indice=0;
    unsigned char trovato=0;
    unsigned char i,j=0;

    for(i=0; i<(dimensioneBufferGPS-dimensioneStringa) && !trovato; i++)
    {
       if(bufferGPS[i]==stringaGPS[j])
         {
          j++;
          if(j==dimensioneStringa)
          {
             trovato=1;
             indice=i;
          }
         }
      else
         {
         if(j>0)
          {
           i=i-j;
           j=0;
           }     
           }
    }//fine ciclo for

    if(trovato)  //se abbiamo trovato la sequenza GPRMC ora dobbiamo contare tre virgole "," prima di leggere la prima coordinata
     { 
     unsigned char c=0;   
      unsigned char cont_virgola =0;
      trovato=0;   //azzero il flag almeno lo posso riutilizzare

      for(c=0;c<40 && i<200 && !trovato;c++)
        {
        i++;
        if(bufferGPS[i] == ',' )
          {
          cont_virgola++;
          if(cont_virgola==3)
            {
            index=i;
            trovato=1;         
            cont_virgola=0;    //azzero il contatore delle virgole
            }
          }
        }//fine cilco for

      if(trovato && index<174)
        {
        for(c=1; c<=11; c++)
          bufferGPS[i+c]=coordinata[i+c];
        for(c=13; c<=25; c++)
          bufferGPS[i+c]=coordinata[i+c];
          trovato=0;
        }
       else
        {
         trovato=0;
         i=0;
         }
   }
} //fine funzione


Adesso provo a migliorare la ricezione della seriale memorizzando nel buffer solo la stringa $GPRMC.
Grzie per l'aiuto.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

1
voti

[20] Re: PIC 18 e GPS!

Messaggioda Foto UtenteAjKDAP » 23 mag 2012, 15:18

ricello9 ha scritto:Giusto?


Esatto :ok:

ricello9 ha scritto:Adesso provo a migliorare la ricezione della seriale memorizzando nel buffer solo la stringa $GPRMC.


ok, ma hai testato e verificato che questo spezzone di codice funziona? Fa quello che ti aspetti?

ciao
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
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

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti