1udo1
04.02.2009, 10:49
Hallo,
der Interrupt wird nicht ausgelöst, weil der Befehl sei(); das "I" Flag nicht setzt. In AVR Studio kann ich das verfolgen. Wenn ich aber
GICR |= (1<<INT0) | (1<<INT1);
deaktiviere, dann wird der Befehl sei(); ausgeführt. Ich muss doch sowohl die Bits INT0 und INT1 und das "I"-Flag setzen. Aber die stören sich gegenseitig. Warum?
Es wird der MEGA16 eingesetzt.
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 7372800UL
#include <util/delay.h>
ISR(TIMER0_OVF_vect)
{
PORTA=0xdd;
}
ISR(TIMER1_OVF_vect)
{
PORTA=0xaa;
}
void init(void)
{
TCCR1B = _BV(CS11);
GICR |= (1<<INT0) | (1<<INT1); // Interrupt Enable
DDRD &= ~( ( 1 << PIND2 ) | ( 1<<PIND3) ); //INT0 und INT1 Eingang
PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibieren
sei();
DDRA = 0xff;
}
int main(void)
{
uint8_t i = 0;
init();
for(;;)
{
for(i=0;i<255;i++)
{
PORTA = i;
_delay_ms(50);
}
for(i=255;i>0;i--)
{
PORTA = i;
_delay_ms(50);
}
}
return 0;
}
der Interrupt wird nicht ausgelöst, weil der Befehl sei(); das "I" Flag nicht setzt. In AVR Studio kann ich das verfolgen. Wenn ich aber
GICR |= (1<<INT0) | (1<<INT1);
deaktiviere, dann wird der Befehl sei(); ausgeführt. Ich muss doch sowohl die Bits INT0 und INT1 und das "I"-Flag setzen. Aber die stören sich gegenseitig. Warum?
Es wird der MEGA16 eingesetzt.
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 7372800UL
#include <util/delay.h>
ISR(TIMER0_OVF_vect)
{
PORTA=0xdd;
}
ISR(TIMER1_OVF_vect)
{
PORTA=0xaa;
}
void init(void)
{
TCCR1B = _BV(CS11);
GICR |= (1<<INT0) | (1<<INT1); // Interrupt Enable
DDRD &= ~( ( 1 << PIND2 ) | ( 1<<PIND3) ); //INT0 und INT1 Eingang
PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibieren
sei();
DDRA = 0xff;
}
int main(void)
{
uint8_t i = 0;
init();
for(;;)
{
for(i=0;i<255;i++)
{
PORTA = i;
_delay_ms(50);
}
for(i=255;i>0;i--)
{
PORTA = i;
_delay_ms(50);
}
}
return 0;
}