Code:
#define F_CPU 8000000L                  // Systemtakt in Hz
 
#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
 
volatile uint8_t takt;   

ISR(TIMER0_OVF_vect){
takt++;
}

int main(void) {
     
DDRD  &= (~ (1<<PD2));  /* Pin D2 als Eingang */
PORTD |= (1<<PD2);    /* Pull Up von PIN D2 aktivieren */ 
DDRD=(1<<PD3);// PortD3 wird Ausgang
 
TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en

sei();
for(;;){
if (!( PIND & (1<<PIND2))) {    /* mache was wenn PinD2 low ist */
             // Hier: der Getriebemotor an L293D soll mit 50% laufen 
	if(takt>=10){ //Takt bis 10 zählen
		takt=0;
		PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
	}

}
	else{
	PORTD|=(1<<PD3); // Motor läuft mit 100%
	}
}
}
Diese Code läuft zumindest im Simulator. takt gehört natürlich auf 0 gestellt.
Wenn man die Endlosschleife mit for(;; ){ beginnt, dann braucht man kein return0.