Hallo geehrte Freunde der "C"-Sprache!

Nun habe ich etwas weiter gemacht.Ich bin auf Timer umgestiegen!
Soweit funktioniert es auch grundsätzlich!Ein Problem habe ich aber...
Ich schaffe es nicht zuverlässig den Taster abzufragen..
Nun habe ich schon in fast jede zweite Code-Zeile die Abfrage reingepackt...kein erfolg..Es funktioniert einfach unzuverlässig.
Prinzip ist schnell erklärt:Es wird immer die Funktion schalten_ohne(); ausgeführt.bis der Taster PB3 gedrückt wird!dann soll in der nächsten Rot-Phase für Autos, grün für Fußgänger angehen.

Was mache ich falsch?muss ich tatsächlich auf interrupt für Taster ausweichen(wie in der ersten Version vom Code)?Gibt es vlt doch eine andere Lösung?

Code:
/*
 * Ampel_mit_Timer.c
 *
 * Created: 10.08.2013 10:05:38
 *  Author: Gerrus
 */ 

#define F_CPU 4000000UL //Takt auf 4Mhz festlegen





#include <avr/io.h>
#include <avr/interrupt.h> //Include fürs INterrupt

// eigene Bezeichnungen
#define		rot		PC0
#define		gelb	PC1
#define		gruen	PC2
#define		rotf	PC4
#define		gruenf	PC5
#define		ein		1
#define		aus		0

volatile  int sec,igr;
void rotf_schalten(unsigned int i)
{
	if (i==ein){PORTC	 |= (1 << rotf);}   // Setzen
	else {PORTC &= ~(1 << rotf);}  // Rücksetzen
	
	
	
};
void gruenf_schalten(unsigned int i)
{
	if (i==ein){PORTC	 |= (1 << gruenf);}   // Setzen
	else {PORTC &= ~(1 << gruenf);}  // Rücksetzen
	
	
	
};
void rot_schalten(unsigned int i)
{
	if (i==ein){PORTC	 |= (1 << rot);}   // Setzen
	else {PORTC &= ~(1 << rot);}  // Rücksetzen
	
	
	
};
void gelb_schalten(unsigned int i)
{
	if (i==ein){PORTC	 |= (1 << gelb);}   // Setzen
	else {PORTC &= ~(1 << gelb);}  // Rücksetzen
	
	
	
};
void gruen_schalten(unsigned int i)
{
	if (i==ein){PORTC	 |= (1 << gruen);}   // Setzen
	else {PORTC &= ~(1 << gruen);}  // Rücksetzen
	//_delay_ms(1000);
	
	
};
void schalten_ohne (void)
{
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
	}
	if (igr==0)
	{
		rot_schalten(ein);
		
	}
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
	}
	if (igr==76)
	{
		gelb_schalten(ein);
	}
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
	}
	if (igr==107)
	{
		rot_schalten(aus);
		gelb_schalten(aus);
		gruen_schalten(ein);
	}
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
	}
	if (igr==183)
	{
		gruen_schalten(aus);
		gelb_schalten(ein);
	}
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
	}
	if (igr==213)
	{
		gelb_schalten(aus);
		igr=0;
	}
	
}
void schalten_mit (void)
{
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
		
	}
	
	if (igr==0)
	{
		rot_schalten(ein);
		rotf_schalten(ein);
	}
	if (igr==15)
	{
		rotf_schalten(aus);
		gruenf_schalten(ein);
	}
	if (igr==61)
	{
		gruenf_schalten(aus);
		rotf_schalten(ein);
	}
	if (igr==76)
	{
		gelb_schalten(ein);
	}
	if (igr==107)
	{
		rot_schalten(aus);
		gelb_schalten(aus);
		gruen_schalten(ein);
	}
	if (igr==183)
	{
		gruen_schalten(aus);
		gelb_schalten(ein);
	}
	if (igr==213)
	{
		rotf_schalten(aus);
		gelb_schalten(aus);
		igr=0;
		sec=0;
	}

	
}




ISR (TIMER0_OVF_vect)					// Die Funktion die beim Overflow aufgerufen wird
{
	
	 igr ++;
	if (!(PIND &(1<<PD3)))
	{
		sec=1;
	}
}






int main(void)
{
	//PORT C als Ausgang
	PORTC	=	0x00;
	DDRC	=	0xFF;
	
	//PORT D als Eingang
	
	DDRD	=	0<<PD3;
	PORTD	=	1<<PD3;
	
	
	
	TCCR0 |= (1<<CS02)|(1<<CS00);	//Einstellen Von Preteiler 1/1024. Datasheet Seite 85
	TIMSK |= (1<<TOIE0);			//Interrupt auslösen beim Overflow Datasheet Seite 85
	TCNT0 = 0;						//den timer selber reseten.Eine Null reinschreiben
	sei();							//Interruos aktivieren
	
	
	while(1)
    {	
		if (!(PIND &(1<<PD3)))
	    {
		    sec=1;
	    }
		if (sec==0)
		{
			schalten_ohne();		//Ampelschaltung ohne fussgaenger
			
		}
		if (!(PIND &(1<<PD3)))
		{
			sec=1;
		}
		if (sec==1)
		{
			schalten_mit();			//Ampelschaltung mit fussgaenger
		}
		
		

	}
}
P.S: Bin über jede Art von Tips dankbar!!Vlt verfolge ich komplett verkehrten weg?vlt geht es einfacher,stabiler,besser?

Vielen Dank!