Naja, der Stack ist eine komplexe Sache. Erstens kann es passieren, dass der Pointer überläuft, also nicht mehr auf die letzte RAM-Adresse sondern zeigt, sondern plötzlich auf 0x00. Danach läuft dein AVR Amok.
Ausserdem kann es bei unachtsamer Benutzung von Routienen und ungünstigen Variablenadressen passieren, dass der Stack eine Variable überschreibt, oder umgekehrt.
Wenn bu bei Interupts komplexere Sachen machen musst, ist es vielleicht ratsam, wenn du die Variable, die du aus der ISR benutzen willst, in ein FIFO ablegst, und eine Control-Varibale einführst, woraus dein Program später weiss, dass da noch eine Variable ist, die noch nicht verarbeitet worden ist. Hoffentlich ist das verständlich, damit kannst du es vermeiden, das unkontrolliert Routienen aufgerufen werden, die normalerweise hintereinander laufen sollten.
Ablauf einmal kurz erklärt:
1. AVR ist in Routine #1, und arbeitet
2. ISR tritt auf, speichert neue Variable, und setzt eine Control-Variable
3. Routine #1 endet
4. Zurück in die Hauptrutine, die anhand der Control Varibale (oder noch besser Control-FIFO) entscheidet, welche Routine jetzt aufgerufen werden soll, und übergibt die Varibale, die von der ISR gespeichert worden ist, an diese weiter
5. AVR arbeitet in Rutine #2

Damit hast du ein kleines OS, was die Aufgaben verteilt. Das kann man dann noch vertiefen, indem man Prioritäten usw einstellt.

MfG

pongi