Forum: Mikrocontroller und Digitale Elektronik NMEA wird nicht richtig empfangen (SkyTraq 6 ST22, ATmega8L)


von Moritz P. (moritz_p)


Angehängte Dateien:

Lesenswert?

Hallo,

aus den vielen hier schon vorgestellten Projekten bzgl. Speicherung von
GPS-Daten auf einer SD-Karte, habe ich mir einen eigenen Code
zusammengebastelt, der wirklich nur das speichern soll, was das Modul
sendet, und nicht noch die Daten vorverarbeiten oder irgendwelche
anderen Servoausgänge etc. abfragen soll.

Das schreiben auf der SD-Karte an sich funktioniert auch und das Modul
sendet auch korrekte NMEA-Daten (mit Pegelwandler an RS323 überprüft),
doch wenn ich diese dann mit dem ATmega8L abfrage und auf die Karte
schreiben möchte, kommt nur Mist raus.
Ich bin nun mir meinem Latein am Ende, wo ich noch den Fehler suchen
könnte. In den vielen anderen Threads war schon die Rede von einer evtl.
falschen Baudrate, aber ich habe sie schon mehrmals überprüft. Das Modul
sendet mit 9600.

Kurz zur Beschaltung des ATmega:
PB0 -> LED
PD3 -> Taster
RX/TX -> jeweils das Gegenstück des GPS-Moduls
Und die SD-Karte eben als SPI. Wie gesagt, Schreiben an sich geht auch.

Warhscheinlich nur ein blöder Anfängerfehler. :/

von Purzel H. (hacky)


Lesenswert?

Da das GPS nur sendet, wird das TX des Uarts nicht verwendet und kann 
also zum debuggen verwendet werden. Haengs an den PC, und sende erst die 
empfangenen Strings, dann die verarbeiteten Strings

von Moritz P. (moritz_p)


Lesenswert?

Es soll nichts verarbeitet werden. Einfach nur das, was das Modul sendet 
auf die SD-Karte schreiben.

von Heinz (Gast)


Lesenswert?

Quarz am ATMega8L?

von holger (Gast)


Lesenswert?

>In den vielen anderen Threads war schon die Rede von einer evtl.
>falschen Baudrate, aber ich habe sie schon mehrmals überprüft. Das Modul
>sendet mit 9600.

Sicher tut es das. Aber empfängt dein AVR auch mit
der richtigen Baudrate? Sieht jedenfalls nicht so aus.

von Moritz P. (moritz_p)


Lesenswert?

Nein, ich möchte es eigentlich über den internen Oszillator regeln. Oder 
überfordere ich den Atmega8L damit komplett?

von Moritz P. (moritz_p)


Lesenswert?

holger schrieb:
> Sicher tut es das. Aber empfängt dein AVR auch mit
> der richtigen Baudrate? Sieht jedenfalls nicht so aus.

Da wäre dann meine Frage, was ich an der Berechnung falsch gemacht habe. 
;)

von Heinz (Gast)


Lesenswert?

Moritz P. schrieb:
> Nein, ich möchte es eigentlich über den internen Oszillator regeln. Oder
> überfordere ich den Atmega8L damit komplett?

Die Frage ist, ob der interne Oszillator auf eine Abweichung kleiner 2 
Prozent kalibriert werden kann.

von Purzel H. (hacky)


Lesenswert?

Der interne Oszillator kann gegen einen 32kHz Quarz laufen gelassen 
werden.

von spess53 (Gast)


Lesenswert?

Hi

>Der interne Oszillator kann gegen einen 32kHz Quarz laufen gelassen
>werden.

Dann kann man auch gleich einen richtigen nehmen. Ist wesentlich 
einfacher.

MfG spess

von Purzel H. (hacky)


Lesenswert?

Eir richtiger Quarz ist einfacher, benoetigt aber mehr Strom.

von Moritz P. (moritz_p)


Lesenswert?

Gehe ich richtig in der Annahme, dass der mit 8MHz läuft?
Laut Datenblatt ergibt sich dann für eine Baudrate von 9600 und 8MHz ein 
Fehler von 0,2% bei einem UBRR-Wert von 103 (asynchrone Kommunikation).

von spess53 (Gast)


Lesenswert?

HI

>....benoetigt aber mehr Strom.

Dürfte bei GPS-Empfänger und SD-Karte kaum bemerkbar sein.

MfG Spess

von Heinz (Gast)


Lesenswert?

Pico Oschi schrieb:
> Eir richtiger Quarz ist einfacher, benoetigt aber mehr Strom.

Verwirrt den armen Jungen nicht noch mehr. Ein normaler Quarz und 
fertig!

Prinzipiell ließe der ATMega8L sich kalibrieren, aber das ist ziemlich 
knapp, da die Temperatur z. B. nicht zu stark schwanken darf, die 
Spannung konstant gehalten werden muss und altern darf der Chip auch 
nicht zu schnell. Also Quarz.

von Heinz (Gast)


Lesenswert?

Moritz P. schrieb:
> Gehe ich richtig in der Annahme, dass der mit 8MHz läuft?
> Laut Datenblatt ergibt sich dann für eine Baudrate von 9600 und 8MHz ein
> Fehler von 0,2% bei einem UBRR-Wert von 103 (asynchrone Kommunikation).

Moritz, das Problem ist der 8 MHz RC-Oszillator. Der ist von Haus nicht 
genau genug. Der kommt mit 7,5 oder 8,5 MHz zu dir. Du kannst ihn zwar 
kalibrieren, aber ... (siehe oben).

von Moritz P. (moritz_p)


Lesenswert?

Mh, okay. Sind die internen Oszillatoren von den "größeren" ATmega's 
genauer?
Und dann vielleicht jetzt noch einen kleinen Tipp welche Frequenz ich 
nutzen sollte und wo ich mich schnell über die Programmierung mit einem 
externen Quarz informieren kann. ;)

von Purzel H. (hacky)


Lesenswert?

>>HI
>>....benoetigt aber mehr Strom.
>Dürfte bei GPS-Empfänger und SD-Karte kaum bemerkbar sein.
>
>MfG Spess

Doch. Denn eine stationaere Anwendung mit Netzteil ist das ja sicher 
nicht. Eine stationaere Loesung muss kein GPS laufen lassen. Also 
portabel, also ab Batterie. Nein ?

Das bedeutet mit Sleepstates arbeiten, auch beim GPS.

von holger (Gast)


Lesenswert?

>Gehe ich richtig in der Annahme, dass der mit 8MHz läuft?

Wenn der AVR neu ist und du die Fuses nicht auf 8MHz
gestellt hast, dann läuft der mit 1MHz. F_CPU im Code
einzugeben führt nicht automatisch dazu das die CPU
auch mit 8MHz läuft. Also schau mal nach mit welchem
Takt sie wirklich läuft. Lass mal ne LED blinken.

von spess53 (Gast)


Lesenswert?

Hi

>Mh, okay. Sind die internen Oszillatoren von den "größeren" ATmega's
>genauer?

Nein.

>Und dann vielleicht jetzt noch einen kleinen Tipp welche Frequenz ich
>nutzen sollte und wo ich mich schnell über die Programmierung mit einem
>externen Quarz informieren kann. ;)

Am besten einen Baudratenquarz. Anschluss nach Datenblatt und Fuses 
umstellen.

>>>HI
>>>....benoetigt aber mehr Strom.
>>Dürfte bei GPS-Empfänger und SD-Karte kaum bemerkbar sein.
>>
>>MfG Spess

>Doch. ...

Und wie viel macht es denn aus?

MfG Spess

von Purzel H. (hacky)


Lesenswert?

Also. Das Skytrack zieht minimal 25mA. Wenn Batterielaufzeit wichtig 
ist, sollte man das GPS schlafen legen, wenn man's nicht grad braucht. 
Allenfalls genuegt eine Messung pro minute.

Der Mega8L zieht
active @4MHz, 3V 5mA
active @8MHz, 5V 15mA
idle   @4MHz, 3V 2mA
idle   @8MHz, 5V 7mA

vielleicht sollte man einen speziellen Lowpower controller einsetzen. zB 
einen 164P

active @1MHz, 2V 0.4mA
active @4MHz, 3V 2.1mA
active @8MHz, 5V 7.4mA
idle   @1MHz, 2V 0.15mA
idle   @4MHz, 3V 0.7mA
idle   @8MHz, 5V 1.9mA
powersave mode
32kHz osc   1.8V  0.5uA
32kHz osc   3V    0.6uA
powerdown
mit WDT   3V  4.3uA
ohne WDT  3V  0.2uA

Gewisse powersave modes sind nur mit dem 32kHz quarz erreichbar. Die 
Frage ist dann einfach wie gross und schwer darf/muss die Batterie sein, 
welche Laufzeit ist gewuenscht.

von Moritz P. (moritz_p)


Lesenswert?

Das ganze soll in ein Modellflugzeug und da dann von dem internen 
Flugakku mitversorgt werden. So kritisch ist es da nicht mit der 
Stromaufnahme.

holger schrieb:
>>Gehe ich richtig in der Annahme, dass der mit 8MHz läuft?
>
> Wenn der AVR neu ist und du die Fuses nicht auf 8MHz
> gestellt hast, dann läuft der mit 1MHz. F_CPU im Code
> einzugeben führt nicht automatisch dazu das die CPU
> auch mit 8MHz läuft. Also schau mal nach mit welchem
> Takt sie wirklich läuft. Lass mal ne LED blinken.

Aha, da haben wir es schon. Ich sagte ja: Anfängerfehler. :D
Laut Fuse Bits ist noch 1MHz eingestellt und das könnte auch mit dem 
Blinken der LED hinkommen.
Jetzt habe ich mir nochmal das Datenblatt vorgenommen und da ist dann 
noch die Rede von OSCCAL. Kann ich die Frequenz entweder darüber oder 
über die Fuses setzen? Dann gebe ich dem internen noch eine zweite 
Chance, bevor ich einen externen nehme.

von spess53 (Gast)


Lesenswert?

Hi

Ich hatte nach dem Unterschied Interner Oszillator vs. Quarzoszillator 
im Stromverbrauch gefragt. Das der von der Frequenz und vom Mode abhängt 
ist hinglänglich bekannt.

MfG Spess

von holger (Gast)


Lesenswert?

>Kann ich die Frequenz entweder darüber oder
>über die Fuses setzen?

Über die Fuses. CKDIV8 muss deaktiviert werden.

von Purzel H. (hacky)


Lesenswert?

>Hi
>
>Ich hatte nach dem Unterschied Interner Oszillator vs. Quarzoszillator
>im Stromverbrauch gefragt. Das der von der Frequenz und vom Mode abhängt
>ist hinglänglich bekannt.
>
>MfG Spess


Der Unterschied liegt weniger im Verbrauch des Oszillators, wie in den 
moeglichen Sleep States.
Mit 32kHz Clock kann man in den power down gehen, und zeitig wieder 
aufwachen. Dann wird der interne RC wieder angeworfen, und gut ist.
Der RC ist viel schneller eingeschwungen wie ein normaler quarz.
Das Ganze scheint sich aber erledigt zu haben. Die Laufzeit ist begrenzt 
und Stromsparen weniger Prioritaer.

von Moritz P. (moritz_p)


Lesenswert?

Über die Fuses habe ich jetzt die 8MHz eingestellt, CKDIV8 gibt es nicht 
einzustellen.

Die Ausgabe ist aber immer noch murks.

Ich werde mich da wohl erst noch ein wenig einlesen müssen; ob man da 
noch mehr einstellen muss und wie es dann mit einem externen Quarz geht. 
Aber das muss bis morgen warten. Für heute habe ich schon genug 
Kopfschmerzen. ;)

von spess53 (Gast)


Lesenswert?

Hi

>Mit 32kHz Clock kann man in den power down gehen, und zeitig wieder
>aufwachen. Dann wird der interne RC wieder angeworfen, und gut ist.
>Der RC ist viel schneller eingeschwungen wie ein normaler quarz.
>Das Ganze scheint sich aber erledigt zu haben. Die Laufzeit ist begrenzt
>und Stromsparen weniger Prioritaer.

> Dann wird der interne RC wieder angeworfen,...

Habe ich jetzt irgendwie etwas verpasst? Den über die Fuses 
eingestellten Oszillator kann man per Software ab- , an- und umschalten?

MfG spess

von Purzel H. (hacky)


Lesenswert?

Schau mal einen lowpower Mega an. zB den Mega164P. Dort gibt es einen 
power save mode. Da laeuft der clock nicht mehr, nur noch ein 32kHz 
Quarz an an TOSC2.
Es gibt auch einen Power down mode, da laeuft nichts mehr.

Siehe Datenblatt Mega164P/324P/644P, seite 42

Wenn man dann einen Switcher, wie den TPS62202 fuer 1.8V, der hat einen 
eigenverbrauch von 12uA, hat, kommt man mit dem Systemverbrauch runter.

von holger (Gast)


Lesenswert?

>Schau mal einen lowpower Mega an. zB den Mega164P. Dort gibt es einen
>power save mode. Da laeuft der clock nicht mehr, nur noch ein 32kHz
>Quarz an an TOSC2.

Was hat das mit dem Problem einer falschen Baudrate zu tun?
Wenn du dich mit Spess unterhalten willst dann tauscht
E-Mail Adressen aus. Und hör auf hier das eigentliche Problem
zu vernebeln.

von spess53 (Gast)


Lesenswert?

Hi

>Schau mal einen lowpower Mega an. zB den Mega164P. ...

Stimmt. Habe mich bisher nicht sehr um Stromsparmodi gekümmert. Macht 
auch keinen Sinn, wenn der Rest der Anlage im mehrstelligen kW-Bereich 
liegt.

>Was hat das mit dem Problem einer falschen Baudrate zu tun?
>Wenn du dich mit Spess unterhalten willst dann tauscht
>E-Mail Adressen aus. Und hör auf hier das eigentliche Problem
>zu vernebeln.

Mach dich doch wegen einem kleinen Nebenschauplatz, der jetzt beendet 
ist, nicht ins Hemd. Der TO hat doch alle Informationen bekommen, die er 
braucht.

MfG Spess

von Purzel H. (hacky)


Lesenswert?

>Was hat das mit dem Problem einer falschen Baudrate zu tun?

Die Anwendung im Flieger war nicht von Anfang an klar, daher war der 
Sleep Mode auch ein Thema, das man bei GPS anschneiden sollte.

von holger (Gast)


Lesenswert?

>Die Ausgabe ist aber immer noch murks.

Wie sieht die aus?

Ohne Zwischenpuffer am UART kannst du die Daten nicht
einfach so auf SD schreiben. Das dauert zu lange.

von Moritz P. (moritz_p)


Lesenswert?

holger schrieb:
>>Die Ausgabe ist aber immer noch murks.
>
> Wie sieht die aus?
>
> Ohne Zwischenpuffer am UART kannst du die Daten nicht
> einfach so auf SD schreiben. Das dauert zu lange.

Sieht im Prinzip immer noch so aus, wie in der Datei, die ich ganz am 
Anfang mit an den Post angehängt habe. Letztendlich lese ich die Daten 
ja auch zunächst in ein Array ein (per Interrupt) und schreibe sie dann 
auf die Karte (siehe main.c).

von Karl H. (kbuchegg)


Lesenswert?

Da stimmt irgendwas mit der Baudrate nicht. Was wieder in den 
allermeisten Fällen auf eine falsche µC-Taktrate zurückzuführen ist.

Ich würde dir empfehlen, diesen Punkt erst mal unabhängig vom GPS Modul 
zu  klären. Lass deinen µC über die UART an einen PC senden und schau 
dir im Hyperterminal (oder sonst einem Terminalprogramm an) wn, was da 
kommt. Das wird dann debuggt, bis du am PC bei der im AVR eingestellten 
Baudrate auch tatsächlich das empfangen kannst, was du am AVR 
wegschickst.

Ein derartiges Szenario geht unmittelbarer und einfacher zu debuggen als 
dein relativ kompliziertes Setup mit GPS Modul und SD Karte.

Und erst dann, wenn das klappt wechselst du wieder zum GPS Modul. Wobei 
ich persönlich auch hier als ersten Schritt nehmen würde: Vom GPS 
empfangen, über UART an den PC weitergeben.

Und wenn das dann klappt, dann wird auf SD geschrieben.

Auf die Art fängst du mit einem recht einfachen System an und baust es 
bis zu dem Punkt aus, den du als dein Ziel definiert hast. Aber: Du 
ergänzt immer nur ein neues Teilsystem und kannst somit in den 
restlichen Bereichen auf bereits getestete Komponenten zurückgreifen.

von Moritz P. (moritz_p)


Lesenswert?

So, mir ist ein wenig was dazwischen gekommen, aber habe ich mal wieder 
ein wenig testen können.

Also, das Senden vom µC an den Computer und das Senden vom GPS-Modul an 
den Computer funktionieren einwandfrei, aber die Zeichen, die ich vom 
Computer an den µC und dann wieder zurück an den Computer sende, werden 
nicht korrekt dargestellt (bis auf die Umlaute, die scheinen keine 
Probleme zu haben^^).

Daher nehme ich mal an, dass der Fehler irgendwie beim Empfangen am µC 
liegt, oder? Was kann ich da falsch gemacht haben? Die Schaltung sieht 
einfach so aus, dass ich vom Computer über einen Pegelwandler direkt an 
den entsprechenden Pin des µC gehe. Gehört da noch irgendwo ein 
Kondensator o.ä. dazwischen (den Pegelwandler habe ich natürlich laut 
Datenblatt ausreichend bestückt)?

Oder liegt es doch an dem zu ungenauen internen Oszillator? Warum geht 
dann das Senden ohne Probleme?

Nachtrag: Mir ist gerade noch aufgefallen, dass wenn ich z.B. ein a 
sende, nicht immer dasgleiche Zeichen wieder ankommt, sondern durchaus 
Unterschiedliche.

von Moritz P. (moritz_p)


Lesenswert?

Hat keiner mehr einen Tipp für mich? Den Pegelwandler habe ich gerade 
nochmal getestet, an dem kann es nicht liegen.
Kann es trotzdem an einer falschen Baudrate/Frequenz liegen, wenn die 
Senderichtung (vom µC aus) funktioniert? Wenn ich die Baudrate/Frequenz 
bewusst falsch einstelle, dann funktioniert (natürlich) auch das Senden 
nicht mehr korrekt.

von Purzel H. (hacky)


Lesenswert?

Was spricht denn dagegen, mit einem quarz zu arbeiten. Ich wuerd mir nie 
die Arbeit machen es ueberhaupt mit dem internen Oszillator zu 
versuchen. Ein Quarz kostet nur 15 cents.

von spess53 (Gast)


Lesenswert?

Hi

>Oder liegt es doch an dem zu ungenauen internen Oszillator?

Mit großer Sicherheit.

> Warum geht dann das Senden ohne Probleme?

Weil der Empfänger toleranter gegen Baudratenfehler ist.

Nimm einen Quarz.

MfG Spess

von Moritz P. (moritz_p)


Lesenswert?

Nagut, dann will ich mich mal auf die Suche nach einem Quarz machen.
Würde der hier gehen: 
http://www.reichelt.de/Quarze/7-3728-HC49U-S/index.html?ACTION=3&GROUPID=3173&ARTICLE=32844&SHOW=1&START=0&OFFSET=500&;

von spess53 (Gast)


Lesenswert?

Hi

>Würde der hier gehen:

Ja. Aber die Kondensatoren nicht vergessen.

MfG Spess

von Moritz P. (moritz_p)


Lesenswert?

Natürlich nicht; habe ich gerade schon rausgesucht. Keramik-Kondensator, 
22pF.
Das lohnt sich ja mal wieder, für 50ct zum Laden zu fahren. ;)

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.