Forum: Mikrocontroller und Digitale Elektronik UART - ATmega16


von filzlaus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

habe mir das STK500 zugelegt und arbeite gerade das Tutorial durch.
Leider hab ich jetzt ein Problem mit der UART und hoffe, dass mir hier
jemand weiterhelfen kann.
Mein Ziel ist ganz einfach, wie im Tutorial beschrieben, den String
"TEST!" über die UART rauszuschicken (mit AVR Studio 4, Assembler).
Mit dem AT90S8515 klappt das auch prima.
Nur mit dem ATmega16 will es einfach nicht funktionieren. Ich glaube
mein Problem ist das Register UBRRH. Obwohl URSEL auf 1 steht wird
trotzdem in UBRRH und UCSRC immer gleichzeitig
derselbe Wert eingetragen. Was mach ich bloß falsch?? Die Taktfrequenz
hab ich auf 1MHz eingestellt. Ist das so richtig??


Danke

von filzlaus (Gast)


Lesenswert?

hab gerade nochmal die Taktfrequenz vom STK500-Programmer ausgelesen.
Ist bei 1,23MHz. Habs damit probiert, aber funktioniert auch nicht.

von Britneypunter (Gast)


Lesenswert?

Dein erster Mega an der UART?
Du mußt bei den Mega's den Tacktgeber als erstes Konfigurieren. Tust
du dies nicht, so läuft er standartmäßig mit dem internen 1MHz
Qszilator. Konfiguriert wird der Tackt mit den Fuses Bits (siehe
Datenblatt).

Andererseits müßte es eigendlich funktioniert haben, da du ja von einem
1MHz Tackt ausgingst und dem entsprechend dann die Baudrate eingestellt
hast.

Also ich habe mich mit dem Problem auch ewig rum geschlagen, als ich
zum ersten mal nen Mega mit der UART verbunden habe. Bei mir lag es
letztlich an der Quarzkonfiguration, also den Fuses bits.

von Axel S. (mayday)


Lesenswert?

Habe das Problem ebenfalls: der von avr-gcc generierte Code schreibt 
unabhängig von URSEL sowohl UCSRC als auch UBRRH. Evtl. ein Bug im 
Compiler?!
Glücklicherweise hat in meinem Fall eine Umordnung der Befehle genügt, 
so dass die Baudrate korrekt eingestellt wird.

Hier ein Codeschnipsel, bei dem das Problem auftritt:

/* Set baud rate */
baudRegister=(uint16_t) 
((uint32_t)F_CPU/(uint32_t)((uint32_t)baud*(uint32_t)16) - 1);
UBRRH = (unsigned char) (baudRegister>>8);
UBRRL = (unsigned char) baudRegister;
/* Set frame format: 8 data, no parity & 1 stop bit */
UCSRC = (1<<URSEL) | (0<<UMSEL) | (1<<UCSZ0) | (1<<UCSZ1);
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN) | (1<<TXEN);

Mit dem UCSRC=.... wird auch UBRRH fälschlicherweise überschrieben.

avr-gcc Version 3.4.6
AVR-Studio Version 4.13 SP1 bzw. build 557

von Johannes M. (johnny-m)


Lesenswert?

Es kann nicht am Compiler liegen, da der Schreibzugriff µC-intern 
ausschließlich über das URSEL-Bit geregelt wird! Die Register liegen an 
der selben Adresse im Speicher und nur URSEL entscheidet, welches der 
beiden Register geschrieben wird. Es ist also in der Realität schlicht 
unmöglich, beide Register gleichzeitig zu beschreiben (auch der Compiler 
müsste zu dem Zwecke zwei Zugriffe draus machen). Ein Bit kann nunmal 
nicht gleichzeitig gesetzt und nicht gesetzt sein.

Du hast das vermutlich im Simulator ausprobiert, und ja: Der Simulator 
hat an der Stelle einen Bug, der seit langem bekannt und auch in der 
Hilfe zum Simulator unter "Known Issues" aufgeführt ist.

Abgesehen davon ist es schwachsinnig, für so etwas einen fast 4 Jahre 
alten Thread wieder rauszukramen.

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.