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
1 | 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.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 |
|
5 | #define F_CPU 7372800UL
|
6 |
|
7 | #include <util/delay.h>
|
8 |
|
9 |
|
10 | ISR(TIMER0_OVF_vect)
|
11 |
|
12 | {
|
13 | PORTA=0xdd;
|
14 | }
|
15 |
|
16 |
|
17 | ISR(TIMER1_OVF_vect)
|
18 |
|
19 | {
|
20 | PORTA=0xaa;
|
21 | }
|
22 |
|
23 |
|
24 | void init(void)
|
25 |
|
26 | {
|
27 |
|
28 | TCCR1B = _BV(CS11);
|
29 |
|
30 |
|
31 | GICR |= (1<<INT0) | (1<<INT1); // Interrupt Enable
|
32 |
|
33 |
|
34 | DDRD &= ~( ( 1 << PIND2 ) | ( 1<<PIND3) ); //INT0 und INT1 Eingang
|
35 |
|
36 |
|
37 | PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibieren
|
38 |
|
39 | sei();
|
40 |
|
41 | DDRA = 0xff;
|
42 |
|
43 | }
|
44 |
|
45 |
|
46 | int main(void)
|
47 | {
|
48 |
|
49 | uint8_t i = 0;
|
50 |
|
51 | init();
|
52 |
|
53 | for(;;)
|
54 | {
|
55 |
|
56 | for(i=0;i<255;i++)
|
57 | {
|
58 | PORTA = i;
|
59 | _delay_ms(50);
|
60 | }
|
61 |
|
62 | for(i=255;i>0;i--)
|
63 | {
|
64 | PORTA = i;
|
65 | _delay_ms(50);
|
66 | }
|
67 | }
|
68 | return 0;
|
69 | }
|