Hey, ich habe die letzten Tage versucht mit meinen Testboard ( AVR-P40-USB), die externe Interrupt Geschichte zu verstehen. Ich habe einen ATMEGA32 auf dem Board.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <avr/delay.h> |
4 | #define CPU_F 8000000UL
|
5 | |
6 | |
7 | uint8_t flag; //globale Variable |
8 | |
9 | int port_init (void) |
10 | {
|
11 | DDRB |= (1<<PB0); //LED PB0 auf Ausgang |
12 | DDRB &= ~ (1<<PB1); //Taster PB1 auf Eingang |
13 | PORTB = (1<<PB0); //LED aus |
14 | |
15 | DDRD &= ~ (1<<PD2); //INT0 auf Eingang |
16 | PORTD = (1<<PD2); // interner Pullup Widerstand |
17 | |
18 | return 0; |
19 | }
|
20 | |
21 | |
22 | |
23 | int interrupt_init (void) |
24 | {
|
25 | |
26 | MCUCR = 0b00000011; //Steigende Flanke erzeugt Interrupt |
27 | GICR = 0b01000000; //INT0 aktiviert |
28 | |
29 | return 0; |
30 | |
31 | }
|
32 | |
33 | |
34 | ISR (INT0_vect) |
35 | {
|
36 | flag = 1; // Variable setzen |
37 | }
|
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | int main (void) |
46 | {
|
47 | port_init(); // Init |
48 | interrupt_init(); //Init |
49 | |
50 | |
51 | |
52 | PORTB &=~ (1<<PB0); // LED TEST |
53 | _delay_ms (500); // LED TEST |
54 | PORTB = (1<< PB0); // LED TEST |
55 | |
56 | sei(); |
57 | |
58 | while (1) |
59 | {
|
60 | if (flag == 1) // Variable abfragen |
61 | {
|
62 | PORTB &=~ (1<<PB0); // LED Anschalten |
63 | }
|
64 | }
|
65 | |
66 | |
67 | }
|
Der LED test funktioniort auf dem Board . Jedoch wenn ich den Taster drücke passiert nichts. LED ist active low; Taster active high an int0 mit internem pullup widerstand. Bitte um Hilfe. Danke im voraus