Der Wurm liegt in den inneren Ifs,
1 | while(1)
|
2 | {
|
3 |
|
4 | if( PINB & ( 1 << PB0 ) )
|
5 | tasteJetzt = TASTE_NICHT_GEDRUECKT;
|
6 | else
|
7 | tasteJetzt = TASTE_GEDRUECKT;
|
8 |
|
9 |
|
10 |
|
11 | if( tasteVorher != tasteJetzt )
|
12 | {
|
13 |
|
14 | if( tasteJetzt == TASTE_GEDRUECKT )
|
15 | {
|
16 |
|
17 | // Jedesmal, wenn sich die Taste geändert hat und gedrückt wird,
|
18 | // wird hier PORTC auf 1 gesetzt.
|
19 | PORTC = 0b00000001;
|
20 |
|
21 | }
|
22 |
|
23 | // Bei gedrückter Taste ist PORTC hier immer gleich 1 ...
|
24 | if ((tasteJetzt == TASTE_GEDRUECKT) && (PORTC=0b00000001))
|
25 | {
|
26 | // ... und wird hier auf 2 gesetzt
|
27 | PORTC=0b00000000;
|
28 | PORTC=0b00000010;
|
29 |
|
30 | }
|
31 |
|
32 | if ((tasteJetzt == TASTE_GEDRUECKT) && (PORTC=0b00000010))
|
33 | {
|
34 | // ... und hier mit derselben Logik auf 4.
|
35 | PORTC=0b00000000;
|
36 | PORTC=0b00000100;
|
37 | }
|
38 |
|
39 |
|
40 | tasteVorher = tasteJetzt;
|
41 | }
|
42 |
|
43 | _delay_ms( 30 ); //
|
44 | }
|
45 | }
|
Um dem abzuhelfen kann man unterschiedlich vorgehen, zum Beispiel so
1 | if( tasteVorher != tasteJetzt )
|
2 | {
|
3 | if( tasteJetzt == TASTE_GEDRUECKT )
|
4 | {
|
5 | switch (PORTC)
|
6 | {
|
7 | case 0b00000000: PORTC = 0b00000001; break;
|
8 | case 0b00000001: PORTC = 0b00000010; break;
|
9 | case 0b00000010: PORTC = 0b00000100; break;
|
10 | case 0b00000100: PORTC = 0b00000000; break;
|
11 | }
|
12 | }
|
13 | tasteVorher = tasteJetzt;
|
14 | }
|
15 |
|
16 | _delay_ms( 30 ); //
|
17 | }
|
Ich habe den Code nicht compiliert, mag sein, dass man den noch in
fehlerfreies C übersetzen muss. Die Idee sollte aber klar werden.
BBB