Forum: Mikrocontroller und Digitale Elektronik GPS Module + ATMEGA16


von Mayer Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Mayer Stefan (Gast)


Lesenswert?

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

von Dodocu (Gast)


Lesenswert?

3723.2475,N, 12158.3416,W

Ds ist doch:-)

von jjk (Gast)


Lesenswert?

>..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

von Christoph Borowski (Gast)


Lesenswert?

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

von jjk (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.