Moin, ich kann leider nicht debuggen und finde den Fehler nicht in meiner selbst geschriebener Taster Funktion. Das soll sie machen: Ersten Tastendruck erkennen und return 1; machen. Wenn die Taste gedrückt bleibt, für eine Zeit x immer return 0; zurück geben. Nach Zeit x schell ein return 1; zurück geben, damit z.B. ein Counter schneller hochgezählt wird. Wenn Taste nicht gedrückt ist, halt immer return 0; Ich benutze ein Atmega128A, weil ich einige davon geschenkt bekommen habe. Es sind 3 Taster angeschlossen (an PC4, PC5 und PC6). Interne PullUps sind an und der Schließer geht gegen Masse. Habe da einige mehr return 0; drin, weil es einfach nicht funktioniert....
1 | #define F_CPU 8000000UL
|
2 | #include <util/delay.h> |
3 | #include <avr/io.h> |
4 | #define inputBit(port, mask) ((port) & (1<<mask))
|
5 | |
6 | volatile unsigned char debounce; |
7 | volatile unsigned char holdedPress; |
8 | volatile unsigned char fastPress; |
9 | |
10 | char getTaster(char port, char pin) |
11 | {
|
12 | if((inputBit(port,pin)) == 0) |
13 | {
|
14 | _delay_ms(1); |
15 | debounce++; |
16 | |
17 | if((holdedPress == 1) && (fastPress == 1)) |
18 | {
|
19 | if(debounce == 10) |
20 | {
|
21 | debounce = 0; |
22 | return 1; |
23 | }
|
24 | return 0; |
25 | }
|
26 | |
27 | if((holdedPress == 1) && (fastPress == 0)) |
28 | {
|
29 | if(debounce == 120) |
30 | {
|
31 | holdedPress = 1; |
32 | fastPress = 1; |
33 | debounce = 0; |
34 | return 1; |
35 | }
|
36 | return 0; |
37 | }
|
38 | |
39 | |
40 | |
41 | if((holdedPress == 0) && (fastPress == 0)) |
42 | {
|
43 | if(debounce == 20) |
44 | {
|
45 | debounce = 0; |
46 | holdedPress = 1; |
47 | fastPress = 0; |
48 | return 1; |
49 | }
|
50 | return 0; |
51 | }
|
52 | return 0; |
53 | }
|
54 | |
55 | else
|
56 | {
|
57 | holdedPress = 0; |
58 | fastPress = 0; |
59 | return 0; |
60 | }
|
61 | |
62 | holdedPress = 0; |
63 | fastPress = 0; |
64 | |
65 | return 0; |
66 | }
|