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
voidUSART_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"
<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
voiduart_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_tuart_getc(void)
3
{
4
5
while(!(UCSRA&(1<<RXC)))// warten bis Zeichen verfuegbar
6
;
7
returnUDR;// Zeichen aus UDR an Aufrufer zurueckgeben
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
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:
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
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
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
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?!
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.
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
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.