ATmega168 UART Problem

#3090124
Lesenswert?

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)
#3090165
Lesenswert?

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
#3090172
Lesenswert?

> 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.
Gast #3090177
Lesenswert?

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.
Gast #3090240
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren