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
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(); }
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
Tatsächlich! Vielen Dank.
Seltsam ist es trotzdem. Ich dachte, das SIGNAL-Makro wäre ausgemustert?!
0rbit
Welche AVR-GCC-Version? ISR statt SIGNAL gilt nur in den neuesten Fassungen. Zu erkennen daran, dass dann bei SIGNAL darauf hingewiesen wird...
Die GCC-Version siehst du mit
avr-gcc --version
Mehr findest du hier.
Disclaimer: none. Sue me.
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.
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
Lesezeichen