Hallo,
ich sitze jetzt schon seit gut 2 Tagen vor meinem Programm und finde einfach nicht den Fehler.

Ich wollte im Grunde nur eine billige StopUhr machen, sprich ein Port soll eine gewisse Zeit 5V führen und wenn die Zeit abgelaufen ist soll der Port auf 0V wechseln.

Mein Problem konnte ich jetzt schon auf die Interrupt rutine eingrenzen.
Momentan verhält sich sich sobald ich mehr als 4 Zeilen Code in ihr stehen habe nicht mehr so wie ich es will.

Gibt es vielleicht dinge die man beachten muss wenn man eine Interrupt Rutine schreibt?

Code:
.INCLUDE "m32def.inc"

; Registerdefinition
; Zählregister
.DEF SekX4 = R20        ; Register in dem die 250ms * 240 = 60s gespeichert werden (1s/250ms = 4)
.DEF Min = R21          ; Register in dem die Minuten gespeichert werden
.DEF Stunden = R22      ; Register in dem die Stunden gespeichert werden
.DEF temp = R25

; Konstantenregister
.DEF CSekX4 = R1        ; Register in dem die Konstante 250ms * 240 = 60sgespeichert ist (240)
.DEF CMin = R2          ; Register in dem die Konstante Minuten gespeichert ist (60)
.DEF CStunden = R3      ; Register in dem die Konstante Stunden gespeichert ist (24)
.DEF CTimer = R4        ; Register in dem die Konstante zum Vorladen des Timers gespeichert ist (10)
.DEF Config = R5        ; Reagister zeigt ob die Config schon mal asugeführt wurde

.DEF CompareMIN = R23   ; Vergleichsregister für die Sekunden
.DEF CompareSEC = R24   ; Vergleichsregister für die Minuten
; ... Erweiterung möglich

; Schreibregister für alle Einstellungen
.DEF Port = R16         ; Register für Port zugriffe
.DEF Inter = R17        ; Register für Interrupt zugriffe
.DEF Timer = R18        ; Register für Zeitintervall
.DEF SleepM = R19       ; Register für SleepModiekonfiguration

;Konstenatendefinition
.EQU CFaktor = 4        ; Faktor für die Multiplikation der Sekunden (1s/250ms = 4)
.EQU Initialisiert = 0  ; Bit das Zeigt ob Initialisiert wurde

.EQU LED = 3            ; LED Portbit 3 für 5V Output
.EQU Relai = 2          ; Realai Portbit 2 für 5V Output
.EQU INLang = 0         ; Eingang für 15min Laufzeit
.EQU INKurz = 1         ; Eingang für 1 min Laufzeit

; Lange Laufzeit
.EQU Langmin = 1        ; Laufzeit für die min. (15min)
.EQU Langsec = 0*CFaktor; Laufzeit für die sec. (0sec)
; ... Erweiterung möglich

; Kurze Laufzeit
.EQU Kurzmin = 0        ; Laufzeit für die min. (1min)
.EQU Kurzsec = 10*CFaktor; Laufzeit für die sec. (0sec)
; ... Erweiterung möglich



.ORG 0x000
    rjmp main               ; Reset Handler

.ORG OVF2addr
    rjmp ovf2_handler       ; Overflow Timer/Counter 2 Handler



;**************************************Interrupt-Handel-BEGINN**********************************************
ovf2_handler:               ; Interrupt Handler für TimerOverflow

;#####################################################################################################

                            ; Zeitzähler bei Jedem Interrupt

    inc SekX4               ; Sekunde wird erhöt, da alle 250ms erhöt wird wird bis 240 gezählt
    cp SekX4,CSekX4         ; Prüfen ob 60Sekunden um sind (1s/250ms = 4*60 = 240), wenn ja zur Erhöhung der
    brne fertig

 min:
    clr SekX4               ; SekundenZähler wieder auf Null setzen wenn eine Minute um ist
    inc Min                 ; Minuten wird erhöht wenn 60sec vorbei sind
    cp Min, CMin            ; Prüfen ob 60Minuten um sind, wenn ja zur Erhöhung der
    brne fertig

    clr Min                 ; MinutenZähler wieder auf Null setzen wenn eine Stunde um ist

    sbis PINA, Relai
    sbi PORTA, Relai          ; LED anschalten

    sbic PINA, Relai
    cbi PORTA, Relai        ; Relai anschalten

; ... Erweiterung möglich

 fertig:

                            ; ... Erweiterung möglich
    cpse Min, CompareMin    ; Minuten übereinstimmen
    rjmp zeit_zaehler_ende

    cpse SekX4, Comparesec  ; Sekunden übereinstimmen
    rjmp zeit_zaehler_ende


; Prozedur zum Ausschalten des AVR etc.
 ende:
    clr TIMER
    ldi TIMER, (0<<TOIE2)   ; Interrupt ausschalten
    out TIMSK, TIMER        ; Timer/Counter 2 Overflow Onterrupt aktivated

    ldi SleepM,(1<<SE)|(1<<SM1)  ; erste 1 für SE, Power-Down Sleep Modus eingeschalten (010)
    out MCUCR, SleepM       ; Sleep eingstellen
    Sleep                   ; Sleep Modus Power-Down (010)

 zeit_zaehler_ende:          ; Sprungziehl für das Ende des ZeitzählerUnterprogramm

    ldi temp, 12
    out TCNT2, temp       ; Timer/Counter 2 mit 12 vorladen (255-243 = 12 <aufgerundet wegen befehlslaufzeiten)

;#####################################################################################################


    reti




;****************************************************Macros***************************************************
.MACRO CompareSetzen        ; Start macro definition
    ldi CompareMIN, @1      ; Vergleichsminuten mit der LangenZeit laden
    ldi CompareSEC, @0      ; Vergleichssekundenmit der LangenZeit laden
    rjmp Compare_gesetzt       ; zurück zu main
.ENDMACRO                       ; End macro definition



;*************************************************Hauptprogramm***********************************************
.CSEG
main:

 Config:
; Konstantendefinition Register
    ldi temp, 240           ; CSekX4    Konstante 250ms * 240 = 60s (Sekunden) (240)
    mov CSekX4,temp
    
    ldi temp, 60            ; CMin      Minuten (60)
    mov CMin,temp
    
    ldi temp, 24            ; CStunden  Stunden (24)
    mov CStunden,temp

    ldi temp, 12            ; CTimer    Konstante zum vorladen des Timer gespeichert ist (255-243 = 11)
    mov CTimer,temp

; Interruptdifinition
    sei                     ; Interrupts global aktivieren

; Ports initialisieren
    clr PORT
    ldi PORT, 0b00001100    ; Port A bis auf Bit3 und Bit4 alles Eingänge
    out DDRA, PORT          ; Richtungsregister DDRA als Ausgang konfigurieren
    sbi PORTA, LED          ; LED anschalten
    sbi PORTA, Relai        ; Relai anschalten

    sbis PINA, INKurz       ; Prüfen Ob Kurz oder Lange Laufzeit
    rjmp lang

    CompareSetzen KurzSec,KurzMin  ; Compare werte auf Kurz setzten
 lang:
    CompareSetzen LangSec,LangMin  ; Compare werte auf Lang setzten

 Compare_gesetzt:

; SleepModus initialisieren (Idle)
    ldi SleepM,(1<<SE)      ; Sleep ModusAktivieren, |(0<<SM2)|(0<<SM1)|(0<<SM0) 000 ist der Idle Sleep Modus
    out MCUCR, SleepM       ; Sleep eingstellen


; Timer/Counter 2 initialisieren
    clr TIMER
    ldi TIMER, (1<<TOIE2)   ;|(1<<OCIE2) < für Compare Interrupt
    out TIMSK, TIMER        ; Timer/Counter 2 Overflow Onterrupt aktivated

    clr TIMER
    ldi TIMER, (1<<CS22)|(1<<CS21)|(1<<CS20)    ; noPWM, OCR2 update Normal + off, vorfaktor 1024
    out TCCR2, TIMER        ; Port Timer/Counter 2 mit Funktionen laden, Timer wird gestartet

    out TCNT2, CTimer       ; Timer/Counter 2 mit 12 vorladen (255-245 = 12 <aufgerundet wegen befehlslaufzeiten)

    ldi temp, (1<<initialisiert)
    mov Config, temp        ; Config bereits ausgeführt !!!

    rjmp back

 back:
    Sleep
wäre echt superdankbar wenn sich mal jemand das Programm anschaut.

Es soll erstmal auf einem ATMega 32, mit Batterie, laufen mit (hoffentlich) 1MHz internen Takt.

Das Problem sollte nach meinem Debuggen im bereich der "##" linien zu finden sein.

Bitte um Hilfe ....

Thx