Forum: Mikrocontroller und Digitale Elektronik #define - Overflow


von Jan H. (janiiix3)


Lesenswert?

Moin.

Kann ich das #define auf
1
 uint16_t
 casten?
1
#define BAUD(BAUD_)  (((F_CPU/(16*BAUD_)))-1)

Ist ja ganz klar das er überläuft.

von Ingo L. (corrtexx)


Lesenswert?

Jan H. schrieb:
> Kann ich das #define auf
Was genau hindert dich jetzt es auszuprobieren? Im Simulator z.B..

von Einer K. (Gast)


Lesenswert?

Interessante Frage!
(denn ich habe KA, was du meinst)

Jan H. schrieb:
> Kann ich das #define auf uint16_t  casten?
Soweit mir bekannt, kann man keine Defines casten.
Habe auch gar keine Vorstellung, wie man das bewerkstelligen könnte.

von Nop (Gast)


Lesenswert?

Jan H. schrieb:

> Ist ja ganz klar das er überläuft.

Dann kannst Du das casten, aber wenn die Baudrate mehr als 65536 ist, 
kommt eben was Verkehrtes dabei heraus.

von Nop (Gast)


Lesenswert?

Arduino F. schrieb:

> Soweit mir bekannt, kann man keine Defines casten.
> Habe auch gar keine Vorstellung, wie man das bewerkstelligen könnte.
1
#define MYDEFINE 42
2
...
3
a = (uint16_t) MY_DEFINE;

von Ingo L. (corrtexx)


Lesenswert?

Die Frage ist, was will er casten? Grundsätzlich werden solche #defines 
immer als int benutzt. Ein cast auf long wäre sinniger. Das erreichst du 
indem du BAUD_ auf long castest:
1
#define BAUD_ 115200ul

von Jan H. (janiiix3)


Lesenswert?

Ingo L. schrieb:
> Die Frage ist, was will er casten? Grundsätzlich werden solche #defines
> immer als int benutzt. Ein cast auf long wäre sinniger. Das erreichst du
> indem du BAUD_ auf long castest:
>
1
> #define BAUD_ 115200ul
2
>
1
#define BAUD(BAUD_)  (((F_CPU/(16UL*BAUD_)))-1UL)

Klappt.

von pointerisnotanarray (Gast)


Lesenswert?

casten ist cool. Das sollte unbedingt immer gemacht werden. Ob sinnvoll 
oder nicht, egal. Ein Programm ohne cast taucht nisch und statische 
Code-Analyse eh schei...

> Kann ich ...
> Ist ja ganz klar ...
=> ???

von Ingo L. (corrtexx)


Lesenswert?

Jan H. schrieb:
> Klappt.
Kann es sein das du so etwas suchst?
1
#define BAUDRATE 115200ul
2
#define BAUD_REGISTER_VALUE  ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1)
3
#define BAUD_REAL (F_CPU/(16*(BAUD_REGISTER_VALUE+1)))      // Reale Baudrate 
4
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUDRATE)         // Fehler in Promille, 1000 = kein Fehler.
5
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
6
  #error Baudratenfhler! Abweichung zu gross! 
7
#endif 
8
#if (BAUD_REGISTER_VALUE>255)
9
  #error Fehler bei Baudratenberechnung! 
10
#endif

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Ingo L. schrieb:
> Jan H. schrieb:
>> Klappt.
> Kann es sein das du so etwas suchst?
...Code...

Warum selber machen, wenn es in der Toolchain genau so etwas schon gibt?
Siehe 
http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html

Nebenbei hat doch das UBRR (zumindest auf neueren AVRs) 12 Bit, wodurch 
die Abfrage auf >255 falsch erscheint.

Mit freundlichen Grüßen,
N.G.

von Ingo L. (corrtexx)


Lesenswert?

N. G. schrieb:
> Warum selber machen, wenn es in der Toolchain genau so etwas schon gibt?
> Siehe
> http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html
>
> Nebenbei hat doch das UBRR (zumindest auf neueren AVRs) 12 Bit, wodurch
> die Abfrage auf >255 falsch erscheint.
Kannte ich noch nicht ;)

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.