PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts werden nicht angesprungen



orbi
05.06.2006, 18:05
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:


#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();
}

skillii
05.06.2006, 18:22
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

orbi
05.06.2006, 18:42
Tatsächlich! Vielen Dank.

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

0rbit

uwegw
05.06.2006, 19:23
Welche AVR-GCC-Version? ISR statt SIGNAL gilt nur in den neuesten Fassungen. Zu erkennen daran, dass dann bei SIGNAL darauf hingewiesen wird...

SprinterSB
05.06.2006, 23:21
Die GCC-Version siehst du mit

avr-gcc --version

Mehr findest du hier (https://www.roboternetz.de/wissen/index.php/Avr-gcc#Inkompatibilit.C3.A4t).

orbi
05.06.2006, 23:50
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.

johannuhrmann
10.06.2006, 14:16
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