Hallo, ich glaube es nicht. Jetzt habe ich meinen Code soweit zusammengestrickt, dass er nur noch aus wenigen Zeilen besteht. Das Problem: Wenn ich den ext. Interrupt INT0 mit ISC1=1, ISC0=0 auf eine fallende Flanke konfiguriere, dann löst der Interrupt trotzdem auf eine steigende Flanke aus? Was mache ich falsch? Wenn man einen Breakpoint an die ISR setzt, dann springt er in Zyklus 2007 hinein, obwohl PINB von 0 auf 4 springt (steigende Flanke). Ich weiss mir nicht mehr zu helfen... Code: ----------------------
1 | #define PIN_v_ist PB2
|
2 | |
3 | |
4 | /* local prototypes */
|
5 | int main(void); |
6 | void init_all(void); |
7 | void init_Port(void); |
8 | void init_PWM(void); |
9 | |
10 | |
11 | #include <avr/io.h> |
12 | #include <avr/interrupt.h> |
13 | |
14 | #define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
|
15 | #define _NOP() do { __asm__ __volatile__ ("nop"); } while (0)
|
16 | |
17 | |
18 | /* -------------------------------------------------- */
|
19 | int main(void) |
20 | {
|
21 | init_all(); |
22 | |
23 | /* Lösche den erzeugten Interrupt */
|
24 | sbi(GIFR,PCIF); |
25 | sbi(GIFR,INTF0); |
26 | |
27 | /* Schaltet den Interrupt frei */
|
28 | sei(); |
29 | while(1) |
30 | {
|
31 | _NOP(); |
32 | }
|
33 | }
|
34 | |
35 | void init_all(void) |
36 | {
|
37 | init_Port(); |
38 | /* The falling edge of INT0 generates an interrupt request */
|
39 | sbi(MCUCR,ISC01); |
40 | /* Interrupt Freischaltung INT0 -> Speed */
|
41 | sbi(GIMSK,INT0); |
42 | }
|
43 | |
44 | |
45 | void init_Port(void) |
46 | {
|
47 | /* Eingänge und nicht benutzte PINs mit Pullup abschliessen */
|
48 | PORTB = (1<<PIN_v_ist); |
49 | }
|
50 | |
51 | |
52 | ISR(INT0_vect) |
53 | {
|
54 | _NOP(); |
55 | }
|
---------------------------------- Stimulidatei:
1 | #1 |
2 | PINB = 0 |
3 | #2000 |
4 | PINB = 4 |