Forum: Mikrocontroller und Digitale Elektronik Atmega644P + GPS über UART + UART Ausgabe+ LCD


von Frank S. (blaueslicht)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
versuche gerade verzweifelt GPS Daten gescheit zu parsen mit einem 
ATmega644P in C. Über Uart0 kommen die NMEA Daten mit 4800 BAUD rein. 
Über UART1 sollen erst einmal nur Debugmeldungen ausgegeben werden, 
später auch aufbereitete Daten. Sobald die Daten aufbereitet sind, soll 
auch eine LCD Ausgabe erfolgen. Im ersten Schritt versuche ich "nur" zu 
erkennen, welcher Datensatz gerade vom GPS Empfänger kommt. Sobald 
dieser erkannt wurde, soll es eine Ausgabe über UART1 geben. Doch diese 
Ausgabe funktioniert nicht :( Vielleicht kann sich jemand mal den 
angehängten Code anschauen und mir sagen, was ich falsch mache.
Ich habe testweise folgendes bei Zeile 187 eingebaut, um zu prüfen ob 
der Stream prinzipiell 1:1 über UART1 ausgegeben werden kann:

uart1_putc( (unsigned char)gpsstring[i] );

Das funktioniert auch. Also Hardwaretechnisch müsste also alles in 
Ordnung sein.

Hier ein paar Demo Daten:

$GPRMC,234743.000,A,6666.6666,N,7777.7777,E,0.00,125.11,030614,,,A*66
$GPGGA,234744.000,6666.6666,N,7777.7777,E,1,09,1.0,103.1,M,47.9,M,,0000* 
54

Der Empfänger spuckt auch noch weitere Daten aus, welche mich aber im 
Moment nicht interessieren.

Danke schon mal vorab.

: Bearbeitet durch User
von Frank S. (blaueslicht)


Lesenswert?

Achja, habe vergessen zu erwähnen, dass Ich ein Quarz mit 18,432MHZ 
einsetze. Habe dies auch mit dem Oszi überprüft. (GND -> XTAL1).

von Mike J. (linuxmint_user)


Lesenswert?

Bau mal einen Timer rein der jede Sekunde einen I/O-Pin toggelt damit du 
siehst ob dein AVR noch läuft.

von Uwe B. (derexponent)


Lesenswert?

@Frank S,

ist zwar etwas komisch programmiert aber egal

du darfst deine Laufvariable [i] nicht in einer FOR hochzählen,
sondern nur, wenn ein gültiges zeichen empfangen wurde

die meiste zeit deiner Schleife wird er "UART_NO_DATA"
empfangen (weil die UART relativ zur CPU gesehen langsam ist)

also verlässt er die FOR Schleife noch bevor die ersten 6 Zeichen
empfangen wurden

ich würde das generell aber anders programmieren

1. eine Do While für den Empfang von einem kompletten String
(bis Stringendekennung, vermutlich : 0x0D, 0x0A)

2. den String auswerten per
1
if(strncmp(nmea_str,"$GPGGA",6)==0) {
2
3
}

Gruss Uwe

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Guggsu hier.
Musst nurnoch die uart_getc der Peter Fleury lib einbauen.
Und in der uart_align das auskommentierte einkommentieren.

von Flusch (Gast)


Lesenswert?

Ein Protokol arbeitet man mit einer Zustandsmaschine ab.

von Frank S. (blaueslicht)


Lesenswert?

Danke für die Antworten und ein besonderes Danke an Martin.
Ich habe nun Martins Code genutzt und angepasst. Funktioniert 
einwandfrei. Falls Bedarf besteht, kann ich den fertigen Code hier 
nochmal komplett anhängen.

Gruß Frank

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.