Ich habe gestern Abend die #if Zeile ohne weiteres prüfen rausgenommen. Und Sie gerade wieder reingemacht.
Code:
#define F_CPU 1475600 // im makefile definiert
#define Systemtakt 50
#define VorteilerTimer0 1024
#define LadewertTimer0 (256-((F_CPU/VorteilerTimer0)/(Systemtakt*2)))
#if (LadewertTimer0 == 112)
#warning "Alles klar!"
#endif
....
ISR (TIMER0_OVF_vect)
{
TCNT0 = LadewertTimer0;
...
Die Warnung wird tatsächlich ausgegeben! Als rechnet der Präprozessor bei der Vergleichoperation tatsächlich doch. Und vergleicht nicht nur die reine Textform.
@Stefan
Du hast mal in einem anderen Thread erklärt, wie man dem Ergebniss einer Präprozessorberechnung einen Variablentyp aufzwingen kann.
Code:
#define ocr_Wert ((F_CPU / (1024 * 2 * 50L)) - 1)
Du hast damals erklärt, des der Ausdruck (1024 * 2 * 50) als int16_t berechnet wird und dann nach uint32_t promotet wird, was zu einem falschen Ergebniss führt. (1024 * 2 * 50L) hingegen wird als int32_t berechnet und damit richtig.
Hilf mir mal bitte, damit ich das verstehe. F_CPU ist vom Typ int32_t, VorteilerTimer0 ist vom Typ int16_t, das Divisionsergebniss ist ebenfalls vom Typ int16_t. Soweit richtig? Systemtakt ist vom Typ int8_t, das dann folgende Divisonsergebnis ebenfalls int8_t. Und die Differenz dann auch int8_t und damit passend für das Register TCNT0. Habe ich dann richtig verstanden, dass auch für Zwischenergebnisse einer Präprozessorberechnung immer der kleinste benötigte Variablentyp verwendet wird?
Welches "Symbol" wird verwendet um eine int16_t bzw. eine unit16_t zu erzwingen? L bedeutet int32_t (long) und UL unit32_t (unsinged long), das hast Du schon mal erklärt. int8_t bzw. unit8_t zu erzwingen macht vermutlich keinen Sinn? Und sowas gibt es dann auch nicht?
Ich weiss, die Fragen sind rein akademisch. Wäre aber schön, wenn Du mich da aufklären könntest. Vielleicht hilft es noch jemand anderem.
Danke.
Viele Grüße
Bot-Builder
Lesezeichen