Gast
#857950
Hallo zusammen.
In einer ISR wird ein Inkrementalgeber abgefragt.
Die globale Variable icount wird in der ISR entsprechend
der Drehrichtung und der Impulsanzahl herauf- oder heruntergezählt.
Das Hauptprogramm wertet die Variable aus und soll auch die
maximalen Werte begrenzen.
Hier die entsprechenden Ausschnitte aus dem Programm:
volatile char icount;
int main(void)
{
.
if(icount > 4) icount = 1;
if(icount < 0) icount = 4; ## warning ##
.
}
ISR(TIMER0_OVF_vect)
{
.
if…
icount++;
else
icount—-;
.
}
Verblüffend für mich ist die Warnung, die der Compiler für die
mit ## markierte Zeile ausgibt.
warning: comparison is always false due to limited range of data type
Der erzeugte ASM-Code für die Zeile ist Schwachsinn.
Eine char Variable kann doch auch negativ werden. oder?
Werden mit volatile deklarierte Variablen immer als unsigned verstanden?
Ich habe das Problem dadurch gelöst, dass ich icount jetzt immer mit
einem Offset laufen lasse, sodass er nicht unter Null kommen kann.
Das Programm läuft damit gut.