Forum: Mikrocontroller und Digitale Elektronik GPS Atmega 88 xbee Daten empfangen


von Tobias O. (tobias878)


Lesenswert?

Hi,

ich habe eine Platine entworfen womit ich GPS Daten mit einem Atmega 88 
verarbeite und die Daten mit Hilfe eines Xbee-Moduls an meinen PC sende.
Es werden Daten gesendet aber diese sind nicht verwendbar. 
(~?M~?~/?M~?~/?M~?~/?L~?~0?L~?~0?L~?~/?L~?~0?L~?~?L~?~?L~?~?L~?0~?L~?0~? 
L~?0~?M~?/~??M~???~?~??~?~?//~0?L~?~~?~///??M~/M~/L~/M~?/M~??M~/M~??M~?? 
M~/??M~   ???M~?/?M~?/??????M~?/~??M~?/?M~ 
??M~??M~??M~??M~??M~?????M~/??M~/??M~/M~???M~/M~?????M~M~??M~M~????M~~?? 
?~/????~M~??M~?/~??M~?/M~?/?M~?/~~?~).

Zum verständnis ich möchte mit dem Atmega die GPS-Daten wo am RX port 
ankommen mit dem TX port an mein xbee senden.
Ich habe unten mein Quellcode angehängt.
Das xbee hat auch eine Baudrate von 9600.

Ich weis nur nicht wo mein fehler liegt. Stimmt mein quellcode?




Ich habe ein 4Mhz Quarz. Baudrate ist 9600



Quellcode:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#define F_CPU 4000000UL
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE 25 //(((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


int main (void)
{

  UCSR0B = (1 << RXEN0) | (1 << TXEN0);   // Senden und Empfangen 
initialisieren
  UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); // 8 Bit kein stop bit

  UBRR0H = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate 
value into the high byte of the UBRR register
  UBRR0L = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value 
into the low byte of the UBRR register

  void TransmitUART0 (unsigned char data)
  {
    while (!(UCSR0A & (1 << UDRE0)));
    UDR0 = data;
  }


  while (1)
  {

    TransmitUART0(UDR0);
  }


Grüße Tobi

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tobias O. schrieb:
> Das xbee hat auch eine Baudrate von 9600

Wieso 'auch'? Standard GPS Signale werden meistens mit den 
NMEA-konformen 4800 Baud gesendet, wenn das GPS Modul im Grundzustand 
ist. Es ist auch recht offensichtlich, das eine Baudrate falsch ist. Auf 
welcher Seite, musst du nun herausfinden.

von Tobias O. (tobias878)


Lesenswert?

Also ich hab nochmals alles durchgeschaut. Meinem GPS Modul(Mediatek 
3329) hat im Grundzustand 9600Baud. Xbee Module sind auf 9600 Baud und 
in meinem Quellcode sollte es normal auch stimmen.

Ich habe ein Externes Quarz bei den Fuses eingestellt. Aber dort gibt es 
verschiedene Auswahlmöglichkeiten könnte mein fehler dort liegen?

von Karl H. (kbuchegg)


Lesenswert?

Tobias O. schrieb:

> Ich habe ein Externes Quarz bei den Fuses eingestellt. Aber dort gibt es
> verschiedene Auswahlmöglichkeiten könnte mein fehler dort liegen?

Möglich.
Meistens liegt der Fehler auch an genau dieser Stelle.

Hast du denn überprüft, ob der Quarz aktiv ist?
Häng an einen Port eine LED und lass die im Sekundentakt toggeln
1
#define F_CPU 4000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
 
6
// Hier die tatsächlich verwendeten Parameter angeben
7
 
8
#define LED_PORT    PORTB
9
#define LED_DDR     DDRB
10
#define LED_PIN     PB0
11
 
12
int main()
13
{
14
   LED_DDR |= 1 << LED_PIN;
15
 
16
   while (1)
17
   {
18
      LED_PORT ^= 1 << LED_PIN;
19
      _delay_ms(1000);
20
   }
21
 
22
   return 0;
23
}

wenn der µC tatsächlich mit 4Mhz läuft, dann ist die LED 1 Sekunde an 
und 1 Sekunde aus. Läuft der µC mit bspws. 1Mhz, dann ist sie 4 Sekunden 
an/aus. Das kann man leicht unterscheiden.

Wenn das stimmt, dann lass das GPS erst mal links liegen und sieh zu, 
dass du vom µC aus, Daten per UART an den PC schicken kannst. Das kann 
ruhig zb ein konstanter Text sein. Wenn der im Terminal genau so 
auftaucht, dann weisst du schon mal, dass die UART Übertragung µc->PC 
klappt. Dann bleibt dir als Unbekannte nur noch die Übertragung vom GPS 
zum µC. Und das ist dann schon mal besser als wie wenn du überhaupt 
keine Ahnung hast, an welcher Stelle der Übertragungskette ein möglicher 
Fehler sitzen könnte.

Nicht zu viel auf einmal machen. Du willst wo immer es geht, einzelne 
Subsysteme testen können, ehe du das nächste Subsystem in Betrieb 
nimmst. Wer in einem Rutsch zu viel will, endet oft mit einem Programm 
in dem nichts funktioniert und keiner hat eine Ahnung, wo das Problem 
liegen könnte. Und genau das kannst du überhaupt nicht brauchen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

1
while (1)
2
{
3
TransmitUART0(UDR0);
4
}

Hö, hö, hö.
Immer langsam mit den jungen Pferden.
Du kannst doch nicht einfach das UDR0 verschicken. Du musst schon 
warten, bis vom GPS wieder ein Zeichen eingetrudelt ist. Erst dann hast 
du was im UDR0, was du zum PC weiter schicken kannst.

Aber wie gesagt: geh erst mal schrittweise vor. Eins nach dem anderen
* stimmt die Taktfrequenz (LED-test)
* klappt die Übertragung zum PC?
* und erst dann kommt dein GPS Modul

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.