Hi Volker...
Reset ist keine Interrupt-Routine. Der Reset-Vektor steht an Adresse 0
und wird nur beim Power-On-Reset, beim Reset per Reset-Pin, bei
Watchdog-Reset aufgerufen.
Nach der Reset-Routine "fällt" die Abarbeitung ins Hauptprogramm, das
ja als Endlos-Schleife aufgebaut ist (zwischen Main: und tjmp Main).
Deine ISR (Interrupt-Service-Routinen) werden von den stattfindenden
Hardware-Ereignissen (Timer-Überlauf, Pegelwechsel am Input) ausgelöst
und müssen durch 'reti' abgeschlossen werden (so wie du es in deinem
Programm gemacht hast).
Trotzdem haben deine ISR einen gravierenden Fehler: Du sicherst das
Statusregister (SREG) nicht! Daher kann der Programmablauf total
durcheinander kommen. Falls du noch ein unteres Register übrig hast,
dann deklariere es exclusiv als SREG-Kopie (heißt bei mir immer
'srsk') und füge zu Beginn jeder ISR den Befehl 'in srsk,sreg' ein
und vor jedem 'reti' 'out sreg,srsk'. Damit sicherst du das SREG
für dein Hauptprogramm, deine ISR kann also deinem Hauptprogramm nicht
mehr die Flags 'verbiegen'.
Bei größeren AVRs mit SRAM und wenn Registermangel herrscht, ist es
üblich, das SREG auf dem Stack zu sichern.
Dein ganzes Programm habe ich nicht analysiert, die Kommentare sind zu
verwirrend, sieht aus, wie wild zusammenkopiert... - Sorry...
Bit- & Bytebruch...
...HanneS...