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