Mir erschließt sich zwar leider immer noch nicht so genau, WAS der Controller denn nun letzten Endes tun soll - aber ich habe einen weiteres "No-Go" im Zusammenhang mit Interrupts entdeckt (das erste waren "Wait"-Befehle in der ISR):
Die ISR darf niemals mit einem Goto verlassen werden!
Und es ist auch schnell erklärt wieso:
Bei jedem Interrupt werden als allererstes eine Menge Register-Inhalte "gerettet", damit der Controller nach dem Abarbeiten der ISR an genau der gleichen Stelle weiterarbeiten kann, an der er unterbrochen wurde. Die Inhalte dieser Register werden in den sogenannten "Stack" (= "Haufen") geschrieben, für den ein Teil des Speichers reserviert ist. Wenn am Ende der ISR der Befehl Return kommt, werden alle Bytes aus dem Stack in die Register zurückgeschrieben - der Controller kann ganz normal weiterarbeiten, und Stack ist wieder frei für den nächsten Interrupt.
Wenn der Return-Befehl aber übersprungen wird (indem die ISR mit einem Goto verlassen wird), wächst der Stack bei jedem Interrupt an, und da er nur eine endliche Größe besitzt, läuft er irgendwann einmal über - und dann hängt der Controller fest.
Also: Die ISR Immer schön über Return verlassen!!
Allerdings erklärt das Dein Problem noch nicht, denn E ist ja zunächst mal 0, so dass dieses Goto gar nicht ausgeführt werden sollte.
Hast Du denn ordentliche PullUp-Widerstände an den Eingängen? Die Controller-eigenen sind ja nicht aktiviert...
Edit:
Außerdem ist es eine potenzielle Fehlerquelle, E durch Additionen und Subtraktionen auf 1 und 0 zu setzen. Wenn z.B. als erstes die ISR PWM2 abläuft, ist E = 0 - 1 = 255, und dann stimmt sowieso nichts mehr.
Schreib doch stattdessen ganz einfach E=0 oder E=1! Genauso einfach kannst Du die Variablen M, N, X und Y in der ISR PWM2 auf 0 setzen, ohne eine aufwendige Multiplikation zu machen!
Lesezeichen