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.
char kann, je nach Implementation, als signed oder unsigned char behandelt werden.
> volatile char icount; > > int main(void) > { > . > if(icount > 4) icount = 1; > if(icount < 0) icount = 4; ## warning ## > . > } > Eine char Variable kann doch auch negativ werden. oder? > Werden mit volatile deklarierte Variablen immer als unsigned verstanden? Also... char ist immer net so gut. Es hängt vom Compiler und dessen Optionen ab, ob ein "char" mit Vorzeichen ist oder eben nicht. Wenn du ein Byte zum Rechnen haben möchtest, verwende die Typen aus "stdint.h" (z.B. int8_t oder uint8_t, je nach dem). Wenn du ein Byte als Speicher für ein Zeichen (ASCII oder so) brauchst, dann, und nur dann, benutze ein "char". In dem Fall aber dann vorher wieder in einen Typ aus "stdint.h" casten, wenn gerechnet werden soll.
Möglicherweise hast du dem Compiler die Option -funsigned-char mitgegeben. Aber du gehst den ganzen Problemen aus dem Weg, wenn du es so machst wie Sven Pauli.
Wenn du ein char brauchst, das auf jeden Fall ein Vorzeichen hat, wäre es das einfachste und sicherste, dies dem Compiler auch zu sagen: volatile signed char icount;
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.