PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega32 Problem UART Reihenfolge Register



vajk
20.09.2009, 13:31
Hallo !

Ich hatte ein Problem mit der seriellen Schnittstelle. In Abhängigkeit
der Reihenfolge bei der Initialisierung werden falsche Daten gesendet.

Wenn ich folgende Reihenfolge bei der Initialisierung verwende,
dann kommen nur 0-Byte am Comport raus:



* *uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (16 * BAUDRATE) - 1);
* *UBRRH * * * * = (uint8_t) (ubrr >> 8);
* *UBRRL * * * * = (uint8_t) (ubrr);

* *UCSRB * * * *|= (1 << RXEN) *| (1 << TXEN) *| (1 << RXCIE);
* *UCSRC * * * *|= (1 << USBS) *| (1 << UCSZ1) | (1 << UCSZ0); // asyncron 8N1



Wenn ich die Reihenfolge umdrehe, ist alles wie es sein sollte


* *UCSRB * * * *|= (1 << RXEN) *| (1 << TXEN) *| (1 << RXCIE);
* *UCSRC * * * *|= (1 << USBS) *| (1 << UCSZ1) | (1 << UCSZ0); // asyncron 8N1

* *uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (16 * BAUDRATE) - 1);
* *UBRRH * * * * = (uint8_t) (ubrr >> 8);
* *UBRRL * * * * = (uint8_t) (ubrr);


Anmerkung - die Codeschnipsel sind Bestandteil der Anfangsinitialisierung des atmega32, die Interrupts werden am Ende dieser mit sei(); aktiviert.

Ich hefte das unter "Bug || unloesbares Raetsel" und "Info für alle" ab.

Vy 73
Vajk

PicNick
20.09.2009, 17:25
Ganz so mystisch isses auch nicht.
Wenn du ins UCSRC schreiben willst, musst du URSEL setzen, sonst vernichtest du das UBRRH-Register.
1) in der unteren reihenfolge schreibst du erst nachher in das UBRRH, somit reparierst du es gewissermassen.
2) in der oberen Folge ist die letzte aktion die Zerstörung des UBRRH, und das bleibt dann.

(lt. doku haben UCSRC u. UBRRH die gleiche physische adresse)

vajk
20.09.2009, 17:54
ooops, danke, das hatte ich bisher ueberlesen. Beim mega128 gibts das nicht ...