Hallo zusammen,
ich habe ein größeres Arduino-Projekt, bei dem die GPIOs des ESP32 etwas
knapp werden. Daher habe ich mir mal den Port-Expander PCA9555 bestellt,
um verschiedene Buttons auszulesen.
Bisher habe ich das so gemacht, dass ich einen 1000Hz Hardware-Timer
verwendet habe, um die Buttons auszulesen. Noch bissl per Software
entprellt - hat wunderbar funktioniert. Gibt ja unterschiedliche Wege,
das Auslesen zu bewerkstelligen, aber ich hatte mehrfach gelesen, dass
es Sinn macht, dies über einen Timer zu tun, damit man immer
gleichbleibende Bedinungen hat.
Jetzt meine Frage: Wie macht man das denn am besten mit einem
Port-Expander? Auch über einen Timer oder sollte man hier eher den
Interrupt-Pin auswerten, den der PCA ja auch besitzt?
Danke im voraus.
Torsten schrieb:> Auch über einen Timer oder sollte man hier eher den> Interrupt-Pin auswerten, den der PCA ja auch besitzt?
Das kommt drauf an, was du in deinem "größeres Arduino-Projekt" mit dem
Port-Expander vor hast. Der Interrupt ist sinnvoll, wenn du den Port
nicht regelmäßig lesen willst, sondern nur auf Interrupt auslösende
Ereignisse reagieren möchtest.
Also es handelt sich um einen mp3-Player, den man mit Tasten bedienen
kann. Der besitzt auch einen Kopfhörerausgang, der beim Einstecken des
Steckers in die Buchse dafür sorgt, dass der Lautsprecher auf Mute
geschaltet wird. Das Erkennen, ab das der Fall ist, wäre ein
Anwendungsfall für den Port-Expander. Also kurzum: Da kommen immer mal
wieder "Eingaben", aber auch nicht dauernd.
Ich habe jetzt ehrlich gesagt noch kein Gefühl dafür, wie langsam oder
schnell sowas via Port-Expander geht. Anschließen würde ich den
Interrupt-Pin allerdings eh, da ich ihn zum Aufwachen des ESP32 brauche.
Also der geht zum Stromsparen nach einer Weile in den Deepsleep und mit
einer Taste weckt man den wieder auf.
Torsten schrieb:> Ich habe jetzt ehrlich gesagt noch kein Gefühl dafür, wie langsam oder> schnell sowas via Port-Expander geht.
Das siehst du im Datenblatt. Dort ist dargestellt, wie der Zugriff über
den Bus erfolgt und dann hängt es von der Taktfrequenz auf dem Bus ab,
wie lange es dauert. Ganz einfach ist die Frage zu beantworten, indem du
mit einem LA auf den Bus guckst.
Interrupt zum Aufwachen und dann in dem bestehenden timer Handler den
Expander auslesen. Kenne den ESP32 jetzt nicht so gut aber eventuell
könnte der ja per DMA den Expander in regelmäßigen abständen auslesen.
Und aufwachen halt per IRQ...
uwe schrieb:> Interrupt zum Aufwachen und dann in dem bestehenden timer Handler den> Expander auslesen.
So hab ich es auch umgesetzt. Ein 10ms-Timer, der den uC weckt,
uC-Eingänge einliest, den Portexpander ausliest und dann alles der
Entprell-Routine übergibt.
Grund war IMHO auch, dass nicht alle Eingänge am uC interrptfähig waren.
Und wenn ein Taster wirklich prellt, bekommt man evtl. auch Probleme, je
nach weiterer Auswertung.
Bad U. schrieb:> Gerade bei Benutzereingaben ist das ja meist recht gemütlich.
Ich hasse Fahrstuhlsteuerungen, bei denen man gefühlt "mehrere Sekunden"
auf die Taste tappen muss, damit die Pad-Eingabe heil durch die
Entprellung kommt.
Bad U. schrieb:> Die Abtastgeschwindigkeit muss halt zu Deiner Anwendung passen. Gerade> bei Benutzereingaben ist das ja meist recht gemütlich.
Aus diesem Grund bin ich ein Fan von HW-Entprellung :-)
Ein Standard C und ein R kosten nicht die Welt.
hans schrieb:> Ein Standard C und ein R kosten nicht die Welt.
Aber mehr als ein paar Zeilen Software, die hinterher ohne zusätzliche
Stückzahlkosten millionenfach kopiert werden kann.
hans schrieb:> Ein Standard C und ein R kosten nicht die Welt.
Ist aber recht unflexibel, wenn man sich an die passende Dauer rantasten
will. Je nach Schaltung brauchts auch noch nen Entladewiderstand. Sonst
bekommt man evtl. folgende Flanken nicht mit.