Hey zusammen,
ich habe hier ein Atmel Evaluationsboard 2.01 von Pollin
(http://www.pollin.de/shop/downloads/D810038B.PDF) mit einem ATMega32
16PU, welches ich per ISP mit AVR-Studio programmiere. Das Board hat an
PD2(INT0), PD3(INT1) und PD4 je einen Taster, und an PD5 und PD6 je eine
LED.
Ich habe vorher mit einem Timer-Interrupt die LEDs abwechselnd blinken
lassen, was ohne Probleme funktionierte. Jetzt wollte ich das ganze auf
einen externen Interrupt von dem Taster an PD2, also INT0 triggern.
Leider funktioniert das nicht wie gewünscht. Hier erstmal der Code:
1 | #define F_CPU 16000000UL /* Ext. Quarz mit 16 Mhz */
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <avr/iom32.h>
|
6 | #include <avr/signal.h>
|
7 |
|
8 | volatile uint8_t flag;
|
9 |
|
10 | int main(void)
|
11 | {
|
12 | DDRD = (1<<PIND5);
|
13 | GICR |= (1<<INT0);
|
14 | MCUCR |=(1<<ISC01) | (1<<ISC00);
|
15 | sei();
|
16 |
|
17 | PORTD = (1 << PD5);
|
18 | flag = 0;
|
19 |
|
20 | while(1)
|
21 | {
|
22 | if (flag ==1)
|
23 | {
|
24 | flag = 0;
|
25 | PORTD ^= (1 << PD5);
|
26 | }
|
27 | }
|
28 | return 0;
|
29 | }
|
30 |
|
31 | SIGNAL( INT0_vect)
|
32 | {
|
33 | flag=1;
|
34 | }
|
Nun ist es egal, welchen Taster ich betätige, der Interrupt wird bei
jedem der drei Taster ausgeführt. Und das selbst wenn die Jumper JP3,
JP4 und JP5 (siehe PDF von oben) nicht eingesetzt sind, also eigentlich
keine physikalische Verbindung zwischen Taster und uC existieren sollte.
Des weiteren wird fast die hälfte aller Interrupts verschluckt.
Ist es ein Software-Problem, oder was könnte hier los sein?
Schöne Grüße,
Max