Hallo zusammen, ich suche eine einfache Möglichkeit bis zu 16 on-off-on Schalter mit einem µC zu lesen. Die ADC-Variante mit ADC des µC und pullup-pulldown geht nicht (weil belegt). Ideen: 1) man könnte eine externen I2C-ADC nehmen. Am besten einen, bei dem man wie etwa beim STM32Gxx pullup/pulldown gleichzeitig einschalten kann. 2) man könnte einen I2C-I/O Expander nehmen, wie etwa PI4IOE5V6416, bei dem man auch pullup oder pulldown einschalten kann, und man liest dann zweimal, einmal mit pu eingeschaltet und einmal mit pd eingeschaltet. Zu 1) habe ich keine ADC gefunden. Zu 2) scheint mir ok. Andere Ideen? Danke!
Man kann die als 8x4 Matrix verschalten und dann einlesen. Z.B. mit einem 74HC164 8 * nacheinander Low anlegen und auf 4 Pins mit Pullup einlesen. Das benötigt 6 IO-Pins. Sollen mehrere Taster gleichzeitig betätigt werden, müssen noch Dioden rein, damit keine Phantomtasten entstehen.
Ok, danke! Ich muss die Frage präzisieren: die Anbindung an den µC per I2C ist in meinem Fall sehr günstig, das I2C auf dem Board schon genutzt wird und der phys. Abstand zu den Schaltern nicht weit ist. Außerdem werden die Schalter sowieso auf einem einem getrennten Board untergebracht. Die Verbindung könnte ich nun über QWIIC (4-Draht) machen. Auf dem Board sitzen die Schalter und bspw. ein I2C-IO-Expander.
Ich finde die Alternative 2 gut. Braucht keine weiteren externen Bauteile, wenn man mit den 100 kOhm Pull-up/Pull-down leben kann.
Loco M. schrieb: > Ich finde die Alternative 2 gut. Braucht keine weiteren externen > Bauteile, wenn man mit den 100 kOhm Pull-up/Pull-down leben kann. Das hoffe ich schon, denn die Schalter und der IO-Expander sollen auf dasselbe kleine Board. Aber vllt gibt es ja IO-Expander, die kleinere PU/PD haben?
Auf jeden Fall mehrfach einlesen, und nicht nur 2x. Wenn dann noch die Verbindungen zwischen Expander und Schalter kurz sind sollte das schon funktionieren.
Peter D. schrieb: > müssen noch Dioden rein Wenn man Dioden nimmt, kann man auch mit nur 6 Pins charlieplexen.
Moin, vielleicht könnte man einen ATtiny z.B. 4213 als I2C Slave laufen lassen. Der hätte dann 15 (16) freie Eingänge und Du kannst ihn programmieren. Das funktioniert bei mir problemlos. Gruß Carsten
Mario M. schrieb: > Wenn man Dioden nimmt, kann man auch mit nur 6 Pins charlieplexen. Reicht aber nicht für 32 Kontakte (16 * on-off-on).
Mario M. schrieb: > Dann eben mit 7 Pins. Zeig mal wie das gehen soll Wir haben 32 Kontakte, davon können bis zu 16 gleichzeitig geschlossen sein (16 * on-off-on).
Wie die LEDs beim Charlieplexing, die Dioden antiparallel. Dann immer einen Ausgang auf L und die anderen auf Eingang mit Pullup. Oder hab ich noch nen Denkfehler? P.S. War wohl auf dem Holzweg. Beim Charlieplexing von Schaltern ist trotzdem Ghosting möglich. Der Trick bei den LEDs besteht im Tristate der Ausgänge. Danke für den Wink mit dem Zaunspfahl. https://github.com/thanks4opensource/markoplexing
:
Bearbeitet durch User
Wenn es denn I²C sein muss, nimm halt was wie den MCP23017. Dann hast Du schon mal 2 Ausgänge und 14 Eingänge. Dazu noch sowas wie ein 74xx153 und ein paar Transistoren oder OC-Inverter und alles bleibt digital.
Flunder schrieb: > Wenn es denn I²C sein muss, nimm halt was wie den MCP23017. Dann hast Du > schon mal 2 Ausgänge und 14 Eingänge. Dazu noch sowas wie ein 74xx153 > und ein paar Transistoren oder OC-Inverter und alles bleibt digital. Es muss nicht I2C sein, ist aber als 2-Draht sehr sparsam. Warum sollte ich den MCP23016/17/18 nehmen, wenn ich mit einem PI4IOE5V6416 tatsächlich alles realisieren kann (s.o.)?
Randy B. schrieb: > man könnte eine externen I2C-ADC nehmen. Am besten einen, bei dem man > wie etwa beim STM32Gxx pullup/pulldown gleichzeitig einschalten kann. Ein ADC mit pullup/pulldown am Eingang klingt etwas widersinnig, weil die gegen die Meßgröße arbeiten würden. Randy B. schrieb: > die Anbindung an den µC per I2C ist in > meinem Fall sehr günstig, das I2C auf dem Board schon genutzt wird Was bedeutet denn on-off-on? Ich interpretiere, dass Du drei Zustände lesen willst, Low-Open-High? Damit fallen digitale I2C-Expander aus, weil offen unzulässig ist. Du hast dann pro Schalter zwei Widerstände und entweder High, halbe Spannung oder low - da müssen Analogeingänge her. Jetzt musst Du nur noch einen AD finden, der genug Eingänge hat oder 4 Stück ADS1015 oder PCF8591 einsetzen. Oder einen Analogmultiplexer aufbauen, das werden noch mehr Bauteile.
Manfred P. schrieb: > Randy B. schrieb: >> man könnte eine externen I2C-ADC nehmen. Am besten einen, bei dem man >> wie etwa beim STM32Gxx pullup/pulldown gleichzeitig einschalten kann. > > Ein ADC mit pullup/pulldown am Eingang klingt etwas widersinnig, weil > die gegen die Meßgröße arbeiten würden. Wohl kaum: der PU ist 100k, die "Meßgröße" ist ein Schalter mit ungefähr 0Ohm. > Randy B. schrieb: >> die Anbindung an den µC per I2C ist in >> meinem Fall sehr günstig, das I2C auf dem Board schon genutzt wird > > Was bedeutet denn on-off-on? Ich interpretiere, dass Du drei Zustände > lesen willst, Low-Open-High? Damit fallen digitale I2C-Expander aus, > weil offen unzulässig ist. Quatsch. > Du hast dann pro Schalter zwei Widerstände > und entweder High, halbe Spannung oder low - da müssen Analogeingänge > her. Ich habe oben beschrieben, wie das geht. > Jetzt musst Du nur noch einen AD finden, der genug Eingänge hat oder 4 > Stück ADS1015 oder PCF8591 einsetzen. Oder einen Analogmultiplexer > aufbauen, das werden noch mehr Bauteile. Genau diese Frage habe ich oben gestellt: "danke" für die Wiederholung.
3) statt PI4IOE5V6416 einen uC mit Analog-Eingängen und UART verwenden. - Entprellung passiert auf der Schalter-Platine, über das Kabel geht nur genau ein Zeichen bei einer Änderung einer Schalterstellung -> der Hauptprozessor muss nicht pollen. - optimale EMV (kein externer Multiplexer) - keine exotischen Bauteile - wenn's sein muss, noch ein Signal weniger als mit I2C
Die GPIO Extender MCP230xx habe ich schon öfter verwendet. Funktionieren prima.
Peter schrieb: > Die GPIO Extender MCP230xx habe ich schon öfter verwendet. Funktionieren > prima. Na prima ... erfüllt aber meine Anforderungen nicht.
Bauform B. schrieb: > 3) statt PI4IOE5V6416 einen uC mit Analog-Eingängen und UART verwenden. > - Entprellung passiert auf der Schalter-Platine, über das Kabel geht nur > genau ein Zeichen bei einer Änderung einer Schalterstellung -> der > Hauptprozessor muss nicht pollen. > - optimale EMV (kein externer Multiplexer) > - keine exotischen Bauteile > - wenn's sein muss, noch ein Signal weniger als mit I2C Ja, das war meine erste Idee ... geht auch, wenn ich noch einen Uart-Rx frei bekomme.
Manfred P. schrieb: > Was bedeutet denn on-off-on? Gewöhnlich bedeutet das, dass es sich um einen Umschalter handelt, der zusätzlich eine Mittelstellung besitz, in der keiner der beiden Kontakte geschlossen ist. Mit Low/High hat das nichts zu tun. Der Schalter hat mehr als zwei Zustände, die digital erfasst werden sollen. Welche Pegel sich hinter den Stellungen verbergen, ist völlig egal und bei Platzierung in einer Matrix können das beliebig wechselnde Logiklevel sein - je nach Steuerzustand.
HT16K33..list bis zu 39 Schalter ein. Ansteuerung über I2C. Ganz nebenbei könnte der auch noch 16 Stück 7-Segment-Displays ansteuern. https://cdn-shop.adafruit.com/datasheets/ht16K33v110.pdf
Randy B. schrieb: > Na prima ... erfüllt aber meine Anforderungen nicht. Dann nenne mal Deine seltsamen Anforderungen. 32 Kontakte geht doch prima als 8*4 Matrix am MCP230xx oder auf GND bezogen an 2 Stück. Randy B. schrieb: > 2) man könnte einen I2C-I/O Expander nehmen, wie etwa PI4IOE5V6416, bei > dem man auch pullup oder pulldown einschalten kann, und man liest dann > zweimal, einmal mit pu eingeschaltet und einmal mit pd eingeschaltet. Was soll das bringen? Dem geschlossenen Kontakt ist die Polung vollkommen wurscht.
Mario M. schrieb: > Er will die Mittelstellung des Umschalters erkennen. Die Mittelstellung ist beide Kontakte offen. Und dafür gibt es im MCP230xx den Pullup.
Er will doch pro Umschalter nur einen Digitaleingang verwenden. Der eine Kontakt zieht auf L, der andere auf H und den Pull-Up/Down braucht es zur Erkennung der Mittelstellung (Z).
Ich werfe mal den PCAL6408 in den Raum: 8 Bit I2C IO Expander mit 100k Pull up/down. Da sollten zwei für ausreichen.
Andreas M. schrieb: > Ich werfe mal den PCAL6408 in den Raum: 8 Bit I2C IO Expander mit 100k > Pull up/down. Da sollten zwei für ausreichen. ... deswegen hatte ich oben den ...6416 vorgeschlagen. Dann brauche ich dafür nur einen, und keine weiteren externen Bauteil wie Entkoppelungsdioden.
Randy B. schrieb: > ... deswegen hatte ich oben den ...6416 vorgeschlagen. Dann brauche ich > dafür nur einen, und keine weiteren externen Bauteil wie > Entkoppelungsdioden. Hab ich übersehen. Ja der taugt dann ja noch besser.
Mario M. schrieb: > Der eine > Kontakt zieht auf L, der andere auf H Dann braucht man aber Schalter, die brake before make garantieren. Einen Schutzwiderstand in die 5V würde ich aber trotzdem vorsehen.
Peter D. schrieb: > Dann braucht man aber Schalter, die brake before make garantieren. Randy B. schrieb: > bis zu 16 on-off-on Schalter Check! ☑️
Randy B. schrieb: > Andere Ideen? Da du die meisten deiner Rahmenbedingungen verschweigst: nein Keiner weiss, wie viele Digitalpins dein uC übrig hätte, um die Decodierung zu übernehmen, inklusive Pins die zwar mit anderem (Display...) belegt sind aber dual use verwendbar wären. Niemand weiss, ob das mit Bauteilen gehen muss die du zu Hause rumliegen hast, bei Reichelt bestellen könntest, oder ob LCSC als Quelle ausreicht. Selbst wenn deine Analogeingänge alle belegt sind gibt es manchmal die Möglichkeit dass ein Analogkomparator noch frei ist und benutzt werden könnte, vor allem wenn man viel Zeit zum Einlesen hat. Keiner weiss, welche Platz oder Versorgungsspannungsanforderungen du noch nachschieben wirst.
Mario M. schrieb: > Randy B. schrieb: >> bis zu 16 on-off-on Schalter Daß die Schalter statisch eine Off-Position haben, glaub ich Dir gerne. Es muß aber auch mechanisch garantiert sein, daß eine Kontaktfeder beim Betätigen nicht bis zum 2. Kontakt hinüber schwingt. Insbesondere, da ja heutzutage alles möglichst klein und billig sein soll, werden die Abstände immer weiter minimiert.
Ist ja alles richtig, was Du schreibst, aber die Schaltung war ja die Idee des TO. Jeder andere nimmt die Version mit der Matrix, egal ob mit extra Mikrocontroller, Portextender oder Schieberegister.
Für mich ist die Lösung klar und ist meine ursprüngliche Idee. Aber ich kann gerne jetzt noch hinzufügen: 1) möglichst geringe Anzahl von Verbindungen zum Main-Board. 2) möglichst geringe Anzahl von Bauteilen. Es darf weiter gehen ...
Randy B. schrieb: > 1) möglichst geringe Anzahl von Verbindungen zum Main-Board. > 2) möglichst geringe Anzahl von Bauteilen. 1 * 16 Bit I2C-IO-Expander (PCF8575, MCP23017, TCA6416A, ...) 3 Leitungen zum MC (I2C + 1 * Output-Pin). Ein Kontakt geht direkt an GND, der andere an den Output. Und dann 2 * 16 Bit einlesen (Pullups on), einmal mit Output Low und einmal tristate.
Randy B. schrieb: > Aber ich kann gerne jetzt noch hinzufügen: Salamischeiben !! > möglichst geringe Anzahl von Verbindungen zum Main-Board. Also 2: Masse und single wire. > möglichst geringe Anzahl von Bauteilen. Also 1 (das dann mindestens 35 Anschlüsse hat). Leider hat der DS2408 nur 8. Sieht also nach custom chip aus. Na ja, die Salamischeibe gibt es ja nicht, geht also
:
Bearbeitet durch User
Randy B. schrieb: > 2) möglichst geringe Anzahl von Bauteilen. Zwei, ein 100n und ein PCA9505. Der hat 40 Eingänge mit internem Pull-Up, I2C und einen Interrupt-Ausgang. Wenn man das eine Signal zusätzlich spendiert, muss man nur nach einem Interrupt per I2C einmal abfragen. Bonus: echte Eingangsschutzdioden, die ±20mA vertragen.
:
Bearbeitet durch User
Bauform B. schrieb: > Randy B. schrieb: >> 2) möglichst geringe Anzahl von Bauteilen. > > Zwei, ein 100n und ein PCA9505. Ja, die habe ich mit dem PCA6416 (s.o.) auch. Oder mit einem G030 im 20-pol Gehäuse mit der Freiheit, über seriell zu gehen (3-ppol Verbinding). > Der hat 40 Eingänge mit internem > Pull-Up, I2C und einen Interrupt-Ausgang. Wenn man das eine Signal > zusätzlich spendiert, muss man nur nach einem Interrupt per I2C einmal > abfragen. Ich bleibe bei den Qwiic-Steckern, auch kann ich mit dem polling gut leben.
Michael B. schrieb: > Also 1 (das dann mindestens 35 Anschlüsse hat). Ach Du lieber Himmel, ohne Stützkondensator ... nanana
Peter D. schrieb: > 1 * 16 Bit I2C-IO-Expander (PCF8575, MCP23017, TCA6416A, ...) > 3 Leitungen zum MC (I2C + 1 * Output-Pin). Und bei Dir kommt die Versorgung dann auch aus der Batterie? Nenene ...
Randy B. schrieb: > Michael B. schrieb: >> Also 1 (das dann mindestens 35 Anschlüsse hat). > > Ach Du lieber Himmel, ohne Stützkondensator ... nanana Randy B. schrieb: > Peter D. schrieb: >> 1 * 16 Bit I2C-IO-Expander (PCF8575, MCP23017, TCA6416A, ...) >> 3 Leitungen zum MC (I2C + 1 * Output-Pin). > > Und bei Dir kommt die Versorgung dann auch aus der Batterie? Nenene ... Verarschst Du die User hier, oder trollst Du einfach nur? Michael B. schrieb: > Randy B. schrieb: >> Aber ich kann gerne jetzt noch hinzufügen: > > Salamischeiben !! Ja, aber vegan.
:
Bearbeitet durch User
Randy B. schrieb: > Und dann batteriebetrieben, oder was ;-) Zu blöd, dir das genannte IC DS2408 anzugucken ?
Randy B. schrieb: > Oder mit einem G030 im 20-pol Gehäuse mit der Freiheit, > über seriell zu gehen (3-ppol Verbinding). STM32G030? In dem Fall wäre eine 4-polige Verbindung interessant, also UART-TX und -RX. Dann könnte man den internen Bootloader nutzen. Die Umschaltung Bootloader/Anwendung muss man nicht mit dem BOOT-Pin machen, der kann fest mit VDD verbunden sein. Der G030 startet dann immer erst den Bootloader und im normalen Betrieb sendet die Hauptplatine den Bootloader-Befehl "GO 0x08000000".
Michael B. schrieb: > Randy B. schrieb: >> Und dann batteriebetrieben, oder was ;-) > > Zu blöd, dir das genannte IC DS2408 anzugucken ? Michael B. schrieb: > Leider hat der DS2408 nur 8. Sieht also nach custom chip aus. Warum sollte ich mir das DB anschauen, wenn Du als Oberexperte das schon ausschließt. Übrigens heißt es one-wire oder 1-wire Hach, ich liebe dieses Forum mit seinen selbsternannten Gurus ;-)
Randy B. schrieb: > Jörg R. schrieb: >> >> Verarschst Du die User hier, oder trollst Du einfach nur? >> > > Sischer ;-) Ich habe nur mal im Internet geschaut, was randy noch bedeutet.
Peter schrieb: > Ich habe nur mal im Internet geschaut, was randy noch bedeutet. Wow. Echt, im Internet ... irre!
Randy B. schrieb: > Peter schrieb: >> Ich habe nur mal im Internet geschaut, was randy noch bedeutet. > > Wow. Echt, im Internet ... irre! Schön das wir helfen konnten. So macht ein Thread Spass🤥
Jörg R. schrieb: > Schön das wir helfen konnten. So macht ein Thread Spass🤥 Ja, zwar nicht nicht fachlich ... und Deine Beiträge spielten dabei ein große Rolle.
Randy B. schrieb: > Jörg R. schrieb: >> Schön das wir helfen konnten. So macht ein Thread Spass🤥 > > Ja, zwar nicht nicht fachlich ... Falsch. Du hast hier von einigen Usern Vorschläge und Lösungsansätze erhalten. Die interessieren Dich aber scheinbar nicht. Eine fertige Schaltung wird DIR hier niemand präsentieren, so wie Du hier auftrittst. > und Deine Beiträge spielten dabei ein große Rolle. Wieder falsch. Ich habe den HT16K33 vorgeschlagen. Zu mehr hatte ich allerdings keine Lust mehr, der Grund dafür steht weiter oben. Ich kann mir auch nicht vorstellen dass in diesem Thread noch viel passiert, was ganz allein an Dir liegt. Du bist auch schon >6 Jahre im Forum angemeldet, wenn auch mit sehr wenigen Beiträgen. Port-Expander, Schieberegister (parallel In, seriell Out) usw. solltest Du daher schon mal gehört haben.
:
Bearbeitet durch User
Jörg R. schrieb: > Randy B. schrieb: >> Jörg R. schrieb: >>> Schön das wir helfen konnten. So macht ein Thread Spass🤥 >> >> Ja, zwar nicht nicht fachlich ... > > Falsch. Du hast hier von einigen Usern Vorschläge und Lösungsansätze > erhalten. Die interessieren Dich aber scheinbar nicht. Eine fertige > Schaltung wird DIR hier niemand präsentieren, so wie Du hier auftrittst. Falsch. Ich habe sie mit Interesse zur Kenntnis genommen, allerdings waren sie nicht einfacher, eleganten, billiger als meine im Eingangspost beschriebene Variante. >> und Deine Beiträge spielten dabei ein große Rolle. > > Wieder falsch. Ich habe den HT16K33 vorgeschlagen. Zu mehr hatte ich > allerdings keine Lust mehr, der Grund dafür steht weiter oben. Falsch. Der HT16K33 hat mich aus den o.g. Gründen nicht interessiert. > Ich kann mir auch nicht vorstellen dass in diesem Thread noch viel > passiert, was ganz allein an Dir liegt. Falsch. Die einfache Lösung steht in meinem Eingangsbeitrag. > Du bist auch schon >6 Jahre im Forum angemeldet, wenn auch mit sehr > wenigen Beiträgen. Port-Expander, Schieberegister (parallel In, seriell > Out) usw. solltest Du daher schon mal gehört haben. Ja, wie Du im Eingangspost schon lesen konntest.
Randy B. schrieb: > Jörg R. schrieb: >> Randy B. schrieb: >>> Jörg R. schrieb: >>>> Schön das wir helfen konnten. So macht ein Thread Spass🤥 >>> >>> Ja, zwar nicht nicht fachlich ... >> >> Falsch. Du hast hier von einigen Usern Vorschläge und Lösungsansätze >> erhalten. Die interessieren Dich aber scheinbar nicht. Eine fertige >> Schaltung wird DIR hier niemand präsentieren, so wie Du hier auftrittst. > > Falsch. > Ich habe sie mit Interesse zur Kenntnis genommen, Merkt man gar nicht. > allerdings waren sie nicht einfacher, eleganten, billiger als meine > im Eingangspost beschriebene Variante. Das sind ja gleich 3 Wünsche auf einmal. Billi ist dabei natürlich ganz wichtig, denn die vorgeschlagenen Lösungen sind ja unbezahlbar. >>> und Deine Beiträge spielten dabei ein große Rolle. >> >> Wieder falsch. Ich habe den HT16K33 vorgeschlagen. Zu mehr hatte ich >> allerdings keine Lust mehr, der Grund dafür steht weiter oben. > > Falsch. Der HT16K33 hat mich aus den o.g. Gründen nicht interessiert. Dann kann man das auch ruhig mal schreiben. >> Ich kann mir auch nicht vorstellen dass in diesem Thread noch viel >> passiert, was ganz allein an Dir liegt. > > Falsch. Die einfache Lösung steht in meinem Eingangsbeitrag. Dann setze sie um.
Randy B. schrieb: > 1) man könnte eine externen I2C-ADC nehmen. Am besten einen, bei dem man > wie etwa beim STM32Gxx pullup/pulldown gleichzeitig einschalten kann. Das Reference Manual RM0444 sagt dazu:
1 | 7.3.12 Analog configuration |
2 | When the I/O port is programmed as analog configuration: |
3 | • The output buffer is disabled |
4 | • The Schmitt trigger input is deactivated, (...) |
5 | • The weak pull-up and pull-down resistors are disabled by hardware |
Aber als Digital Input konfigurieren, umschalten und zweimal lesen geht natürlich immer noch viel besser als per I2C.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.