Ich habe sowohl hardware-als auch software den taster versucht zuentprellen.daran liegt es nicht.

Das muss einfach an dem Programm liegen.
@Siro
ich habe versuch die "sec" umzubenennen und auch die Interrups vorrübergehend zuverbieten,kein erfolg.
Ich werde das Programm neu schreiben.Aber von hinten aufgerollt.Sprich:Erst "sec" setzen und dann immer weiteren Code zufügen.und diesmal will ich das hochzählen aus zwei variablen auslagern und diese auch im interrupt nullen.
ca so:
Code:
Interruptfunktion{
 i_ohne++; (wenn >=255-> i_ohne =0;)
i_mit++; (wenn i_mit >=255 -> i_mit =0;)
wenn taster PD3 dann sec=1;
}
main()
{
if sec=1 dann
switch(i_mit)

case 12:
case23:
usw
...
case 234: sec= 0;

if sec=0 dann

switch (i_ohne)
case 12:
case 23:
usw
der derzeitige Code sieht so aus:
Code:
/*
 * Ampel_mit_Timer.c
 *
 * Created: 10.08.2013 10:05:38
 *  Author: Gerrus
 */ 

//#define F_CPU 16000000UL //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 igr;
volatile unsigned m_sec;

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)
{
	while(1)
	{
		
	
	if (igr==0)
	{
		rot_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);
		rotf_schalten(aus);
	}
	
	if (igr==213)
	{
		gelb_schalten(aus);
		igr=0;
	}
	break;
	
	}
}
void schalten_mit (void)
{
	
	while (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)
	{
		m_sec=0;
		rotf_schalten(aus);
		gelb_schalten(aus);
		igr=0;
		
	}
	break;
	}
	
}




ISR (TIMER0_OVF_vect) // Die Funktion die beim Overflow aufgerufen wird
{
	int temp;
	temp=PIND;
	if ((temp &(1<<PD3)))
	{
		
		m_sec = 1; // setzen den Wert
		

		
	}
	 igr ++;
	
}






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)
    {	
		
		
		switch(m_sec)
		{
			
			case 0:
			schalten_ohne();
			break;
			
			case 1:
			schalten_mit();
			break;
			
		}

	}
}
und es funktioniert NUR wenn ich den Taster dauerhaft gedrückt halte.dann geht das.Los lasse,dann geht er wieder in Phase ohne Fussgänger-Ampel.wieder gedrückt halte,wieder mit Fussgänger.
Ich weiss nicht warum das Programm die variable "sec" immer wieder auf null setzt ,bevor die Funktion schalten_mit eintritt...

Ich melde mich,sobald ich das neue Programm fertig habe