Pages: [1]   Go Down
Author Topic: Perfekte Softwareentprellung?  (Read 758 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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;
}

}
« Last Edit: December 19, 2012, 02:29:47 pm by Chris72622 » Logged


Germany
Offline Offline
Edison Member
*
Karma: 137
Posts: 1515
If you believe something is right, you won't see what's wrong (David Straker).
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Quote
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?  smiley-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


Logged

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
2. 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.

Quote
3. 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 )
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3495
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde sowas einfach bei einem Profi abschreiben. Und zwar hier: http://www.mikrocontroller.net/articles/Entprellung. Im Zweifelsfall immer bei Peter Danneger abschreiben. Peter weiss ganz genau was er tut smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank Euch für den Input!  smiley

Gruß Chris
Logged


Germany
Offline Offline
Edison Member
*
Karma: 137
Posts: 1515
If you believe something is right, you won't see what's wrong (David Straker).
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
Meinst Du mit Zustandsautomat Hardware?
Ich meinte eher die Modellierungsmethodik. Mach mal eine Google Bildersuche "statemachine debounce"

Code:
Was meinst Du mit überlaufender startzeit+10?
Nach 49 Tagen Laufzeit könnte da als Ergebnis beispielsweise 5 rauskommen.

Grüße,
Oliver
Logged

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Pages: [1]   Go Up
Jump to: