Hallo Forengemeinde,
Ich habe da ein "Problem": Der unten stehende Code soll mir
selbstständig die Einstellparameter für den Timer berechnen bzw.
auswählen.
Das funktioniert an sich auch, aber leider auschschließlich dann, wenn
der Code im C-File steht, egal ob im Kopf oder in der main(). Platziere
ich ihn im Header-File, funktioniert die Fallunterscheidung nicht und es
wird immer der 1. Fall abgearbeitet.
Zwar kann ich mit diesem Umstand ohne weiteres leben, aber es wundert
mich doch, zumal die #define in allen Varianten im Header-File stehen
und machen, was sie sollen. Wo liegt also der (Denk-)Fehler?
PS: Ich verwende WinAVR-20071221
die Frage ist an welcher stelle PRESCALER_CALC definiert wird, die
header datei wir ja mit Import einfach in die C datei eingefügt - also
ist der Code ja zum schluss in der C-Datei. Damit kann es sich nicht
unterschiedlich verhalten.
Ich vermute du Definierst PRESCALER_CALC nach dem import.
Danke Peter, deine Vermutung war fast richig. #define TIMEBASE war im
Header-File unter die Fallunterscheidung gerutscht, war mir trotz
mehrfacher Kontrolle entgangen. Gemeinerweise wurde das auch beim
Kompilieren nicht bemerkt.
Übersetze mit -g3 -save-temps und schau ins Precompilat (.i oder .ii)
Dort siehst du, wann, wie und von wem (GCC-Builtin, cmd-Line, h-Datei,
...) welches Makro definiert wird.
Johann
>#define TIMEBASE war im>Header-File unter die Fallunterscheidung gerutscht,
was eigentlich völlig (l)egal ist. Wichtig ist nur, daß PRESCALER_CALC
an der richtigen Stelle definiert ist. Wenn das vor deinem
Codeausschnitt von oben nicht bekannt ist, gibt es eine Warnung, und es
wird der 2. Fall (PRESCALER_CALC <9) ausgeführt, aber niemals der erste.
Was du schreibst, passt irgendwie alles nicht.
Oliver
Zuerst einmal ein Dankeschön an alle!
@Sven P.: -Wall war durchgängig angeschaltet, hat aber trotzdem in dem
Fall nicht gewarnt.
@ Johann L.: Danke für den Tipp, werde ich mir merken!
@Oliver: Die Reihenfolge SOLLTE egal sein, ist es anscheinend aber bei
#if nicht. Ich habe dasselbe Phänomen auf einem anderen Rechner mit
anderem Betriebssystem und neuerem WINAVR 1:1 reproduziert. Während beim
normalen Compilieren keine Warnung erscheint, funktioniert die auf
deinen Rat hin geschriebene Definitionsabfrage hervorragend!
Ich habe den kompletten Code nun wieder in main.h ausgelagert:
1
// PRESCALER gewählter Vorteiler
2
// PRESCALER_MASK Bitmaske für CS20...CS00 in TCCR0B
Erik S. schrieb:
> @Sven P.: -Wall war durchgängig angeschaltet, hat aber trotzdem in dem> Fall nicht gewarnt.
-Wundef
foo.c:1:5: warning: "FOO" is not defined
> Also wird für TIMEBASE 0 eingesetzt und damit weitergerechnet. Nachdem> die #if-Sequenz abgearbeitet ist, ist TIMEBASE dann trotzdem der> richtige Wert.
Ja, so muss es auch sein.
>Also wird für TIMEBASE 0 eingesetzt und damit weitergerechnet. Nachdem>die #if-Sequenz abgearbeitet ist, ist TIMEBASE dann trotzdem der>richtige Wert.
Das ist zwar richtig, aber in diesem Fall egal.
Gerechnet wird mit TIMEBASE erst bei der Verwendung des Makros
OCR_PRESET, nicht bei dessen Definition, und da hat es dann den
richtigen Wert. Daher gibt es für TIMEBASE auch keine Warnung.
Probier die verschiedenen Varianten aus, und schau dir an, was der
Präprozessor draus macht.
Oliver
>Ein Makro innerhalb eines #if wird mit dem Wert bewertet, den er>zu dem Zeitpunkt besitzt, an dem das #if geparst wird.
Jaaa - aber davon rede ich doch die ganze Zeit:
TIMEBASE steht nicht innerhalb des #if.
Oliver