Zitat Zitat von ManniMammut
sound_on ist aber doch nur einmal, nämlich global, definiert?!
Ooops, stimmt, da hab ich was falsch gelesen.

Zitat Zitat von ManniMammut
Ich dachte globale Variablen kann ich überall (also egal aus welcher Funktion) ändern und die Variable nimmt dann in allen Funktionen diesen Wert an?

Wenn ich jetzt Müll geredet habe, bin ich in meinen Grundfesten der C-Prorammierung erschüttert.
Jein. Wenn du zum Beispiel hinschreibst (a global)

a = 0;
if (0 == a)
{
}

Dann wird ein (optimierender) Compiler das if immer ausführen, wenn er weiß, daß er a auf 0 gesetzt hat. Damit ist für ihn die Bedingung immer erfüllt! Wenn zB zwischen der Zuweisung und dem if eine IRQ auftritt, in der a verändert wird, hat der Compiler keine Möglichkeit, das zu wissen.
Daher definiert man a als volatile.
int volatile a;
und sagt damit, daß a flüchtig ist, sich also ohne Zutun des Compilers (er weiß ja nicht wann eine IRQ zuschlagen könnte oder ob die Hardware evtl a ändert) ändern kann.

Das volatile hat die Konsequenz, daß jedes mal, wenn auf a zugegriffen wird, dieses auch wirklich geschrieben oder gelesen wird. Damit wird die 0 in a gespeichert und danach a wieder gelesen.

Und alles wird gut...