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