Ich habe das jetzt auch ohne ein _delay_ms hinbekommen
im button-header
1 | #define BUTTON_DEBOUNCETIME 3
|
2 |
|
3 | typedef struct
|
4 | {
|
5 | uint8_t state;
|
6 | uint8_t active;
|
7 | uint8_t changed;
|
8 | volatile uint8_t debounce;
|
9 | }IO;
|
10 |
|
11 | IO button[2];
|
In der while-schleife
1 | /* Taster abfragen */
|
2 | if((PIND & (1<<PIND4)) && (button[0].state==0) && (!button[0].debounce) ) /* rising edge */
|
3 | {
|
4 | button[0].debounce = BUTTON_DEBOUNCETIME;
|
5 | button[0].state = 1;
|
6 | }
|
7 | else if((PIND & (1<<PIND4)) && (button[0].state==1)) /* on */
|
8 | {
|
9 | button[0].changed = 1;
|
10 | button[0].active = 1;
|
11 | }
|
12 | else if((!(PIND & (1<<PIND4))) && (button[0].state==1) && (!button[0].debounce) ) /* falling edge */
|
13 | {
|
14 | button[0].debounce = BUTTON_DEBOUNCETIME;
|
15 | button[0].state = 0;
|
16 | }
|
17 | else if((!(PIND & (1<<PIND4))) && (button[0].state==0) && (button[0].active==1)) /* off */
|
18 | {
|
19 | button[0].changed = 1;
|
20 | button[0].active = 0;
|
21 | }
|
im timer ISR
1 | if(button[0].debounce) button[0].debounce--; /* debounce button */
|
2 | if(button[1].debounce) button[1].debounce--; /* debounce button */
|
Jetzt wäre die Frage, wie ich es für weiter buttons hinbekomme, ohne
alles zu kopieren (also den ablauf in der while-schleife.
Momentan ist ja nur Button1 implementiert. für Button2 und weitere
müsste ja alles nochmal kopiert werden und nur der pin und button
angepasst werden
(PIND & (1<<PIND4) -> (PIND & (1<<PIND4)
button[0] -> button[1]
es werden letztendlich 5 buttons. Das bringt ja ewig viel code, wo aber
letztendlich immer das selbe drinn steht.