Forum: Mikrocontroller und Digitale Elektronik GPS LED Bargraph Monitor $GPGSV MTK3339 ATmega8 Assembler


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Ein kleines Beispiel wie der $GPGSV String mit USART 9600Bd, 8MHz Takt, 
ausgelesen und die Anzahl der gesehenen Satelliten mit einem Bargraph 
angezeigt werden kann.

Prinzip:

Die USART Daten vom GPS-Empfänger werden im Sekundentakt in ein 
Datenfeld (SRAM) geschrieben.

Ein neuer Datensatz beginnt, wenn 20ms keine Daten empfangen wurden.

Nun sucht der ATmega8 im Datenfeld nach "$GPGSV" und liest die Anzahl 
der gesehenen Satelliten aus,

Beispiel 12 Satelliten:

$GPGSV,3,1, 12 ,29,74,060,20,31,54,248,26,25,45,118,43,26,38,295,18*7C


Theorie:

http://aprs.gids.nl/nmea/#gsa
http://www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm

GPS Satellites in view

    $GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74
    $GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74
    $GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D


    $GPGSV,1,1,13,02,02,213,,03,-3,000,,11,00,121,,14,13,172,05*67


1    = Total number of messages of this type in this cycle
2    = Message number
3    = Total number of SVs in view
4    = SV PRN number
5    = Elevation in degrees, 90 maximum
6    = Azimuth, degrees from true north, 000 to 359
7    = SNR, 00-99 dB (null when not tracking)
8-11 = Information about second SV, same as field 4-7
12-15= Information about third SV, same as field 4-7
16-19= Information about fourth SV, same as field 4-7


Bernhard

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> Ein kleines Beispiel wie der $GPGSV String mit USART 9600Bd, 8MHz Takt,
> ausgelesen und die Anzahl der gesehenen Satelliten mit einem Bargraph
> angezeigt werden kann.

Die Anzahl der gesehenen Satelliten nützt meist wenig. Viel wichtiger 
ist, wieviel Satelliten für die Positionsberechnung benutzt werden. Die 
finden sich im GSA-Sentence.

von Purzel H. (hacky)


Lesenswert?

Die Frage war ?
Ich wuerde allenfalls die Genauigkeits Aussage verwenden. 200m, 100m, 
20m, 2m, Und die vielleicht logarithmisch darstellen.
Ich wuerde auch nicht die Strings in ein Datenfeld schreiben, sondern 
die Strings waehrend des Empfangs mit einer Zustandsmaschine auseinander 
nehmen.

Aber eben... wo liegt das Problem ?

von Thomas F. (igel)


Lesenswert?

Bernhard S. schrieb:
> mit einem Bargraph angezeigt werden kann.

Was ist das für ein Bargraph bei dem man nur die Kathoden anschließen 
muss?

von STK500-Besitzer (Gast)


Lesenswert?

Bernhard S. schrieb:
> Ein neuer Datensatz beginnt, wenn 20ms keine Daten empfangen wurden.

Hä?
NMEA-0183-Datensätze werden vorne durch ein "$" und hinten durch ein 
"\r\n" begrenzt. So können auch mehrere Datensätze am Stück ohne Pause 
übertragen werden.

Purzel H. schrieb:
> Ich wuerde auch nicht die Strings in ein Datenfeld schreiben, sondern
> die Strings waehrend des Empfangs mit einer Zustandsmaschine auseinander
> nehmen.

Kann man machen. Allerdings muss man den Kram wegen der 
Checksummen-Überprüfung dann doch zwischenspeichern.
Standard-NMEA-Datensätze haben eine maximale Länge von 80 Zeichen - das 
kann man auch in einem relativ kleinen AVR zwischenspeichern, und bei 
unterschiedlichen Checksummen dann verwerfen.

Bernhard S. schrieb:
> Ein kleines Beispiel wie der $GPGSV String mit USART 9600Bd, 8MHz Takt,
> ausgelesen und die Anzahl der gesehenen Satelliten mit einem Bargraph
> angezeigt werden kann.

Als Projekt eines Anfängers (bis auf die 20ms) gut.

von Wolfgang (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Kann man machen. Allerdings muss man den Kram wegen der
> Checksummen-Überprüfung dann doch zwischenspeichern.

Warum den ganzen Kram zwischenspeichern?
Auch die Checksumme lässt sich live mitrechnen. Und wenn der '*' kommt, 
muss die FSM dafür sorgen, dass die beiden Checksummen-Bytes 
herausgefischt und geprüft werden. Nur wenn die ok ist, wird die 
Satellitenanzahl zur Aktualisierung der Anzeige weitergereicht.

von STK500-Besitzer (Gast)


Lesenswert?

Wolfgang schrieb:
> Auch die Checksumme lässt sich live mitrechnen. Und wenn der '*' kommt,
> muss die FSM dafür sorgen, dass die beiden Checksummen-Bytes
> herausgefischt und geprüft werden.

Vielleicht etwas zu allgemein formuliert:
Dass man die live mitrechnen kann, ist mir schon klar.
Wenn man dann noch mehr als ein Feld aus dem NMEA-Frame verwenden will, 
speichert man die anderen auch noch mit. Wenn dann die Checksumme falsch 
ist, oder das Frameende nicht erkannt wird (weil zum Beispiel ein "$" 
folgt), kann man alles Geparstes verwerfen.
Es gibt ja nicht nur ein NMEA-Protokoll in dem ein Feld interessiert.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Die Anzahl der gesehenen Satelliten nützt meist wenig.

In meiner Anwendung nutze ich nur den hochgenauen Sekundenimpuls, um 
einen Quarzofen zu justieren.

> Als Projekt eines Anfängers (bis auf die 20ms) gut.

Die 20ms Pause dienen dazu, um den Anfang einer Übertragung zu 
bestimmen.
Wie hättest Du den Anfang eines Datenstrings bestimmt?

> Was ist das für ein Bargraph bei dem man nur die Kathoden anschließen
> muss?

Die neuen WLAN-Module können das problemlos ;-)

(Korrektur s. Anhang)

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

Bernhard S. schrieb:
> Wie hättest Du den Anfang eines Datenstrings bestimmt?

Wie schon geschrieben: Das $-Zeichen markiert den Anfang, "\r\n" 
(Carriage Return, Line Feed) das Ende eines Frames.
Die Checksumme wird mit "*" (Sternchen / Asterix) markiert, ist kein 
notwendiges Kriterium und kann auch weggelassen werden.

https://de.wikipedia.org/wiki/NMEA_0183

von uff basse (Gast)


Lesenswert?

Bernhard S. schrieb:
> Ein kleines Beispiel wie der $GPGSV String mit USART 9600Bd, 8MHz Takt,
> ausgelesen und die Anzahl der gesehenen Satelliten mit einem Bargraph
> angezeigt werden kann.

Und wo sind deine Abblock-Kondensatoren an den Vcc und AVcc Pins?

Braucht's keine, gell? Kostet nur unnötig Zeit und Geld.
Ausserdem ist das mit den Abblock-Kondensatoren eh nur
esoterisches Geschwafel.

von Bernhard S. (bernhard)


Lesenswert?

> Und wo sind deine Abblock-Kondensatoren an den Vcc und AVcc Pins?

Als was würdest Du am Ausgang des 7805 die komischen "Dinger" 
bezeichnen?

von uff basse (Gast)


Lesenswert?

Bernhard S. schrieb:
> Als was würdest Du am Ausgang des 7805 die komischen "Dinger"
> bezeichnen?

uff basse schrieb:
> an den Vcc und AVcc Pins?

Einfach einmal eine Application Note von Atmel
lesen (und verstehen).

von Bernhard S. (bernhard)


Lesenswert?

> Einfach einmal eine Application Note von Atmel
> lesen (und verstehen).

Scheinst noch ein Anfänger zu sein, nicht tragisch, wir helfen Dir gern.

Einfach mal ein Prinzipschaltbild so halbwegs deuten lernen.

von Bernhard S. (bernhard)


Lesenswert?

STK500-Besitzer schrieb:
> Wie schon geschrieben: Das $-Zeichen markiert den Anfang, "\r\n"
> (Carriage Return, Line Feed) das Ende eines Frames.

Problem: Die Frames können in unterschielicher Reihenfolge vom 
GPS-Modul, je nach Hersteller, gesendet werden.
Noch in der Interrupt-Routine müsste entschieden werden, ob es z.B. ein 
$GPGSV oder $GGSA String, Prüfsumme berechnet, Daten ausgewertet werden.

Das ist zwar nicht unmöglich, aber zeitlich ziemlich knapp.

Ich beschreite momentan den einfachen Weg, alles in den SRAM schreiben 
und in aller Ruhe die Frams auswerten, uns stehen ca. 0,8 Sekunden dafür 
zur Verfügung.

von STK500-Besitzer (Gast)


Lesenswert?

Bernhard S. schrieb:
> Ich beschreite momentan den einfachen Weg, alles in den SRAM schreiben
> und in aller Ruhe die Frams auswerten, uns stehen ca. 0,8 Sekunden dafür
> zur Verfügung.

Da hast du meinen Post mit Wolfgangs verwechselt.
Ich mache es nämlich auch immer so.
Wobei man die Checksumme halt schon beim Empfnag mit berechnen kann.
Das Parsen erfolgt dann nach der Überprüfung der Checksumme.

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.