Hallo, arbeite jetzt mit nem attiny2313.
Hab den USBtoSerial Konverter unter Linux (nein unter Windows klappts
nicht :-( ) zum laufen gebracht.
Auf jedenfall hab ich mir mal diese Debounce-Funktion mal angeschaut und
wenn ich sie richtig verstanden habe, schaut diese doch erstmal nach, ob
der Pin auf GND gezogen wurde, oder? Und dann wartet die Funktion 100ms
und guckt dann ob der Pin wieder auf High steht, wartet wieder 100ms und
gibt dann true zurück.
Ich taste das indem ich eine LED mit einem jeweiligen druck auf den
Taster aus und beim nächsten Druck wieder anschalte.
Wenn das so wäre dann wundert mich eins:
Wenn ich den Taster gedrückt lasse (dauerhaft auf GND) müsste nach
meinem Verständnis sich doch nichts an dem Status der LED ändern, oder?
Das dürfte doch erst passieren, wenn ich den Taster wieder loslasse,
oder? Weil die Funktion doch verraussetzt das ich einmal auf GND
geschaltet habe, und erst wenn dann auf High wieder geschaltet wird eine
1 zurückgibt. Aber was nun wirklich passiert ist, dass die LED auch bei
einem dauerhaften Druck angeht nur nicht wieder den Zustand wechselt
solange ich den Taster gedrückt halte.
Ich benutze das Pollin-Board. Nach meinem Verständnis sind die Taster
Active-Low.
1 | int debounce(const volatile uint8_t* port, uint8_t pin)
|
2 | {
|
3 | if(!(*port & (1 << pin)))
|
4 | {
|
5 | _delay_ms(50);
|
6 | _delay_ms(50);
|
7 | if(*port & (1 <<pin))
|
8 | {
|
9 | _delay_ms(50);
|
10 | _delay_ms(50);
|
11 | return 1;
|
12 | }
|
13 | }
|
14 | return 0;
|
15 | }
|
16 | int main(void)
|
17 | {
|
18 | DDRD |= ((1 << PD5) | (1 << PD6));
|
19 | PORTD = (1 << PD5);
|
20 | while(1) {
|
21 | if(debounce(&PIND,PD4))
|
22 | {
|
23 | PORTD ^= (1 << PD6);
|
24 | }
|
25 | }
|
26 | return 0;
|
27 | }
|