Hallo,
wer kann mir sagen warum mein kleines Testprogramm mit der auskommentierten Zeile 53 statt Zeile 54 anders Läuft. (Zeile mit --> <-- markiert)

Was ich eigentlich erreichen wollte:
5 Mal blinken dann in Power Down Sleep Mode gehen. Aufwecken durch Tastendruck/externen Interrupt und alles wieder von vorne.

Irgendwie macht der externe Interrupt nie so genau was ich eigentlich will.

So hier der Code:
Code:
#include <avr/io.h>  
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <stdint.h>

#define TIMER1_END_VALUE 1
#define TIME_TILL_SLEEP 5

uint8_t volatile sleep_count;

ISR(TIMER1_COMPA_vect);
void init(void);

int main(void)
{
	init();
	sei();
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);		//Sleep Mode setzen

 	while (1) 
	{
		if(sleep_count == TIME_TILL_SLEEP)
		{
			sleep_count = 0;
			sleep_mode();				//einschlafen
		}
	}

   	return 0;               
}

ISR(TIMER1_COMPA_vect)
{
	static uint16_t run_led_active_count = 0;
	
	run_led_active_count++;
	if(run_led_active_count == 900)
	{	
		PORTD = (1<<PIND3);
	}
	if(run_led_active_count >= 1000)
	{
		run_led_active_count = 0;
		sleep_count++;
		PORTD = 0x00;
	}
}

ISR(PCINT_vect)
{	
	//Interrupt Mask Register setzen für externen Interrupt

//-->	GIMSK |= ~(1 << PCIE);				<--
	GIMSK = 0x00;

	GIMSK |= (1 << PCIE);
	PORTD ^= (1 << PD0);
}

void init()
{
	//Datenrichtung für die Ausgänge
	DDRD = (1 << DDD0) | (1 << DDD1) | (1 << DDD2) | (1 << DDD3) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6);
	DDRB = (1 << DDB0);

	//Setup Timer 1
	OCR1A = TIMER1_END_VALUE;			//Compare Value
	TCCR1B = (1<<WGM12);				//CTC Mode
	TIMSK |= (1<<OCIE1A);				//Output Compare A Match Interrupt Enable
	TCCR1B |= (1<<CS12) | (1<<CS10);		//Timer1 aktivieren

	//setup external interrupts
	PCMSK |= (1 << PCINT2) | (1 << PCINT3) | (1 << PCINT4);
	GIMSK |= (1 << PCIE);
}