GPS Atmega 88 xbee Daten empfangen

OP #4017300
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
OP #4017716
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?
#4017726
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.
#4017727
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.