Tim schrieb:
> DDRD &=~ (1<<PD2); //PD 2 Eingang (Taster)
>   PORTD = (1<<PD2); // Pullup ein
>   DDRD &=~ (1<<PD3); //PD 3 Eingang (Taster)
>   PORTD = (1<<PD3); // Pullup ein
Der ist ja wohl falsch, macht dir deimem PD2 pull up kaputt.
> if((PIND & (1<<PD3))==0)
>
>   {
>     _delay_ms(50);
>
>     if((PIND & (1<<PD3))==0)
>     {
>     PORTB |=(1<<PB7);
>     }
>     else
>     {
>       PORTB &=~(1<<PB7);
>     }
>   }
Lass die doppelte Abfrage und den Delay-Kram in diesem Fall weg. Du 
prüfst nur wenn der Tasteneingang gedrückt ist, ob er gleich danach 
immer noch gedrückt ist und schaltet nur in dem unwahrscheinlichen Fall 
daß er prellt und nicht mehr gedrückt ist, wieder aus.
>
>   if((PIND & (1<<PD2))==0)
>
>   {
>     _delay_ms(50);
>
>     if((PIND & (1<<PD2))==0)
>     {
>
>       PORTB ^=(1<<PB6);
>     }
>    while((PIND & (1<<PD2))==0);
>   }
Das ist Murks. Die while Schleife wartet bis der Taster losgelassen 
wird, aber er kann dabei genau so prellen wie beim runterdrücken.
Insgesamt ist die Form der Entprellung eher murksig. Du behandelst 
runterdrücken und loslassen unterschiedlich. Das ist physikalischer 
Unsinn. Ausserdem verbrätst du 10 mal mehr Programm als nötig.