Initialisierung UART aus dem Tutorial

#922579
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.
#1023406
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"?
#1023419
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren