PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : externer Interrupt



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

1udo1
04.02.2009, 11:56
Hallo Leute,

Kommando zurück!

Habe beim Kopieren Codeschnipsel durcheinander geschmissen. Ich meinte
nicht den TIMER Interrupt in der ISR, sondern den externen Interrupt.

Also, ich checke noch mal durch.

Und hier:

PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibier

Klar!!!! Anfängerkrimskrams. Learning by doing. Muss man (noch) mit
leben.



Danke zunächst.

Udo