bei jedem sprung in eine ISR oder SUB wird die rücksprungadresse (also da, wo das proggi grade war, als gesprungen wurde) auf den stack gepushed. mit RET(I) wird dieser wert wieder vom stack geholt und zurückgesprungen. wird immer weiter gesprungen ohne rücksprung, werden immer neue werte auf den stack geschoben, aber nicht mehr abgeholt. das ergebnis ist, dass auf dem stack früher oder später kein platz mehr ist, und dadurch schlussendlich dein programm abkackt.

deshalb hinter jeden ISR-einsprung ein reti und hinter jedes rcall ein ret (so heissen die befehle in asm, aber das prinzip ist in basic sicher dasselbe).

denke das stimmt so, wenn ich mich irre, tut mich bitte korrigieren.