Forum: Compiler & IDEs ATMega 8 - Seltsame Probleme mit UART


von Michael J. (jogibaer)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin da auf ein Problem gestoßen, welches ich mir nicht erklären 
kann.

Ich konnte das Problem einkreisen und kann es auch umgehen, nur weiß ich 
nicht, warum ich das Problem habe.
(vermutlich sowieso ein Programmierfehler)

Im Anhang sind 2 Dateien.

Im main.c befindet sich ein extra Testprogramm, wo der Fehler auftritt.

Und zwar stimmt die Baudrate des UART nicht.
Wenn ich die UCSRx Register vor den UBRRx Registern beschreibe, habe ich 
meine Baudrate von 9600; wenn ich sie erst nach den UBRRx Registern 
beschreibe,(wie im Datenblatt angegeben,) habe ich laut Oszi ca. 300 
Baud.
Das Terminalprogramm zeigt dann bei 300 baud die Zeichen leicht 
verstümmelt an, sind also nicht ganz genau 300 baud.
-> siehe Kommentar im Quelltext

Ich hatte auch schon statt der Rechnung, die entsprechenden Werte per 
Zuweisung in die UBRRx Register geschrieben, aber auch dort habe ich den 
gleichen Fehler.

noch ein paar Infos:

Linux, avr-gcc 4.3.5, makefile hängt an

low Fuse: 0x1F
High Fuse:0xD0
Bootloader wird noch nicht benutzt



Sieht hier jemand mehr als ich ?

Jogibär

von g457 (Gast)


Lesenswert?

> UCSRC = (1<<UCSZ0) | (1<<UCSZ1);

da fehlt noch ein _BV(URSEL)

Dann ggf. noch CKOPT löschen.

HTH

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

g457 schrieb:
> da fehlt noch ein _BV(URSEL)

Jöpp. Beim Beschreiben von UCSRC muss das höchstwertige Bit (URSEL) 
gesetzt sein. Wenn das Bit nicht gesetzt wird, beschreibst du statt 
dessen das UBRRH Register.

Ein Blick ins Datenblatt hätte dir die Augen geöffnet:
1
Bit 7 – URSEL: Register Select
2
3
This bit selects between accessing the UCSRC or the UBRRH Register.
4
It is read as one when reading UCSRC. The URSEL must be one when
5
writing the UCSRC.

von Michael J. (jogibaer)


Lesenswert?

Hallo,

oh je, da habe ich aber wirklich gepennt !!

Stimmt, mit URSEL funktioniert es auch andersrum.
Da habe ich wohl an der falschen Stelle gesucht, da ja die andere 
Version
funktioniert hat.


Bit 7 – URSEL: Register Select

This bit selects between accessing the UCSRC or the UBRRH Register.
It is read as one when reading UCSRC. The URSEL must be one when
writing the UCSRC.

Das habe ich anscheinend mit voller Absicht überlesen.

Danke noch mal an alle für die Tips.
Aber schon komisch, das es andersrum funktioniert hat.

Jogibär

von Stefan E. (sternst)


Lesenswert?

Michael Jogwich schrieb:
> Aber schon komisch, das es andersrum funktioniert hat.

Weil du dann den falschen Inhalt in UBRRH wieder überschreibst. Und dass 
nichts nach UCSRC geschrieben wurde stört nicht weiter, denn das, was du 
da reinschreiben willst, ist eh schon da drin (als Default-Inhalt nach 
einem Reset).

von Michael J. (jogibaer)


Lesenswert?

Hallo,

stimmt.

Siehe Beschreibung URSEL weiter oben.

Danke noch mal an alle.

Jogibär

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.