hallo zusammen, ich suche den fehler in diesem code, den ich (möglichst
einfach) zum lernen mit Interrupts umzugehen geschrieben habe.
Es sollte passieren:
Blinken der led in ihrer 1. frequenz bis taster gedrückt wird, dann in
der 2., bis er erneut gedrückt wird (wieder die erste) usw.
es wird immer der erste teil der schleife ausgeführt, dh die led blinkt
immer in der selben frequenz.
wo ist der fehler?
1 | /*===================================================================================
|
2 |
|
3 | #include <stdbool.h>
|
4 | #include <stdlib.h>
|
5 | #include <stdint.h>
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include <avr/interrupt.h>
|
9 |
|
10 | #define F_CPU 9.6E6
|
11 | #include <util/delay.h>
|
12 |
|
13 |
|
14 | bool onoff1;
|
15 | bool onoff2;
|
16 |
|
17 |
|
18 | ISR(PCINT0_vect)
|
19 | {
|
20 | if (onoff1 == 1)
|
21 | {
|
22 | onoff2 = 1;
|
23 | onoff1 = 0;
|
24 | }
|
25 | else
|
26 | {
|
27 | onoff2 = 0;
|
28 | onoff1 = 1;
|
29 | }
|
30 |
|
31 | }
|
32 |
|
33 |
|
34 | int main(void)
|
35 | {
|
36 |
|
37 | DDRB = 0b00000010;
|
38 | PORTB = 0b00000000;
|
39 |
|
40 | GIMSK |= (1<<PCIE);
|
41 | PCMSK |= (1<<PCINT0);
|
42 | sei();
|
43 |
|
44 | onoff1 = 1;
|
45 | onoff2 = 0;
|
46 |
|
47 | while (1)
|
48 | {
|
49 | if (onoff1)
|
50 | {
|
51 | for (int i=0; i<10; i++)
|
52 | {
|
53 | PORTB = 0b00000000;
|
54 | _delay_ms(50);
|
55 | PORTB = 0b00000010;
|
56 | _delay_ms(50);
|
57 | }
|
58 | }
|
59 | else if (onoff2)
|
60 | {
|
61 | for (int i=0; i<10; i++)
|
62 | {
|
63 | PORTB = 0b00000000;
|
64 | _delay_ms(200);
|
65 | PORTB = 0b00000010;
|
66 | _delay_ms(200);
|
67 | }
|
68 | }
|
69 | else
|
70 | PORTB = 0b00000000;
|
71 |
|
72 | }
|
73 |
|
74 | return 0;
|
75 | }
|