Go Down

Topic: 30 Taster einlesen mit i2c oder shiftRegister? (Read 11613 times) previous topic - next topic

Doc_Arduino

Hallo,

wegen dem entprellen. Ich weis nicht wie ich das am besten erklären soll ohne Zeichnung.

Vergiss am besten Deine "aller 100ms Tasterabfrage." Die loop muß ständig ohne Pause durchlaufen um die Bounce2 Funktionen abzuarbeiten. Beim entprellen wird auf eine Zustandsänderung an einem Eingang gewartet und eine Mindestzeit (die Entprellzeit) gewartet bis er sich nicht mehr ändert. Bzw. es wird gewartet ob der Zustand gleich bleibt oder doch wieder anders ist, nach der Wartezeit. Die Kontakte vom Taster haben sich beruhigt und schwingen nicht mehr nach,  nach deren Betätigung.
Jetzt weist Du, okay der Taster wurde einmal gedrückt.
Wenn Du den Taster ohne Entprellung drückst, bekommt der µC vielleicht 66x H/L Pegel Wechsel registriert. Du möchtest aber einmal drücken und er soll das als einmal verstehen.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sschultewolter

Das Prinzip entspricht dann in etwa was ich plane.

MCU steuer einen HC595 und HC165 an. Mit dem HC595 möchte ich mit Hilfe eines Darlingtonarrays Eltakos ansteuern.  Die Setzbedingungen ergeben sich aus der Software bzw. Anweisung vom Master. Die HC165 sollen ledilgich erfassen, ob Ausgänge geschaltet oder ungeschaltet sind, da auch weiterhin alles nötige über Taster geschaltet werden soll.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Eisebaer

hi,

also warum das mit dieser art, zu entprellen, nicht funktionieren soll, verstehe ich auch nicht.

sagen wir mal, ein taster prellt höchstens 30 millisekunden nach.

wenn er alle 50 ms abfragt, und bei zwei polls nacheinender den gleichen zustand bekommt, dann ist das entprellt.
der einzige unterschied zur anderen methode ist, daß er im ungünstigsten fall 49 ms bis zum ersten erkennen der zustandserkennung braucht. ab dann ist es das gleiche. er wartet 50 ms und schaut dann noch einmal nach.

und ob es zwei signalstörungen im abstand von 50ms sind, bekommt man weder mit der einen noch mit der anderen methode mit.

etwas anderes wäre es, zu warten, bis der taster seinen zustand sagen wir mal 30ms lang nicht mehr ändert, und vielleicht arbeitet die bounce ja nach diesem prinzip. das ist aber nicht das, was Ihr hier beschreibt:

Quote
Entprellung bedeutet, ich drücke den Taster, das wird erkannt und erst ab jetzt, wegen erkannter Zustandsänderung warte ich die eingestellte Entprellzeit ab und vergleiche nochmal ob das Signal immer noch gleich ist oder nicht.

Quote
es wird gewartet ob der Zustand gleich bleibt oder doch wieder anders ist, nach der Wartezeit


nachteil, wie gesagt, es kann sein, daß man den taster länger drücken muß (2x entprellzeit).

gruß stefan

Doc_Arduino

Hallo,

nein, man muß den Taster nur mindestens so lange drücken wie 1x Entprellzeit.
Macht mal. Vielleicht reden wir auch nur aneinander vorbei ...
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

Entprellen und Signalstörung hat doch nichts miteinander zu tun, oder ?

Wenn ich keine Störungen habe, ist jeder Signalwechsel Teil einer -prellenden- Taster-Betätigung.
Dann spare ich mir das zwei mal einlesen, und frage nur alle x ( 5 .. 30 ) msec  einmal:
Änderung erkannt: Änderung bearbeiten; sonst eben nicht.
Oder nach jeder erkannten Änderung frage ich x msec lang den ( die ) Taster nicht mehr ab, oder gönne mir gar ein kleines delay, fertig entprellt.

Wenn ich Störungen habe, habe ich sowieso Probleme, die mir ein noch so hochkompliziertes Debouncing nur zum Teil wegfiltern könnte. Wenn, z.B. während längerem Tastendrücken, zeitweise Aussetzer erkannt würden, ist der Taster verdreckt, die Feder ausgeleiert oder sonstwas in der Art. Diese Störungen können genausogut länger als eine vernünftige Debounce-Zeit sein und nur durch bessere Taster abgefangen werden.

SkobyMobil

Hallo,
Mag ja sein, das ich etwas "BegriffsStutzig" bin, auch einen leichten "Schaden"
will ich nicht unbedingt abstreiten, aber wie zum Teufel kann man bei mehr als
25 Tastern versuchen, deren Prellen mit "Debounce(Lib)" zu erschlagen.

Das "bounce" kann doch nur nach dem "schlechtesten" Taster festgelegt werden.
Warum erschlägt man das bei der Anzahl von Taster nicht mit einem IC, oder
noch einfacher, mit "Software".
Man kann den Taster doch im Sketch "toggeln". Erstens hat man einen eindeutigen
Status des Taster, und zweitens läßt der Taster sich so ohne Probleme
in seiner Funktion einfach erweitern.
Aber vielleicht kann mir das mal jemand erklären?
Über die verschiedenen Versorgungsspannungen und extra Bauteile will ich mal
lieber nichts sagen.
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

beginner34

Hi, zusammen. Danke für die guten Tipps. :)
Ich habe mal einen Test schaltplan erstellt, es fehlen noch viele Bauteile aber das Prinzip sollte jetzt klar sein.

Die Register sollen alle 50ms abgerufen werden, also ALLE für die Taster und wenn was geändert,

dann in den anderen neu gesetzt werden. Es sind ganz normale Lichtschalter (für 220V, Baumarkt)(Taster)
Sollte ich das ganze nun mit shiftregister versuchen oder doch lieber mit i/o exp. und i2c ?
Oder geteilt?

MfG  Marco

PS:  Schaltpläne sind unvollständig!!!!!

Doc_Arduino

Hallo,

also bevor Du, Skoby, hier Unsinn verbreitest muß ich mich doch nochmal melden. Leute, nehmt doch einfach mal die Bounce2 Lib zur Hand bevor ihr darüber schreibt.

Man kann und muß jeden Taster als eigenes Objekt erstellen und legt damit auch für jeden Taster seine eigene Entprellzeit fest. Kann man natürlich auch mit einer Variable für alle global festlegen.

Das ganze sieht dann ungefähr so aus. Mal paar Zeilen rauskopiert von meinem Sketch
Code: [Select]

....
Bounce debouncer1 = Bounce();  // Instantiate a Bounce object Nr.1 (1. Taster SDread)
Bounce debouncer2 = Bounce();  // Instantiate a Bounce object Nr.2 (2. Taster BTmodul)
Bounce debouncer3 = Bounce();  // Instantiate a Bounce object Nr.3 (3. Taster SD_write_protect)

....

// After setting up the button, setup debouncer
  debouncer1.attach(Taster_SDread);
  debouncer1.interval(30);    // Entprellzeit 30ms
 
  debouncer2.attach(Taster_BTmodul);
  debouncer2.interval(30);    // Entprellzeit 30ms
 
  debouncer3.attach(Taster_SD_access_protect);
  debouncer3.interval(30);    // Entprellzeit 30ms



Ihr könnt aber gern versuchen das anders und einfacher zu lösen. Nur guckt Euch bitte die Bsp. der Bounce2 vorher an, bevor ihr darüber schreibt. Bitte. Sonst endet das hier im Kaos.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

skorpi080

Oder nimm einfach die ClickButton / OneButton Lib
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

SkobyMobil

Hallo,
ich wußte nicht, das es Unsinn ist, was ich geschrieben habe. Es lag mir auch
fern diesen zu verbreiten. Ich glaube, ich lasse das in Zukunft. Dann müssen
die "Profis" auch nicht jede Frage eines "Deppen" unzureichend beantworten.
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

ElEspanol

Kann man die debounce2 lib auch für Schieberegister oder IO Erweiterungen nehmen?  Ich  dachte,  das geht nur für native Pins des Boards. 

Serenifly


Man kann und muß jeden Taster als eigenes Objekt erstellen und legt damit auch für jeden Taster seine eigene Entprellzeit fest. Kann man natürlich auch mit einer Variable für alle global festlegen.

Man kann übrigens auch Arrays aus Objekten erstellen. Dann kann man über alle Objekte iterieren und muss nicht den Code für jedes einzeln schreiben.

michael_x


Kann man die debounce2 lib auch für Schieberegister oder IO Erweiterungen nehmen?  Ich  dachte,  das geht nur für native Pins des Boards. 

Sehr richtig !

Quote
Warum erschlägt man das bei der Anzahl von Taster nicht [...] mit "Software".

Das ist mir allerdings tatsächlich unverständlich, darum gehts doch hier, oder? ;)

Bevor man sich eine neue Bounce2A library schreibt, die z.B. das digitalRead nicht selbst macht, sondern sich sonstwo her holt, sollte man nochmal von vorne überlegen, was man tatsächlich braucht.

Egal ob i2c oder shiftIn, das ganze ist seriell und es geht um mechanische manuell betätigte Licht-Taster. Da kommt es doch wohl auf 50 msec nicht an. Individuelle debounce-Zeiten ...  wenn es für ein mehrstimmiges keyboard wäre, könnte man das ja diskutieren  ... 

ElEspanol

Was ist nun richtig.  Nur native Ports oder  auch I2C und Schieberegister?

Doc_Arduino

Hallo,

entprellen muß man nur digitale Eingänge wo echte Taster o.ä. angeschlossen sind.

Digitale Signale von anderen digitalen Schaltungen muß man nicht entprellen.

Wobei Achtung. Hier geht es darum das echte Taster an Porterweiterungen angeschlossen sind. Wenn man die Eingänge der vorgelagerten Porterweiterung abfragt, wird das Kontaktprellen bis zum µC 1:1 durchgereicht. Also muß man wieder entprellen.
Bsp. man fragt die Porterweiterung in loop aller 1ms ab, oder noch schneller, was der µC gerade hergibt, und der Taster prellt 30ms nach, dann zählt man in der loop womöglich geschätze 20 Signaländerungen.
Kann man doch gedanklich nachvollziehen?

Mit entsprechender Variablenübergabe sollte die Bounce2 Lib auch mit Porterweiterungen funktionieren. Mußt nur vorher, wenn Du zum Bsp. die Eingänge Byte weise eingelesen bekommst, dass Byte in Bits zerlegen.

Wegen Bounce2 Lib oder auch nicht. Hab mir das nochmal überlegt. Vielleicht kommt man besser weg, wenn man sich die Entprellroutine selbst schreibt mit der üblichen millis Methode und darin sämtliche Statusvariablen der Taster einspeichert und vergleicht. Wird zwar auch eine hohe Schreibaufwand, aber vielleicht mit weniger RAM Verbrauch. Das Grundgerüst würde die Bounce2 Lib einem abnehmen und "verstecken".

Das einzigste Problem was ich sehe, wenn man nur eine Entprellzeit für alle Taster verwendet und diese ist sehr hoch, dann kann es passieren, wenn mehrere Leute im Haus auf irgendwelche Taster drücken, nur auf den ersten Taster der gedrückt wurde reagiert wird. Dann muß man warten bis die Entprellzeit abgelaufen ist, bevor man einen anderen Taster drücken kann. Wenn man deswegen wiederum für jeden Taster eine eigene Entprellzeit verwenden möchte oder gar muß, dann kommt man vom Aufwand her mit der Bounce2 sicherlich besser und schneller zum Ziel.

weiter machen ...   ;)
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up