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
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