Perfekte Softwareentprellung?

Hallo,

ich habe mich als Anfänger mal etwas näher mit dem Thema Softwareentprellung beschäftigt und möchte an dieser Stelle mein selbst erarbeitetes Ergebnis präsentieren. Ein Taster leitet in meinem Beispiel 5V an Pin2 und schaltet die LED an Pin13.

Es geht grundsätzlich um die Entprellung eines Tasters mit knapp 10ms "Entprellzeit".

Gimmicks:

  1. Im Gegensatz zu vielen anderen Ansätzen, sollte das Entprellen nicht den weiteren Codeablauf blockieren (Stichwort delay).
  2. Es soll sowohl beim Drücken des Tasters, als auch beim Loslassen entprellt werden.
  3. Es soll jeweils genau der Zeitpunkt des Drückens, bzw. des Loslassens für das auslösen von Funktionen verwendet werden können.

Mangels Arduinos kann ich momentan nicht "real" testen, hoffe aber, der Code passt soweit. Fehler?

Sehr gerne würde ich den Code weiter komprimieren, weiss aber nicht wie.

Für Kritik und Tipps jeglicher Form bin ich sehr dankbar.

Gruß Chris

int led = 13;
int taster = 2;
boolean tastenstatus = 0;
boolean tastenspeicherstatus = 0;
unsigned long startzeit=0;
unsigned long endzeit=0;

void setup(){

pinMode(taster, INPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}

void loop(){

tastenstatus=digitalRead(taster);
if(tastenstatus==1 && tastenspeicherstatus==0){
  startzeit=millis();
  tastenspeicherstatus=1;
  digitalWrite(led,HIGH);
}
if(tastenstatus==0 && tastenspeicherstatus==1 && millis()>startzeit+10){
  endzeit=millis();
  digitalWrite(led,LOW);
}
if(millis()>endzeit+10){
  tastenspeicherstatus=0;
}

}

Hi

Du bittest um Kritik und Tipps für deinen Code. Aber wie kann man den geben, wenn nicht beschrieben ist, was der Code denn nun genau machen soll. Die gegebenen Erklärungen sind vage: Zum Beispiel diese hier:

Es geht grundsätzlich um die Entprellung eines Tasters mit knapp 10ms "Entprellzeit"

Was bedeutet denn "Entprellzeit"? Im Code wird jedenfalls nach sofortiger Erkennung (0ms) die LED aktiviert.
Ist das beabsichtigt? Wenn die Taste kürzer als 10ms gedrückt wird, geht die LED an, aber nicht mehr aus.
Wenn die Taste länger als 10ms gerückt wird, geht die LED hingegen wieder aus, oder?

Zustandsautomaten wären in diesem falle eine geeignete Lösung.

Nebenbei: Wenn Du schon dabei bist, Dich von anderen Ansätzen abzugrenzen: Was passiert eigentlich wenn, "startzeit+10" überläuft? :wink:
Das dabei entstehende Blockierproblem würde jedenfalls bei der delay() Lösung normalerweise nicht auftreten (was nicht heißen soll, dass ich die delay() Lösung gut finde).

Oliver

Hallo,

die Entprellzeit ist in meinem Fall die Zeit, die der Taster benötigt um nicht mehr zu prellen. Ja, die LED soll sofort aktiviert werden. Wenn die Taste länger als 10ms gedrückt gehalten wird, sollte die Lampe eigentlich nicht ausgehen.

Meinst Du mit Zustandsautomat Hardware?

Was meinst Du mit überlaufender startzeit+10?

Gruß Chris

  1. Es soll sowohl beim Drücken des Tasters, als auch beim Loslassen entprellt werden.

Warum ist dein Code nicht einfach symmetrisch?
1->0 behandelst du anders als 0->1

Und beim Einschalten ist endezeit irgendwas altes, was dafür sorgt, dass tastenspeicherstatus = 0 bleibt.
Das hab ich nicht verstanden.

  1. Es soll jeweils genau der Zeitpunkt des Drückens, bzw. des Loslassens für das auslösen von Funktionen verwendet werden können.

Kurze Stör-Pulse oder Aussetzer willst du also nicht unterdrücken, die sollen auf die Entprellzeit verlängert werden. Das ist schon OK, sollte dir nur klar sein.

Zum Komprimieren: Mit nur einer unsigned long schaltzeit statt separater start- und endezeit brauchst du statt 10 byte RAM nur 6.
taster und led sind natürlich
** **const** **
.


Und noch ein Tipp:

 millis()>startzeit+10

ist was anderes als

 millis()-startzeit > 10

(Zugegeben, nur ganz exotisch, wenn millis() gerade überläuft, und dann behebt sich das "Problem" bei dir kurze Zeit später von allein, aber man kann es sich ja gleich richtig angewöhnen )

Ich würde sowas einfach bei einem Profi abschreiben. Und zwar hier: Entprellung – Mikrocontroller.net. Im Zweifelsfall immer bei Peter Danneger abschreiben. Peter weiss ganz genau was er tut :wink:

Vielen Dank Euch für den Input! :slight_smile:

Gruß Chris

Entschuldigung, wenn ich nochmal Antworte, aber die Fragen wollte ich nicht unbeantwortet lassen.

Meinst Du mit Zustandsautomat Hardware?

Ich meinte eher die Modellierungsmethodik. Mach mal eine Google Bildersuche "statemachine debounce"

Was meinst Du mit überlaufender startzeit+10?

Nach 49 Tagen Laufzeit könnte da als Ergebnis beispielsweise 5 rauskommen.

Grüße,
Oliver

So, ich bins dann doch noch einmal.

Wenn ich alles, was ich so gelesen habe richtig interpretiert habe ist Hardwareentprellung dann sinnvoll, wenn..

a) ..das "gleichzeitige" Drücken mehrerer Schalter "gleichzeitig" mehrere Aktionen auslösen sollen.
b) ..man sich sicher keine "Überlaufprobleme" einhandeln möchte.
c) ..sich den erhöhten Codeaufwand bei vielen Tastern sparen möchte.
d) ..man den Prozessor entlasten möchte.

Leider konnte ich keine Softwarelösung finden, die allen meinen Anforderungen gerecht werden zu sein scheint. Insbesondere das "gleichzeitige" Drücken mehrerer* Tasten scheint im Bezug auf die Erkennung eines Tastendrucks theoretisch problematisch zu sein.

Kann mir das so jemand bestätigen?
Wie löst Ihr Projekte, bei denen viele Taster am Start sind, deren "Druckvorgänge" zuverlässig erkannt werden sollen?

Projekte mit nicht gleichzeitig gedrückten Tastern sind ja bzgl. ihrer Entprellung noch rel. einfach zu lösen; aber bei vielen Tastern.. hm..

Gruß Chris

  • mehrere = mind. drei