Hallo liebe Gemeinde,
ich hab ein kleines Problem mit einer Compilerwarnung. Folgender
Codeausschnitt (gekürzt) erzeugt eine Warnung, das Programm läuft auch
nicht korrekt.
1 | #define F_CPU 8000000L
|
2 |
|
3 | #define T_HALF_PERIOD3 2000 // us -> 4000us period = 250 Hz
|
4 | #define CNT_HALF_PERIOD (T_HALF_PERIOD3 * F_CPU / 4 / 1000000) // compiler warning and program malfunction
|
5 | #define CNT_1_US (F_CPU / 4 / 1000000)
|
6 |
|
7 | int t_gate, t_low=0, t_high;
|
8 |
|
9 | for(t_gate = 20*CNT_1_US; t_gate < 500*CNT_1_US; t_gate += 4*CNT_1_US) {
|
10 | t_low = CNT_HALF_PERIOD - 2*t_gate;
|
11 | GATE_ON;
|
12 | _delay_loop_2(20*CNT_1_US);
|
13 | ZEROCROSS_OFF;
|
14 | _delay_loop_2(t_gate);
|
15 | GATE_OFF;
|
16 | _delay_loop_2(t_low);
|
17 | GATE_ON;
|
18 | _delay_loop_2(t_gate);
|
19 | ZEROCROSS_ON;
|
20 | _delay_loop_2(20*CNT_1_US);
|
21 | GATE_OFF
|
22 | _delay_loop_2(t_high);
|
23 | }
|
Das AVR-Studio 4.18 mit avr gcc 2010???? gibt die Warnung
"warning: integer overflow in expression"
aus.
Das bezieht sich auf die Zeile(n)
t_low = CNT_HALF_PERIOD - 2*t_gate;
Warum? Wenn man die Zahlen durchrechnet, kommt 4000-2*t_gate raus, das
ist doch perfekt. Nur wenn man für CNT_HALF_PERIOD die einfache Zahl
4000 ins #define reinschreibt, kommt keine Warnung und das Programm
läuft korrekt. Erklärungen? Berechnet der Compiler den konstanten
Ausdruck nicht zur Compilezeit? Auch wenn man alle Konstanten mit der
Endung L versieht, geht es nicht. Ideen?