kann der Präprozessor runden?

Gast #621085
Lesenswert?
• ▲
▼
Hallo,

ich habe mir meinen UBRR Wert per define erstellt:
1
#define UART0_BAUD_RATE   9600
2
#define UBRR0_val        (F_CPU / (UART0_BAUD_RATE * 16L) - 1)
habe aber das problem, dass z.B. bei F_CPU = 3.68MHz durch integer 
abschneiden nur 22 rauskommt und nicht 23, wie es eigentlich sein 
sollte.
Versuche wie die folgenden verliefen leider ins Leere
1
#define UART0_BAUD_RATE   9600
2
#define UBRR0_val        (uint16_t) ((float) (F_CPU / (UART0_BAUD_RATE * 16L) - 1 + 0.5)))
3
#define UBRR0_val        (uint16_t) ((double) (F_CPU / (UART0_BAUD_RATE * 16L) - 1 + 0.5)))
4
[...]
Hat jemand 'ne idee für mich?
Besten Dank,
Martin
Gast #621105
Lesenswert?
• ▲
▼
Moin Tobi,
dank Dir für den tip, das sollte fast klappen, ich vermute, Du meinst 
statt der 20 eine 10. Auf die Idee hätt man ja auch noch mal kommen 
können...

@Falk, das ist mir klar, hab mich da etwas ungenau ausgedrückt, sonst 
wär ich aber auch nicht auf die Werte 22 bzw 23 gekommen
#621119
Lesenswert?
• ▲
▼
@ Randomize (Gast)

>dank Dir für den tip, das sollte fast klappen, ich vermute, Du meinst
>statt der 20 eine 10. Auf die Idee hätt man ja auch noch mal kommen
>können...

Das ist Quark. Alle Welt macht das erfolgreich so

#define F_CPU 3686400L
#define BAUD 1200
#define UBRR (F_CPU / (16 * BAUD) -1)

rechnet immer richtig. Was nicht heisst, dass mit jedem Quarz jede 
Baudrate möglich ist.
Wichtig ist dabei das L am Ende, damit der Compiler mit long statt mit 
int rechnet.

MFG
Falk
Gast #621131
Lesenswert?
• ▲
▼
Da wird aber nicht gerundet. Bei F_CPU von z.B. 8 MHz kommt 416 raus. 
Die 2/3 sind abgeschnitten. Gerundet wären es also 417! Das kann 
entscheidend sein, ob eine Übertragung funktioniert, oder nicht!
Allerdings hätte das hier schon funktionieren müssen.
#621365
Lesenswert?
• ▲
▼
@ Tobi (Gast)

>Da wird aber nicht gerundet. Bei F_CPU von z.B. 8 MHz kommt 416 raus.
>Die 2/3 sind abgeschnitten. Gerundet wären es also 417! Das kann
>entscheidend sein, ob eine Übertragung funktioniert, oder nicht!

Ja, aber dein Beispiel war mit ner Baudratenfrequenz!

>Allerdings hätte das hier schon funktionieren müssen.

MfG
Falk
Gast #621371
Lesenswert?
• ▲
▼
ganz unabhängig von präprozessor, wenn man bei ganzzahligen datentypen 
ein mathematisch richtiges runden erreichen will rechnet man einfach 
IMMER + 0,5

bsp:
 2,3 + 1,1 = 3,4 -> 3 als ganzzahl
  wenn man jetzt noch 0,5 aufrechnet: 3,4 + 0,5 = 3,9
  das wird immer noch zu 3 abgeschnitten, also weiterhin richtig

 2,3 + 1,3 = 3,6 -> 3 als ganzzahl
  wieder +0,5 -> 4,1, das wird zu 4 verkürzt und siehe da, richtig
  gerundet

mfg Emperor_L0ser

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.