hallo, hab ein großes problem . ich sollte von einem gps module (EM-401 - Datasheet im Anhang) der längen und breitengrad auslesen und diesen an einem lcd display ausgeben. das gps module hab ich an meiner programmieschaltung angeschlossen (TX - TXD) nun weiß ich aber nicht wie ich seriell einlesen kann. kann mir vielleicht jemand ein codebsp geben?
so hab einmal das seriell einlesen :
1 | #include <stdint.h> |
2 | #include <io.h> |
3 | |
4 | |
5 | // Definierung der baudrate
|
6 | |
7 | #define USART_BAUD 4800 //festgelegt von NMEA 0183 Standard
|
8 | |
9 | #define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)
|
10 | |
11 | |
12 | void USART_vInit(void) |
13 | |
14 | {
|
15 | |
16 | // Setzen der baudrate
|
17 | |
18 | UBRRH = (uint8_t)(USART_UBBR_VALUE>>8); |
19 | |
20 | UBRRL = (uint8_t)USART_UBBR_VALUE; |
21 | |
22 | |
23 | // Frameformat auf 8 Datenbits, no parity und 1 stop bit setzen
|
24 | |
25 | UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); |
26 | |
27 | |
28 | //Einschalten des Empfängers bzw. Senders
|
29 | |
30 | //UCSRB = (1<<RXEN)|(1<<TXEN);
|
31 | UCSRB = (1<<RXEN); |
32 | |
33 | }
|
34 | |
35 | |
36 | void USART_vSendByte(uint8_t u8Data) |
37 | |
38 | {
|
39 | // Warten bis Byte gesendet
|
40 | |
41 | while((UCSRA&(1<<UDRE)) == 0); |
42 | |
43 | // Daten übertragen
|
44 | |
45 | UDR = u8Data; |
46 | |
47 | }
|
48 | |
49 | |
50 | uint8_t USART_vReceiveByte() |
51 | |
52 | {
|
53 | // Warten bis ein Byte empfangen wurde
|
54 | |
55 | while((UCSRA&(1<<RXC)) == 0); |
56 | |
57 | // Ausgabe der Empfangenen Bytes
|
58 | |
59 | return UDR; |
60 | |
61 | }
|
62 | |
63 | |
64 | int main(void) |
65 | |
66 | {
|
67 | |
68 | uint8_t u8Data; |
69 | |
70 | |
71 | // Initialisierung von USART
|
72 | |
73 | USART_vInit(); |
74 | |
75 | |
76 | // Commands senden
|
77 | |
78 | // NMEA enable
|
79 | USART_vSendByte('$PSRF100,1,4800,8,1,0*0C<CR><LF>') |
80 | |
81 | // GGA = Global Positioning System Fixed Data - enable
|
82 | USART_vSendByte('$PSRF103,00,01,00,01*25'); |
83 | |
84 | // Endlosschleife
|
85 | for(;;) |
86 | |
87 | {
|
88 | |
89 | // u8Data - Ausgabe von empfangen Bytes
|
90 | |
91 | u8Data = USART_vReceiveByte(); |
92 | |
93 | // USART_vSendByte(u8Data);
|
94 | |
95 | }
|
96 | |
97 | }
|
kann mir jemand erklären wie ich nun den längen und breitengrad rausbekomme? - hab beim modul GGA aktiviert: $GPGGA, 161229.487,3723.2475,N, 12158.3416,W, 1,07,1.0,9.0,M, 0000*18
>..das gps module hab ich an meiner programmieschaltung angeschlossen (TX - >TXD) Was fuer eine "programmieschaltung"? TxD (Pin5) gehoert ausserdem an RxD des UART/Atmega und RxD (Pin4) an TxD. Da das Modul nur TTL mit 0/2.85V ausgibt wird es nur mit etwas Glueck funktionieren oder wenn der Atmega auch mit 3.3 Volt laeuft. Sonst brauchst Du wohl einen Pegelwandler oder nimm gleich einen MAX232 und Anbindung an PC/Terminalprogramm bzw. SiRF Demo. >hab beim modul GGA aktiviert: Das glaub ich nicht: >'$PSRF103,00,01,00,01*25') Fehlt da nicht <CR> <LF> ? Das hier hast Du zwar sehr schoen abgeschrieben: '$PSRF100,1,4800,8,1,0*0C<CR><LF>' ...aber die Checksum "0C" ist fuer Port0 und 9600 Baud: "Switch to SiRF binary protocol at 9600,8,N,1 $PSRF100,0,9600,8,1,0*0C<CR> <LF>" Warum Du ueberhaupt auf die Idee kommst dem Modul noch mal die Default-Protokolleinstellungen zu schicken verstehe ich nicht so ganz. Das Ding laeuft doch per Werkseinstellung eh schon mit 4800/8N1. Und das hier ist lediglich der Beispiel-String aus dem Manual: >$GPGGA, 161229.487,3723.2475,N, 12158.3416,W, 1,07,1.0,9.0,M, 0000*18 Die Erklaerung ist in der Tabelle darunter. Da findest Du detailliert beschrieben wie der String zu lesen ist. Zur Sicherheit: Entlade mal den SuperCap oder loete einen Anschluss ab dann hast Du wieder die Werkseinstellungen, egal was Du bisher mit dem Modul angestellt hast, sofern es noch intakt ist. Per Reset Command sollte man sowas besser nicht machen da dann sowohl der werksseitige eingespeicherte Almanac verloren geht als auch der Oscillator Offset! Dann wuerde ein Cold Start vor Allem wg fehlendem Oscillator Offset etwas dauern, das ist eine SiRF-spefische Eigenart. Ich wuerde versuchen das Teil erst mal via MAX232 am PC zum Laufen zu bekommen. Danach kannst Du darueber nachdenken wie Du die NMEA Strings via Atmega abspeicherst und die gewuenschten Daten rausfilterst. NMEA Protokollkenntnisse und die Bedeutung der Kommata sind dabei hilfreich: NMEA Strings haben dummerweise keine fixe Laenge, wenn Daten fehlen werden die entsprechenden Stellen ausgelassen: Also etwa so ...12345,,,678.. Man muss also die Kommata zaehlen um an bestimmte Datensaetze innerhalb eines Strings zu kommen und ueberpruefen, ob nach dem gewuenschten Komma auch tatsaechlich Daten anliegen. Wenn z.B. bei GGA zwar die Uhrzeit schon vorliegt, aber noch keine Position, dann sieht das eben so aus: $GPGGA, 161229.487,,, juergen
Hallo, also wenn es nur um das Datenformat angeht... unter Google die Suchbegriffe 'NMEA 0183' eingeben. Über Wikipedia kommt man sehr schnell auf Links wie: - http://www.werple.net.au/~gnb/gps/nmea.html - http://gpsd.berlios.de/NMEA.txt - ... Also, mich wundert es manchmal schon, dass es Leute gibt, die zwar ein GPS-Modul an einen Mikrocontroller angeschlossen bekommen, aber eine Google-Recherche von 15sek nicht hinkriegen?! Gruss Christoph
>Also, mich wundert es manchmal schon, dass es Leute gibt, die zwar ein >GPS-Modul an einen Mikrocontroller angeschlossen bekommen... Wenn er, wie eingangs geschrieben, TxD mit TxD verbindet scheitert er ja da schon... >.. aber eine Google-Recherche von 15sek nicht hinkriegen?! Full ACK. Manuals/Dokus lesen und verstehen hilft auch ungemein ;) juergen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.