Initialisierung UART aus dem Tutorial

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.