Merkwürdige Compilerwarnung

#4736624
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren