- LiTime Speicher und Akkus         
Ergebnis 1 bis 2 von 2

Thema: Probleme mit externen Interrupt

  1. #1
    Neuer Benutzer
    Registriert seit
    30.12.2004
    Ort
    Lambrechten
    Beiträge
    2

    Probleme mit externen Interrupt

    Anzeige

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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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...
    Code:
    static char volatile flanke;
    
    SIGNAL(SIG_INTERRUPT0)
    {
       flanke = 1;
    }
    
    ....
       while (1) // main loop
       {
          flanke = 0;
          while (!flanke)
             ;
    
          mach was
       } // main loop
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus