Forum: Mikrocontroller und Digitale Elektronik Hilfe bei GPS auslesen mittels Atmega 16


von Fried (Gast)


Lesenswert?

Guten tag und Hallo,

ich bräuchte mal einen kleinen Tip zum Thema GPS Empfänger und 
Mikrocontroller.

Ich möchte die daten (z.B. UTC Zeit) auslesen und an ein Display 
schicken.

hardware:
ATMEGA 16
EM 406A GPS EMpfänger
4*20 Display

Display gibt Zeichen aus, Init, etc ist also richtig.

Ziel ist es, die nötigen Daten über UART (USART) zu ermitteln.
bisher schicke ich die Anfrage an den GPS Empfänger und erwarte ja nun 
die Zeit als Antwort:

Den UART habe ich wie folgt initialisiet:
1
void USART_Init( void )
2
{ 
3
  
4
   /* 
5
    UART-Init: 
6
    
7
   */ 
8
   #ifndef F_CPU
9
       #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
10
       #define F_CPU 1000000UL  // Systemtakt in Hz
11
     #endif
12
 
13
  #define BAUD 4800UL      // Baudrate = 4800
14
 
15
  // Berechnungen
16
  #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
17
  #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
18
  #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
19
    // Berechnung Ende
20
21
  #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
22
       #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
23
  #endif 
24
25
  UBRRH = UBRR_VAL >> 8;
26
  UBRRL = UBRR_VAL & 0xFF;
27
28
  UCSRB = (1<<RXEN)|(1<<TXEN);         //RxD  und TxD aktivieren
29
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);   // Asynchron 8N1 
30
 
31
   
32
}


Laut dem EM406A Datenblatt 
(http://www.sparkfun.com/datasheets/GPS/EM-406A_User_Manual.PDF) muss 
ich zunächst mein GPS Empfänger initialisieren:
Ich sende also über USART einen String:
1
  #define CR "\r\n"
2
3
  //NMEA Initialisierung
4
  uart_puts ("$PSRF100,1,4800,8,1,0*18" CR);
5
  _delay_ms( 250 );
6
  /*
7
  Format:
8
  $PSRF100,<protocol>,<baud>,<DataBits>,<StopBits>,<Parity>*CKSUM
9
  <CR><LF>
10
  <protocol>        0=SiRF Binary, 1=NMEA, 4=USER1
11
  <baud>        1200, 2400, 4800, 9600, 19200, 38400
12
  <DataBits>           8,7. Note that SiRF protocol is only valid f8 
13
  Data bits
14
  <StopBits>         0,1
15
  <Parity>         0=None, 1=Odd, 2=Even
16
  */

1
/*String senden*/
2
void uart_puts (char *s)
3
{
4
    
5
    
6
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
7
     
8
        uart_putc(*s);
9
        lcd_string(s);
10
        _delay_ms( 500 );
11
        s++;
12
    
13
    }
14
}

Die Routinen sind aus dem AVR GCC Tutorial. Wenn ich jetzt z.B. mit der 
Funktion uart_getc() Daten lese zeigt er mir immer die 36(ohne UART 
Initialisierung: 0) an. Eine Verbindung vom UART findet also irgendwie 
statt... Ich weiß aber jetzt nicht so recht, wie ich dem GPS Empfänger 
z.B. die Uhrzeit entlocken kann...habt ihr da eine Idee/Erfahrung?
1
/* Zeichen empfangen */
2
uint8_t uart_getc(void)
3
{
4
    
5
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
6
        ;
7
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
8
}

von Michael (Gast)


Lesenswert?

Fried schrieb:
> /*String senden*/
> void uart_puts (char *s)
> {
>
>
>     {   /* so lange *s != '\0' also ungleich dem 
"String-Endezeichen(Terminator)" */
>
>         uart_putc(*s);
>         lcd_string(s);
>         _delay_ms( 500 );
>         s++;
>
>     }
> }

Da fehlt die Schleife, somit wird wohl auch nicht viel ausser einem 
Zeichen gesendet

von Fried (Gast)


Lesenswert?

entschuldige Bitte, das war eine "spiel Version" von mir:
[c]
/*String senden*/
void uart_puts (char *s)
{

    while (*s)
    {   /* so lange *s != '\0' also ungleich dem 
"String-Endezeichen(Terminator)" */

        uart_putc(*s);
        s++;

    }
}[\c]

So ist es richtig. So ist es ja auch in der Wiki:

von spess53 (Gast)


Lesenswert?

Hi

>Laut dem EM406A Datenblatt
>(http://www.sparkfun.com/datasheets/GPS/EM-406A_Use...) muss
>ich zunächst mein GPS Empfänger initialisieren:

Wo steht, das du das musst? Im allg. fangen die Module von allein an 
Daten
zu senden.

MfG Spess

von Fried (Gast)


Lesenswert?

Okay, also aktiv scheint er ja zu sein (LED am GPS Empfänger blinkt) wie 
kann ich den jetzt die Daten aus dem gerät bekommen?
Eigtnlich doch, in dem ich einen String schicke, der sagt, welches Daten 
ich haben möchte.

z.B.: UTC Time
1
uart_puts ("$GPGGA,161229.487*18" CR );

von spess53 (Gast)


Lesenswert?

Hi

>Eigtnlich doch, in dem ich einen String schicke, der sagt, welches Daten
>ich haben möchte.

Nein. Das Modul sendet verschiedene MNEA-Strings. Aus denen musst du die 
Uhrzeit extrahieren.

MfG Spess

von Fried (Gast)


Lesenswert?

Ich könnte also mir ein Array anlegen, in dem z.B. 50 Integer reinlade.

Jetzt lese ich so lange über den UART die Daten aus, bis der Wert "36" 
kommt (die Message ID beginnt ja mi $G... $ --> 36 dez.)

Sobald der Wert kommt, schreibe ich mein Array voll und sollte mir 
anhand des Inhaltes die Daten wie in diesem String:

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,,,,0000*18

zusammen suchen?!

von .............. (Gast)


Lesenswert?

Fried schrieb:
> Ich könnte also mir ein Array anlegen, in dem z.B. 50 Integer reinlade.
Passt soweit, allerdings solltest du für Text/Buchstaben char (ohne 
signed/unsigned, einfach nur char) verwenden.

von spess53 (Gast)


Lesenswert?

Hi

>Ich könnte also mir ein Array anlegen, in dem z.B. 50 Integer reinlade.

Du hast aber keine Integer, sondern Char. Und 50 ist etwas knapp.

>Sobald der Wert kommt, schreibe ich mein Array voll und sollte mir
>anhand des Inhaltes die Daten wie in diesem String...

Nicht das Array voll schreiben. Das Ende eines Strings ist mit CR/LF 
gekennzeichnet. Wenn du das empfangen hast kannst du anfangen mit 
dekodieren.

Noch etwas: Das Modul gibt dir die Datensätze GGA, GSA, GSV, RMC, VTG 
und GLL aus, wobei VTG und GLL deaktiviert sind. Sieh dir an, welche 
Datensätze du wirklich brauchst und dektiviere den Rest. Wenn du das 
Modul direkt mit deinem PC verbinden kannst (Pegelwandler), lässt sich 
das Modul auch mit dem Programm 'Sirfdemo' konfigurieren.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Fried schrieb:
> Ich könnte also mir ein Array anlegen, in dem z.B. 50 Integer reinlade.
>
> Jetzt lese ich so lange über den UART die Daten aus, bis der Wert "36"
> kommt (die Message ID beginnt ja mi $G... $ --> 36 dez.)
>
> Sobald der Wert kommt, schreibe ich mein Array voll und sollte mir
> anhand des Inhaltes die Daten wie in diesem String:
>
> $GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,,,,0000*18
>
> zusammen suchen?!

Fang damit an, dass du den Datenstrom vom GPS Modul als Text (als 
String) ansiehst. Freundlicherweise teilt dir das Modul mit einem CR/LF 
mit, wann eine Zeile (= 1 Datensatz) fertig ist.

d.h. dein erstes Ziel ist es, den ununterbrochenen Strom von Text in 
Zeilen organsiert zu empfangen. Und wenn du eine Zeile vollständig hast, 
dann siehst du einfach am Anfang der Zeile nach, welche Kennung da 
drinnen steht. Und wenn das dann die richtige Kennung ist, dann holst du 
dir aus dieser einen Text-Zeile die Daten raus, die du brauchst.

Am Anfang empfehle ich dir, das ganze nicht mit dem GPS Modul zu 
entwickeln, sondern dadurch, dass du selber von einem Terminal ausgehend 
Zeichen um Zeichen über die UART an deinen µC schickst. Und wenn du dann 
"Return" drückst, dann soll der µC etwas mit der empfangenen Textzeile 
machen. Zum Beispiel unverändert zu dir ans Terminal zurücksenden. So 
kannst du dann kontrollieren, ob du in der Empfangsroutine einen Fehler 
hast oder nicht. Denn das ist dein Hauptproblem: Wenn dir das GPS den 
Empfangsbuffer vollballert und du nichts weiter siehst, weißt du nicht, 
ob du Fehler im Code hast oder nicht. Du musst die Aufgabenstellung so 
abändern, dass
* du das angestrebte Teilziel erreichen kannst
* du aber auch kontrollieren kannst, ob das was du geschrieben hast
  Unsinn ist oder nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.