PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit externen Interrupt



jetzi
23.11.2005, 20:07
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:

#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

SprinterSB
24.11.2005, 09:41
Das entprellt nicht. Wenn in deiner ISR ne Flanke auftaucht, wird das entsprechente IRQ-Flag gesetzt und du landest direkt nach Beenden der ISR wieder drin.

*räusper* und man sendet nichts von einer ISR aus oder wartet dort jahrelang rum...

static char volatile flanke;

SIGNAL(SIG_INTERRUPT0)
{
flanke = 1;
}

....
while (1) // main loop
{
flanke = 0;
while (!flanke)
;

mach was
} // main loop