Hallo Ich habe diese Entprellungsroutine https://www.mikrocontroller.net/articles/Entprellung#Flankenerkennung für einen "Active HIGH"-Taster umgebaut:
1 | #include <avr/io.h> |
2 | |
3 | #define BUTTONPORT PIND
|
4 | #define BUTTONPIN PD2
|
5 | |
6 | char debounce(void) |
7 | {
|
8 | static unsigned char state; |
9 | char rw = 0; |
10 | |
11 | if(state == 0 && (BUTTONPORT & (1<<BUTTONPIN))) //Taster wird gedrueckt (steigende Flanke) |
12 | {
|
13 | state = 1; |
14 | rw = 1; |
15 | }
|
16 | else if (state == 1 && (BUTTONPORT & (1<<BUTTONPIN))) //Taster wird gehalten |
17 | {
|
18 | state = 2; |
19 | rw = 0; |
20 | }
|
21 | else if (state == 2 && !(BUTTONPORT & (1<<BUTTONPIN))) //Taster wird losgelassen (fallende Flanke) |
22 | {
|
23 | state = 3; |
24 | rw = 0; |
25 | }
|
26 | else if (state == 3 && !(BUTTONPORT & (1<<BUTTONPIN))) //Taster losgelassen |
27 | {
|
28 | state = 0; |
29 | rw = 0; |
30 | }
|
31 | |
32 | return rw; |
33 | }
|
Über
1 | while(1){ |
2 | |
3 | if(debounce() == 1) LED_EVENT(LED2,2); |
4 | }
|
lasse ich eine LED blinken, wenn "rw" 1 ist. Leider klappt das aber irgendwie nur bei jedem 2. Mal (selten auch erst beim 3. Drücken) Woran kann das liegen? Der µC läuft mit 16 MHz und nebenbei (in der While-Schleife) wird noch ein NeoPixelRing angesteuert. Danke Hannes