Das werde ich doch gleich mal testen. Mein debuging zeigt mir gerade dass meine Variable "detect" irgendwie nie den
Wert ändert ??? Warum auch immer. PA6 wird nämlich nicht aktiviert und das ist mehr als seltsam. Damit wird dann
auch kein cli() aufgerufen und das Phänomen wäre erklärbar, dass damit der Interrupt aktiv bleibt. Die ISR wird allerings
angesprochen. Die LED an PA0 ändert ihren Status. die While schleife wird auch erreicht. Schiebe ich die PA6 LED dort hin
leuchtet sie.

Code:
#define MCU  atmega32
#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <avr/sleep.h>
#include <avr/power.h>

int detect = 0;

int main(void){
   // Direction Registers
   DDRA = 0xff;            // LED Block A
   DDRC = 0xff;            // LED Block C
   
   DDRD &= ~(1 << PIND7);  // IR-LED to INPUT
   
   // Ports to LOW
   PORTA = 0x00;
   PORTC = 0x00;
   PORTD = 0x00;
   
   PORTD |= (1<<PD2);    // Pullup auf INT0 (PD2) an 
   GICR  |=(1<<INT0);    // INT0 bereitstellen
   MCUCR |=(2<<ISC00);   // INT0 für fallende Flanke einstellen
   sei();                // Interrupts aktivieren
   while(1){
      if (detect == 1){
         PORTA |= (1<<PA6);
         cli();               // Interrupts deaktivieren
      }
   }

   return 0;
}

// Interrupt INT0
ISR(INT0_vect){
   detect = 1;
   PORTA ^= 1<<PINA0; //die LED wird umgeschaltet
}
- - - Aktualisiert - - -

Ich habs geschafft, das ganze ist ein Compiler Bug sobald ich mit -Os übersetze ist es Buggy mit -O0 ist alles in Ordnung.

Da kann ich ja ewig suchen. Ich hab jetzt ein paar mal hin und her probiert und es lässt sich reproduzieren