Michael schrieb:
> Hallo,
>
> ich grad ein kleines Problem damit die Tasterentprellung per
> Flankenerkennung aus folgendem Artikel richtig zu verstehen.
> https://www.mikrocontroller.net/articles/Entprellung#Flankenerkennung
Genau ab dieser Stelle wird eine Funktion "taster" beschrieben, die aus
einer anderen Funktion aufgerufen..
>
> Warum ist bei dieser Methode kein delay notwendig?
..das "delay" ist in der aufrufenden Funktion erforderlich..
>
> Wenn der Controller schnell genug läuft um einen "ganzen Prellvorgang"
> abtasten zu können werden hier doch nach wie vor mehrere Tastendrücke
> erkannt oder?
..yepp.
Alternativ kann man auch das Tastenbit in eine uint8_t Variable von
recht nach links schieben:
1 | uint8_t tastenstate = 0;
|
2 | :
|
3 | if(systemzeit >= Tastenabfragezeitpunkt) {
|
4 | tastenstate <<= 1;
|
5 | tastenstate |= TASTENPINBIT; // ist 1, wenn Taster betätigt
|
6 | :
|
7 | switch (tastenstate & 0x03) {
|
8 | case 0: Zustand = NICHT_GEDRUECKT; break;
|
9 | case 1: Zustand = STEIGENDE_FLANKE; break; // wird gerade betätigt
|
10 | case 2: Zustand = FALLENDE_FLANKE; break; // wird gerade losgelassen
|
11 | case 3: Zustand = GEDRUECKT; break;
|
12 | }
|
13 | }
|
14 | :
|
15 | if (tastenstate > 0xfe) TASTE_KLEMMT; // ;-)
|
Es kommt auch immer darauf an, wie die Taste betätigt wird;
- ein von Hand betätigter Taster -> reicht den alle 100ms abzufragen,
- Tastimpuls von einem (mechanischen) Impulsgeber / (Reed)Relais ->
mind. 10ms - 20ms Abfragezyklus.
- Optokoppler ? - Schaffste 'ne ms Schleifendurchlauf?
Einen mechanischen Taster auf einen INT Eingang zu packen, und in der
ISR einen Zähler hochzählen ist nur etwas für delay()_Junkies..