Ich habe ein Problem mit dem Hardware UART des ATmega168. Ich konfiguriere laut Datenblatt so, dass 8 Datenbits, kein Paritätsbit und 1 Stopbit gesendet werden soll. Trotzdem ist es so, dass ich an der Gegenstelle (ein Raspberry Pi) 7 Datenbits einstellen muss, um korrekte Daten zu erhalten. Hat oder hatte jemand mal vielleicht das gleiche Problem und hat eine Lösung dafür parat? Ich habe das Register UCSR0C wie folgt konfiguriert: Bit 0: 0: TX rising, RX falling Bit 2-1: 11: character size 8 bit Bit 3: 0: 1 stop bit Bit 5-4: 00: no parity Bit 7-6: 00: asynchronous USART Das Register UCSRC0B habe ich auf das Bit geprüft, das 9 Datenbits konfiguriert, es ist nicht gesetzt. Ich benutze den internen Oszillator ohne Teiler, das heißt mein F_CPU ist 8MHz. Ich benutze weiters die UART Library von Peter Fleury (http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html)
Armin B. schrieb: > Ich benutze den internen Oszillator ohne Teiler, das heißt mein F_CPU > ist 8MHz. Du weißt, dass der interne Oszillator nicht sehr genau ist? Eventuell musst Du die Baudrateneinstellung noch etwas trimmen (oder den Oszillator). Gruß Dietrich
Hi Welche Baurate? Der interne RC-oszillator ist nur sehr bedingt für die serielle Kommunikation geeignet. Erstens läuft er selten genau auf 8MHz und zweiter ist er nicht stabil. MfG Spess
Bei jeder Baudrate von von 2400-38400 tritt dasselbe Problem auf. Meinst du ich sollte einen externen Quartz verwenden?
Armin B. schrieb: > Bei jeder Baudrate von von 2400-38400 tritt dasselbe Problem auf. Meinst > du ich sollte einen externen Quartz verwenden? Wenn es am Frequenzfehler des Oszillators liegt, ist der prozentuale Fehler ja auch bei jeder Baudrate gleich. Mess doch mal den Ausgang TX mit einen Scope eine Bitlänge, um den Fehler abzuschätzen. Statt einem externen Quarz kannst Du ja auch mal mit der Baudrateneinstellung im ATmega168 spielen. Gruß Dietrich
> Mess doch mal den Ausgang TX mit einen Scope eine Bitlänge, um den > Fehler abzuschätzen. Leider besitze ich keine Messinstrument, dass mir derartiges anzeigen könnte. :o) > Statt einem externen Quarz kannst Du ja auch mal mit der > Baudrateneinstellung im ATmega168 spielen. Das habe ich gemacht. Ich habe controllerseitig und entsprechend an der Gegenstelle alle Baudraten von 2400-38400 ausprobiert.
Armin B. schrieb: > Statt einem externen Quarz kannst Du ja auch mal mit der >> Baudrateneinstellung im ATmega168 spielen. > Das habe ich gemacht. Ich habe controllerseitig und entsprechend an der > Gegenstelle alle Baudraten von 2400-38400 ausprobiert. er meint: du sollte einfach mal den wert von UBRR0 ändern, also nicht die werte aus dem Datenblatt. Einfach mal +2 oder -2 verwenden.
Ich habe nun einen externen Quarzoszillator konfiguriert und angeschlossen. Jetzt funktioniert es wie gewollt. Vielen Dank für eure Hilfe und Hinweise!
War vielleicht auch die CLKDIV8 Fuse so gesetzt, das der intern mit ca. 1 MHz gelaufen ist? Fragt Klaus
Klaus schrieb: > War vielleicht auch die CLKDIV8 Fuse so gesetzt, das der intern mit ca. > 1 MHz gelaufen ist? Nein, wie ich schon sagte: > Ich benutze den internen Oszillator ohne Teiler, das heißt mein F_CPU > ist 8MHz.
Armin B. schrieb: > Das habe ich gemacht. Ich habe controllerseitig und entsprechend an der > Gegenstelle alle Baudraten von 2400-38400 ausprobiert. Das Durchprobieren der Baudraten bringt nix. Wenn die Frequenz 5% falsch ist, ist sie 5% falsch - egal wie weit sie durch den Baudratengenerator runtergeteilt wird. Sende ein Zeichen, was im letzten Bit die gleiche Polarität hat, wie das Stop-Bit, variiere bei eine Baudrate von z.B. 2400 Bd den Teilerfaktor am µC um die im Datenblatt angegebenen Werte und guck, zwischen welchen Werten der PC das Zeichen richtig empfängt.
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.