Hmm,
ich habs jetzt bei mir mal nem ATMega16 probiert und da funktioniert es
problemlos. Hier ist mal mein Code (Achtung die Syntax ist leicht etwas
anderst, da ich den CodeVision AVR C verwende).
1 | volatile unsigned char ucFlag=0; // Statusflag für INT0 ist aufgetreten
|
2 |
|
3 |
|
4 | // External Interrupt 0 service routine
|
5 | interrupt [EXT_INT0] void ext_int0_isr(void)
|
6 | {
|
7 | // Place your code here
|
8 | if(ucFlag<255) ucFlag++;
|
9 | }
|
10 |
|
11 | void main(void)
|
12 | {
|
13 | .....
|
14 | // Port D initialization
|
15 | PORTD=(1<<PD2); // Pull Up für INT0 (PD2) aktivieren
|
16 | DDRD= (1<<PD4); // Debug LED an Port D4
|
17 |
|
18 | // External Interrupt(s) initialization
|
19 | // INT0: On
|
20 | // INT0 Mode: Any change
|
21 | // INT1: Off
|
22 | // INT2: Off
|
23 | GICR |= (1<<INT0);
|
24 | MCUCR = (1<<ISC00);
|
25 | MCUCSR = 0x00;
|
26 | GIFR = (1<<INTF0);
|
27 | .......
|
28 | // Global enable interrupts
|
29 | #asm("sei")
|
30 |
|
31 | while (1) {
|
32 | if(ucFlag) {
|
33 | ucFlag--;
|
34 | printf("Tür auf oder zugegangen\n");
|
35 | }
|
36 | #asm("wdr")
|
37 | }; // end while
|
38 | }
|
Einziger Unterschied, was mir noch zu Dir auffällt ist, dass ich für den
INT0 sicherheitshalber noch den PullUp aktiviert habe.
Ausserdem, bist Du Dir sicher, dass das Register MCUCR bei Dir mit 0x00
intialisiert wurde?( Falls nicht dann schreib lieber: MCUCR = 1<<ISC00;
)
Ansonsten, simuliere Dein Programm einfach mal im AVR-Studio da kann man
schön sehen, woran es habert.
Bye
Andreas