Hallo...

habe ein Problem mit meiner Interruptroutine.

An PD3 hatte ich zuvor einen Schalter gegen Masse. Diesen habe ich nun durch einen Taster ersetzt, was mir dann Probleme bereitete.

Vielleicht sollte ich schreiben, was ich machen wollte.

Drücke ich den Taster soll der Zustand 1 aktiviert werden. Drücke ich ihn nochmal, soll der Zustand 2 aktiviert werden.
Das läuft auch soweit recht gut.
Das Problem ist, dass der Taster prellt...die Zustände ändern sich. Habe bereits einen Kondensator und einen Wiederstand zur Entprellung eingelötet. Ist besser geworden, aber das Problem gibt es zwischen durch immer wieder.

Als der Schalter drin war, konnte ich den Zustand abfragen, entweder war er High oder Low, und dann eine simple Warteschleife (zur Entprellung) einbauen. Aber beim Taster geht das doch nicht so einfach (bzw. kriege ich es nicht hin), weil ja jedes mal mit dem Zustand Low geschaltet wird, und der Taster leider auch beim loslassen prellt.

Wie kann ich dieses Problem lösen? Bin über jeden Hinweis dankbar...

Ich füge eben auch mal den Code ein...

Code:
#include <avr/io.h> 
#include <avr/interrupt.h>
#include <avr/signal.h>


unsigned int status_taster=1;	// Status beim Eintritt in Interruptroutine

void Inter();					// Interrupt funktion

int main()
{
	DDRB = 0b11111111;			// PORTB als Ausgang definieren
	PORTB = 0b00011000;			// PORTB setzen
	
	DDRD = 0b11110110;			// PD0 und PD3 als Eingang definieren
	PORTD = 0b11111111;
	
	Inter();					
	
	for (;;)
	{}
	
}

void Inter()
{
	MCUCR = 0b00001000;			// Flanke definieren
	GIMSK = 0b10000000;			// Enable interrupt
	
	sei();						// Interrupt freigeben
}


SIGNAL(SIG_INTERRUPT1)			// Taster an PD3 löst Interrupt aus
{

	if(status_taster==1)
	{
	
			PORTB |= (1<<PB3);			/*Setzt PB3 HIGH...LED aus	\			*/	
			PORTB &= ~(1<<PB4); 		//Setzt PB4 LOW...LED an	 } Zustand 1
			PORTD |= (1<<PD5);			//Setzt PD5 HIGH			/

			status_taster=2;
	}
	
	else
	{
			PORTB &= ~(1<<PB3);		/*Setzt PB3 LOW...LED an	\			*/
			PORTB |= (1<<PB4); 		//Setzt PB4 HIGH...LED aus	 } Zustand 2
			PORTD &= ~(1<<PD5);		//Setzt PD5 LOW				/

			status_taster=1;
	}
	
	GIFR=0;
}
[-o<