Forum: Mikrocontroller und Digitale Elektronik Fehler im GCC Wiki? - Baudrate Berechnung


von Thomas L. (tom)


Lesenswert?

Hallo

Ich versuche gerade den UART an einem Atmega8 zumlaufen zu bringen. 
Dabei bin ich auf die Formeln für die Berechnungen im Wiki gestossen:
1
// Berechnungen
2
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
3
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
4
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille 
5
...
6
UBRR = UBRR_VAL;

Nun habe ich das Ganze für 2MHz bei 9600Baud gerechnet:

(Vorsicht, ab hier meine Interpretation)
UBRR_VAL wird: 12,520833
BAUD_REAL wird: 9244,99
BAUD_ERROR wird -36,9 (Promille)
was natürlich viel zu gross ist. Im Datenblatt des Atmega8 ist für 
dieselben Werte ein Wert von 0,2% angegeben.
Etwa 0,16 erhalte ich, wenn ich anstatt 12,520833 genau 12 einsetze, was 
ja dann eigentlich auch im Register stehen sollte.

Nun meine Frage: Rechnet der Präprozessor da mit 12,520833 weiter, 
anstatt mit 12? Ist das ein Fehler im Wiki?

von Benedikt K. (benedikt)


Lesenswert?

Thomas Linder wrote:

> Nun meine Frage: Rechnet der Präprozessor da mit 12,520833 weiter,
> anstatt mit 12? Ist das ein Fehler im Wiki?

Nein, er rechnet mit 12, da er immer abrundet, bzw. von Anfang an ohne 
Komma rechnet.

von Thomas L. (tom)


Lesenswert?

Erstmal danke - noch eine kurze Frage: Rechnet der Präprozessor immer 
mit Integer Werten?

Mittlerweile: Fehler gefunden: Wird F_CPU NUR im Makefile definiert, so 
wirft er einen Fehler (ich schätz mal weil er F_CPU nicht richtig 
auflösen kann), sobald man F_CPU in der C Datei definiert, gehts (auch 
wenn dann eine Warning kommt von wegen zweiter Definition).

Bischen eigenartig ist das schon.

von Benedikt K. (benedikt)


Lesenswert?

Thomas Linder wrote:
> Erstmal danke - noch eine kurze Frage: Rechnet der Präprozessor immer
> mit Integer Werten?

Ja, solange man ihn nicht zu etwas anderem zwingt (explizit oder 
implizit).

von Karl H. (kbuchegg)


Lesenswert?

Thomas Linder wrote:
> Erstmal danke - noch eine kurze Frage: Rechnet der Präprozessor immer
> mit Integer Werten?

Wenn man es genau nimmt, dann rechnet der Präprozessor gar nicht.
Der Präprozessor macht Textersetzungen.

Erst der eigentliche Compiler stellt dann fest, dass in diesem
Ausdruck nur konstante Zahlenwerte vorkommen und dass er das
selber ausrechnen kann.

von spess53 (Gast)


Lesenswert?

Hi

>BAUD_ERROR wird -36,9 (Promille)
>was natürlich viel zu gross ist.

Im Datenblatt S.150 wird ein maximaler Fehler von ca.+/-4% und ein 
angestrebter Fehler von +/- 1,5% angegeben.

MfG Spess

von Thomas L. (tom)


Lesenswert?

@spess53:

Nunja, das sind aber auch die Extremwerte, auf Seite 159 wird alles mit 
einem Fehler unter 0,5 gesondert "markiert" und auch wenn dort steht 
dass auch größere Fehler noch akzeptiert werden, so würde ich doch 
möglichst nah am eigentlichen Wert bleiben wollen.
Du hast natürlich Recht damit, dass meine Aussage "Viel zu groß" ein 
Schas ist ;)

von spess53 (Gast)


Lesenswert?

Hi

Auf der von dir genannten Seite (und den nachfolgenden) sind die Fehler 
angegeben, die sich mit der entsprechenden Einstellung ergeben. Dabei 
sind 'akzeptable' Fehler fett und 'nicht akzeptable' Fehler in 
Normalschrift angegeben.
Noch etwas anderes: Bei 'Integer'-Berechnungen ist die Reihenfolge sehr 
entscheident: (x/y)*z <> (x*Z)/y.

MfG Spess

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.