-
        

Ergebnis 1 bis 7 von 7

Thema: Interrupts werden nicht angesprungen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2005
    Ort
    b. Stuttgart
    Alter
    30
    Beiträge
    5

    Interrupts werden nicht angesprungen

    Anzeige

    Das Programm soll PB1 bei Timer1-Capture oder INT1 toggeln.
    Die Interrupts werden jedoch nicht angesprungen.

    Im AVR Studio Debugger sehe ich, dass bei Interrupt lediglich ein Reset durchgeführt wird(die main-Funktion erneut durchlaufen wird).

    Ich komme nicht dahinter, woran es liegt.
    Weder das SIGNAL noch das ISR-Makro funktionieren.

    Hier der Code:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    
    volatile uint16_t timer_save; 
    
    int main()
    {
    	
    	
    	DDRB = 0 | _BV(1);
    	PORTB = 255; //Pullup&LED an
    	
    //	PORTB ^= _BV(1);	//toggle PB1
    //	TCCR1B ^= _BV(ICES1); //Flankenrichtung toggeln
    
    	TCCR1B |= _BV(ICNC1);			//Input Capture Noise Canceler an
    	TCCR1B |= _BV(CS11) |_BV(CS10); //CLCK-SRC = CLCK/64
    	TIMSK |= _BV(5);				//Timer Interrupt Capture enable
    	TCCR1B &= ~(_BV(ICES1));		//bei fallende Flanke
    
    	GICR |= _BV(7);	//INT1 an
    
    	MCUCR |= _BV(ISC11); //falling edge
    
    
    	SREG |= _BV(7);	//global interrupt enable
    	
    	while(1);
    }
    
    
    ISR(TIMER1_CAPT_vect)
    {
    	cli();
    
    	if(TCCR1B&_BV(ICES1))
    		{
    			TCCR1B &= ~(_BV(ICES1)); 	//Timer1-Capture an fallender Flanke
    		}
    	else 
    		{
    			TCCR1B |= _BV(ICES1);
    		}
    
    	PORTB ^= _BV(1);	//toggle PB1
    
    	timer_save= ICR1L; //LoByte  sichern
    
    	_delay_ms(10);	//debounce
    	sei();
    }
    
    
    SIGNAL(SIG_INTERRUPT1)
    {
    	cli();
    	
    	PORTB ^= _BV(1);	 //toggeln
    
    	sei();
    }

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2005
    Ort
    Obertraun
    Alter
    29
    Beiträge
    194
    Hallo,

    verwende doch statt dem ISR, SIGNAL und füge bei den Include-Dateien noch
    <avr/signal.h> dazu.

    So, hat es zumindest bei mir funktioniert!

    mfg skillii

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2005
    Ort
    b. Stuttgart
    Alter
    30
    Beiträge
    5
    Tatsächlich! Vielen Dank.

    Seltsam ist es trotzdem. Ich dachte, das SIGNAL-Makro wäre ausgemustert?!

    0rbit

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Welche AVR-GCC-Version? ISR statt SIGNAL gilt nur in den neuesten Fassungen. Zu erkennen daran, dass dann bei SIGNAL darauf hingewiesen wird...

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Die GCC-Version siehst du mit

    avr-gcc --version

    Mehr findest du hier.
    Disclaimer: none. Sue me.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2005
    Ort
    b. Stuttgart
    Alter
    30
    Beiträge
    5
    Ja, ihr hattet recht.

    Ich konnte mir nicht vorstellen das das WinAVR-Release 20050214(avr-gcc 3.4.3) schon veraltet wäre.

    Ist es aber scheinbar doch, mit dem neuen Release funktioniert es einwandfrei.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    11.02.2006
    Alter
    38
    Beiträge
    48
    Hallo,

    ich erlaube mir noch zwei kleine Anmerkungen zum Code:

    1. Den Code der ISRs brauchst Du nicht in cli() und sei() einschließen. Die AVR-Controller
    löschen beim Eintritt in eine ISR nämlich das Interrupt-Enable-Bit von selbst und setzen es am Ende wieder.

    2. Delays in ISRs sollte man vermeiden. Das Laufzeitverhalten, das sich daraus ergibt, ist kaum mehr nachvollziehbar.

    Grüße,

    Hans
    Eintragen und Roboternetz-User in der Nähe finden: http://www.frappr.com/roboternetz

Berechtigungen

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