Älex schrieb:
> Entschuldigt ich habe glaube ich die Frage falsch gestellt :). Ich meine
> warum die diese Formel für UBRR_VAL verwenden. Im Datenblatt steht ja
> UBRRn = (fCLKio / 16BAUD) - 1
>
>
> das entspricht ja nicht ((F_CPU+BAUD*8)/(BAUD*16)-1)
Na ja, aber fast
der einzige Unterschied besteht darin, dass zum Zähler noch mal die
Hälfte des Nenners des Bruches dazugezählt wird.
Exkurs.
Was ergibt in C
5 / 5
da beides ganze Zahlen sind, ist das eine Integerdivision und das
Ergebnis ist 1
Was ergibt 6 / 5? Die Antwort ist 1
7 / 5 1
8 / 5 1
9 / 5 1
10 / 5 2
findest du es nicht auch ein wenig unbefriedigend, wenn 9 / 5 den Wert
von 1 ergibt? Immerhin, als Kommazahl gerechnet, wäre 9.0 / 5.0 ja 1.8
and das liegt als Zahlenwert ja doch schon wesentich näher an 2 als es
an 1 liegt.
Das man mit dieser Division 9 / 5 einen Fehler macht ist klar und
unvermeidlich, denn 9 lässt sich nun mal nicht ganzzahlig durch 5
teilen. Aber der Fehler zum 'mathematisch korrekten' Ergebnis ist
kleiner, wenn man als Ergebnis 2 rausbekommen würde, als wie wenn man 1
raus kriegt.
Und genau diesen Zweck erfüllt dieser zusätzliche Term. Er verursacht,
dass in solchen Fällen dasjenige Ergebnis erhalten wird, welches den
'kleineren Fehler' repräsentiert - den zur nächsten ganzen Zahl
gerundeten Wert und nicht einfach nur den Wert, den man erhält wenn man
Kommastellen ignoriert.
Einfach mal mit Zahlen durchprobieren (Ich nehm jetzt eine gerade Zahl
als Divisor, damit die Hälfte klar definiert ist)
Original wäre es
6 / 6 1
7 / 6 1
8 / 6 1
9 / 6 1
10 / 6 1
11 / 6 2
mit der Modifikation
6: ( 6 + 3 ) / 6 = 9 / 6 1
7: ( 7 + 3 ) / 6 = 10 / 6 1
8: ( 8 + 3 ) / 6 = 11 / 6 1
9: ( 9 + 3 ) / 6 = 12 / 6 2
10: ( 10 + 3 ) / 6 = 13 / 6 2
11: ( 11 + 3 ) / 6 = 14 / 6 2
12: ( 12 + 3 ) / 6 = 15 / 6 2
und hier sehen die Ergebnisse dann schon weit besser aus. Ab der 9
aufwärts, wird das Divisionergebnis auf 2 aufgerundet, während es
darunter zu 1 abgerundet wird.
1 | ( a + b/2 ) / b ist also die gerundete Version von a / b
|
und das auf die im Datenblatt angegebene Formel angewendet .... ergibt
genau das, was du im Code siehst.