Forum: Compiler & IDEs Initialisierung UART aus dem Tutorial


von Werner A. (homebrew)


Lesenswert?

Hallo,
ich bastel gerade nen bischen mit der seriellen Schnittstelle. Dazu hab 
ich mir das Datenblatt von meinem AT90CAN128 angeschaut.

Die Initialisierung der Baudrate wird da so gemacht
1
#define UBRR_VAL ( (F_CPU / (BAUD*16) ) - 1)

Im Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#UART_initialisieren) 
wird  aber noch die 8-fache Baudrate zur CPU Frequenz hinzuaddiert.
1
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
2
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
3
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
4
 
5
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
6
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
7
#endif

Generell geht beides bei mir, aber ich würde schon gerne wissen was denn 
wohl "besser" ist.

von Stefan E. (sternst)


Lesenswert?

Nimm das aus dem Tutorial. Das "+BAUD*8" sorgt für eine Rundung des 
Ergebnisses. Der Fehler ist dann also ggf. etwas kleiner.

von Anna-zaira E. (nanalisa)


Lesenswert?

Hey ja,

an der Fragestellung bin ich gerade auch hängengeblieben.

Der freundliche Autor dieses Quelltextes hat ja auch darauf in seinem 
Kommentar hingewiesen, dass es sich um einen Rundungstrick handelt
1
//clever runden
, aber ich verstehe nicht, warum das funktioniert!?

Im Grunde addiert er ja "nur" (8*baud)/(16*baud)=0.5 hinzu...

Wieso ist das cleverer und nicht einfach "falsch"?

von Stefan E. (sternst)


Lesenswert?

Mache es dir doch einfach an einem Beispiel klar:

Ohne dieses Runden:
1,4 wird zu 1
1,9 wird zu 1

Mit Runden:
1,4 + 0,5 wird zu 1
1,9 + 0,5 wird zu 2

von Johannes M. (johnny-m)


Lesenswert?

Anna-zaira Engeln wrote:
> Wieso ist das cleverer und nicht einfach "falsch"?
Wenn man zu einer Zahl, deren Nachkommaanteil kleiner als 0,5 ist, 0,5 
hinzuaddiert, bleibt der Vorkommaanteil unverändert und beim Abschneiden 
des Nachkommaanteils wird der korrekte Wert ausgegeben. Ist der 
Nachkommaanteil größer als 0,5, dann erhöht sich der Vorkommaanteil um 
1, was einem korrekten Aufrunden entspricht. Da man bei einer Integer- 
(Ganzzahl-) Division nunmal nicht 0,5 hinzuaddieren kann, addiert man 
vor der Division zum Dividenden die Hälfte des Divisors hinzu, was 
äquivalent zu einer Addition von 0,5 nach der Division ist und somit 
zu einem korrekt gerundeten Endergebnis führt.

von Anna-zaira E. (nanalisa)


Lesenswert?

Jau, jetzt ist es auch mir klar.... vorher wäre es ja kein echtes 
Runden, sondern Abschneiden, das war die Info, die mir gefehlt hat. 
DANKE!!

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.