Forum: Mikrocontroller und Digitale Elektronik ATmega32 - Problem bei serieller Übertragung


von Markus (Gast)


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

von A. F. (artur-f) Benutzerseite


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.

von crazy horse (Gast)


Lesenswert?

du wartest wahrscheinlich nicht, bis der Sendebuffer leer ist.
Also, es liegt an deinem Programm, konnte ich nicht öffnen :-)

von Peter D. (peda)


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

von Markus (Gast)


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

von Falk B. (falk)


Lesenswert?


von crazy horse (Gast)


Lesenswert?

dann tippe ich auf Zeile 42.

von Markus (Gast)


Lesenswert?

lol - Beim meinem Glück ist auch genau die Schuld... ;)

von Markus D. (cipher1978)


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

von Igor M. (bastel-wastel)


Lesenswert?

Sorry für Offtopic, aber:

heißt es ausnützen oder ausnutzen?
In letzter Zeit sehe ich dieses "nützen" immer mehr. Da kriege ich schon 
Gänsehaut davon. Sagt mir bitte, dass es "nutzen" heißt.

von crazy horse (Gast)


Lesenswert?

es heisst "nützen" :-)

von Igor M. (bastel-wastel)


Lesenswert?

bäh ;-)

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