www.mikrocontroller.net

Forum: Compiler & IDEs Initialisierung UART aus dem Tutorial


Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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
#define UBRR_VAL ( (F_CPU / (BAUD*16) ) - 1)

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

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Anna-zaira Engeln (nanalisa)
Datum:

Bewertung
0 lesenswert
nicht 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
//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"?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anna-zaira Engeln (nanalisa)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.