Hallo, ich habe ein Problem mit der Kommunikation zweier Atmega128 über UART1 (Unidirektional). Ich kann die Daten senden, aber nicht fehlerfrei empfangen. Die UART ist syncron mit einer Datenrate von 115200 Bit/s initialisiert. Die Atmegas laufen mit einem externen Quarz mit 13.824 MHz. über uint8_t Usart_Rx(void) { while (!(UCSR1A & (1<<RXC))); return UDR1; } frage ich ab ob ein Zeichen verfügbar ist, ist das der Fall wird das Zeichen, was im diesem Fall ein 8 Bitwort ist verglichen und bei übereinstimmung ein Portpin gesetzt. In der Main rufe ich die Funktion Usart_Rx(); auf und schreibe das Wort dann in data: data = UDR1; Das Programm muss in der Whileschleife hängen, da vermutlich RXC nicht gesetzt wird. deaktiviere ich den Funktionsaufruf Usart_RX(); wird das 8 Bitwort empfangen und der Port gesetzt, allerdings nur sporadisch also mit hoher Fehlerrate. gesendet werden mehrere das 8 Bit worte permanent in einer Endlosschleife alle par µs. Ich hoffe Ihr könnt mir weiterhelfen. MfG Paul
1. ich würde das Interruptgesteuert realisieren. 2. Du liest in der Usart_Rx()-Routine schon UDR und weist danach den Inhalt von 'UDR1' 'data' zu. D.h.: Du liest zwei mal.
1 | data = Usart_Rx(); |
Sollte dann schon ännahernd das sein, was Du willst.
...na huch, was passiert denn hier? data = Usart_Rx(); Sollte da in Code-Tags stehen.
Das hab ich schon geändert, das ist aber nicht das problem. Das Problem liegt daran, das der Empfäger nur das Datenwort erkennt, wenn er zu einem bestimmten Zeitpunkt angeschaltet wird, sonst nicht. Irgendwie passt das mit dem Handling der UART nicht. Kann man eigendlich Start und Stopbit der UART deaktivieren?
Die hilfr mir nicht weiter, ich möchte keine Zeichen senden oder so. Ich möchte dem Empfänger zu jeder Zeit zuschalten können und er soll ein 8 Bitwort als Startwort erkennen und erst dann die restlichen Daten empfangen. Das Startwort frage ich mit einer if Anweisung ab, aber wie gesagt, das funktioniert nur sporadisch wenn es zufällig nach dem Einschalten empfangen wird.
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.