www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kann der Präprozessor runden?


Autor: Randomize (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir meinen UBRR Wert per define erstellt:
#define UART0_BAUD_RATE   9600
#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
#define UART0_BAUD_RATE   9600
#define UBRR0_val        (uint16_t) ((float) (F_CPU / (UART0_BAUD_RATE * 16L) - 1 + 0.5)))
#define UBRR0_val        (uint16_t) ((double) (F_CPU / (UART0_BAUD_RATE * 16L) - 1 + 0.5)))
[...]
Hat jemand 'ne idee für mich?
Besten Dank,
Martin

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Versuchs mal a la:

#define UBBR_1200 (uint)((((20*F_CPU / (1200   << 4) ) +5 ) / 10) - 1)

MfG Tobi

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Randomize (Gast)

>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

F_CPU wird als Integer in der Einheit Hz angegeben!

#define F_CPU 3686400L

MfG
Falk

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code gilt nur, wenn U2X gesetzt ist!

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber prinzipiell rundet man Ganzzahlig: (achte aber auf die 
Wertebereiche!)
(10*x + 5) / 10

Autor: Randomize (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im übrigen hat die "Rundungsproblematik" nichts mit dem Präprozessor zu 
tun. Zumindest nicht, dass ich wüsste ;)

Autor: Falk Brunner (falk)
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich hab ich jetzt die -1 vergessen..

Autor: Falk Brunner (falk)
Datum:

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

Autor: Emperor_L0ser (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der gute Falk macht doch in letzter Zeit gerne mal "immer" und 
"100%"-Aussagen, sind meist mit Vorsicht zu geniessen :-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber für die Berechnung von UBBR wird das komplizierter. So vielleicht?

#define UBRR ((F_CPU + (8*BAUD)) / (16 * BAUD ) -1)

Aber das entbindet den Programmierer noch nicht von der Prüfung des 
Frequenzfehlers! Vielleicht ein Makro?

MfG
Falk

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.