Hallo,

ich möchte gerne mit meinem Programm bei einer fallenden Flanke an Port D.2 ein Interrupt Routine auslösen, die mir dann einen bestimmten Wert auf die Serielle Schnittstelle schickt. Es passiert aber oft, dass die Interrupt Routine 2 bzw 3 mal ausgelöst wird und daher bei einer fallenden Flanke mehrere Werte auf die Serielle Schnittstelle geschickt werden. Mit einem delay hätte ich auch auf Prellen geprüft....

Mein Programmcode:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <stdio.h>

#ifndef F_CPU
#define F_CPU 3686400
#endif

#define BAUDRATE 9600

int usart_putch(char x);
int usart_getch(void);

SIGNAL(SIG_INTERRUPT0)
{
	_delay_ms(50);
		
	if(!(PIND & (1<<PD2)))
	{
		printf("1");
	}
}


int main(void)
{

	// USART-Init
	UBRRH=((F_CPU/(16L*BAUDRATE)-1)>>8);
	UBRRL=F_CPU/(16L*BAUDRATE)-1;
 	UCSRB = (1<<RXEN)|(1<<TXEN); //RX & TX aktivieren
	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8N1
	
	//Interrup-Init
	GICR |= 0b11000000;
	MCUCR &= 0b11111010;
	MCUCR |= (1<<ISC01);
	
	PORTD=0xFF;
	
	fdevopen(usart_putch, usart_getch, 0);
	
	sei();
	
	while(1)
	{
		
		
	}
}

int usart_putch(char x)
{
    while(!(UCSRA & (1<<UDRE)));
	UDR = x;
	return(0);
}

int usart_getch(void)
{
	while(!(UCSRA & (1<<RXC)));
	return(UDR);
}
danke im voraus

jetzi