ATmega32 - Problem bei serieller Übertragung

Gast #949755
Lesenswert?

Hallo zusammen,

ich möchte Daten von einem ATmega32 an ein Notebook senden. Der UART des 
AVRs wird dazu eingestellt auf 2400 bps, 8 Datenbit, 1 Stopbit, ungerade 
Parität. Zum Testen soll der immer wieder beliebte String "Hallo, 
Welt!\n" übertragen werden.
Bei der Übertragung kommt am Notebook "Ha", dann einige fehlerhafte 
Zeichen und dann wieder "lt!" gefolgt von einigen falschen Zeichen an.

Was läuft hier falsch? Die Baudrateneinstellung habe ich aus dem 
Datenblatt entnommen und sollte bei 16MHz Taktfrequenz mit U2X = 0 dem 
Wert 416 (0x1a0) entsprechen. UBRRH wird vor UBRRL beschrieben.
Zum Testen hatte ich die Baudraten-Werte auch schon erhöht und 
verringert.

Die Einstellung der Fusebits ist LFUSE = 0xFF, HFUSE = 0xC9 (externer 
Quarz mit hoher Frequenz für biszu 16 MHz)

Beim ATtiny2313 hatte ich ein ähnliches Problem, bis ich feststellte, 
dass der interne Takt durch 8 geteilt wird. Dummerweise hat der Mega8 
kein Fuse-Bit um den Vorteiler einzustellen...

Danke schon mal für eure Tipps!


Gruß aus dem etwas verregneten München,

Markus
Persönliche Seite #949759
Lesenswert?

Also, es kann entweder an einem ungenauen internen Takt liegen (passiert 
z.B. wenn man Atmegas auf Platinen montiert, die ein bißchen wärmer 
werden) oder der Fehler für die Gewünschte Datenrate ist über die 
maximal zulässige Grenze hinaus. Wenn du einen externen Quarz nutzt, 
schaue, ob die Kapazitäten stimmen, diese sollten bei 18-22 pF liegen.
#949783
Lesenswert?

Markus wrote:
> ich möchte Daten von einem ATmega32 an ein Notebook senden. Der UART des
> AVRs wird dazu eingestellt auf 2400 bps, 8 Datenbit, 1 Stopbit, ungerade
> Parität.

Und den Empfänger auch so eingestellt?

Versuchs mal ohne Parität, nimmt eh keiner mehr.
Wenn Fehlererkennung sein muß, nimmt man besser CRC.


Peter
Gast #950201
Lesenswert?

Danke an euch, aber das ist es leider alles nicht.

Auf Grund der Fuse-Bits läuft der AVR mit dem externen 16MHz Quarz. Diek 
Kondensatoren am Quarz haben beide 22pF.

Das Programm prüft vor dem Senden eines Zeichens, ob der Sendepuffer 
leer ist.

Das Programm an sich läuft - bis auf die Baudrate - ohne Anpassung auf 
einem ATtiny2313 mit 8MHz ohne Probleme. Die Einstellung der übrigen 
UART-Register scheint bei beiden Controllern identisch zu sein.


Markus
#951143
Lesenswert?

Ich habe das Problem mittlerweile gelöst. Die Konfiguration der Register 
ist genauso wie beim ATtiny2313 nur liegen die Register UCSRC und UBRRH 
auf der gleichen Adresse. Welches Register beschrieben wird, liegt am 
Bit 7 (1 bedeutet, dass UCSRC beschrieben wird) Dieses Bit ist beim 
ATtiny2313 nach der Spezifikation auf 0 zu setzen.

Die Moral aus dieser Geschichte? Wer Lesen kann ist klar im Vorteil und 
sollten diesen auch ausnützen! ;)


Markus

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