Hallo zusammen, habe in einem Programm mehrere globale Variablen benutzt, wie ich es auch schon öfter getan habe. Nur in meinem aktuellen Code scheinen die globalen Variablen nicht global zu sein. Um den Fehler zu beschreiben, habe ich das Problem auf ein Simples reduziert: ... unsigned char state = 8; SIGNAL(SIG_OVERFLOW0) { state++; } void main (void) { DDRD = 60; PORTD = 255; TCCR0=4; TIMSK=2; sei(); while (1) { PORTD=(state*4); } } Der Timer erhöht bei jedem Überlauf die globale Variable "state" um eins. Im Hauptprogramm solle doch nun in jedem Schleifendurchlauf der aktuelle Zustand auf PORTD ausgegeben werden. Oder sehe ich das falsch? Dachte erst mein "while(1)" würde wegoptimiert, aber daran liegt es nicht. Schreib ich "PORTD=(state*4)" mit in die Timer-ISR rein, läuft alles wie erwartet. Warum hat meine Variable "state" in der ISR und im Hauptprogramm verschiedene Werte? Bin am Verzweifeln. Hab das Problem ja jetzt schon auf ein simples Programm reproduzieren können, versteh es aber nicht. Wenn ich den erstellten ASM-Code richtig interpretiere, sieht der Compiler die Variable "State" in der ISR völlig unabhängig. Im Anhang nochmal die .c und die Compilerlistings. Danke schonmal für Eure Hilfe. Gruß Thomas
> unsigned char state = 8; Hier > while (1) { > PORTD=(state*4); } hat der Compiler (Optimierer) keine Ahnung, daß "state" anderswo geändert wird. Und deswegen wird er die ganze Schleife leer lassen und vorher genau einmal "PORTD=32" ausführen. Um ihm das zu sagen, sollte "state" als "volatile" deklariert werden. Gruß, Falk
Hallo Falk, danke, jetzt funktioniert alles. Gruß Thomas PS: An manchen Tagen steht man echt auf dem Schlauch.
> PS: An manchen Tagen steht man echt auf dem Schlauch. Dann solltest du's vielleicht mal mit der FAQ probieren: http://www.nongnu.org/avr-libc/user-manual/FAQ.html `volatile' ist nicht umsonst der Eintrag #1.
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.