Hallo zusammen, ich möchte 4 Stück BCD-Codierschalter (je 4 Bit, also 5 Anschlüsse) abfragen. Dafür möchte ich natürlich keine 16 Pins am Mikrocontroller verwenden. Hat jemand eine Idee, wie man den Zustand aller vier Schalter mit möglichst wenigen Pins abfragen könnte, vielleicht so á la Matrixtastatur, aber wie konkret? Frank
Hallo Frank, wenn Du 4 Dioden je Schalter spendierst, braucht Du insgesamt 8 Pins.... Gruß Otto
Je weniger Port-Pins, desto mehr Aufwand. Mit 8 Ports: 4 Ports als Ausgänge wie ein Lauflicht aktivieren und mit den "Schleifern" jedes Schalters verbinden. Die Kontakte der Schalter über Dioden an 4 Input-Ports. Nachteil: 16 Dioden. oder 3 Ports: Die 16 Schaltkontakte an ein Schieberegister. Der eine Port sagt "Load", der andere Clock-Clock, und am dritten Port guckt man die Daten an. oder Port-Expander für einen seriellen Bus.
Ohne zusätzlich externe Bauteile, auch keine Dioden, mit 8 Portpins: Die Schleifer jeweils an ein Ausgangsportpin (nennen wir diese A1, A2, A3, A4) Die 4 Kontaktausgänge der Codierschalter an 4 Eingangspins (E1, E2, E3, E4) anschließen (entsprechende Kontaktausgänge sind dabei für alle vier Schalter untereinander verbunden). Die Eingänge E1, E2, E3, E4 werden softwaremäßig mit einem Pullup-Widerstand versehen (viele µC, z. B. der AVR, unterstützen dies). Von den Ausgängen A1, A2, A3, A4 wird nacheinander jeweils einer auf Low, die drei anderen hochohmig geschaltet. An den Eingängen, kann nun die Stellung des aktivierten Codierschalter gelesen werden. Beim AVR schaltest du Portpin hochohmig, indem du es als Eingang kofigurierst. Natürlich kann man die Anzahl der benötigten Portpins mit externer Beschaltung auf 1 reduzieren. Eine Möglichkeit wäre es, einen zweiten µC nach der oben beschriebenen Methode einzusetzen und die Ergebnisse periodisch seriell zu übertragen :)
...ist natürlich noch genialer...hab aber in den letzten paar Minuten schon die Dioden reingelötet :-). Ich machs nun ausserdem mit einem Portexpander PCF8574. Wahrscheinlich mit externen Pullups an den Eingängen (Schleifern), die dann auf low gezogen werden, weil ich mir nicht sicher bin, ob das bisschen Saft, das die PCFs abegeben können, für eine sichere Abfrage über die Dioden genügt. Frank
mit 2 ADCs könnte und 6 widerständen, sollte das auch Funktionieren.
@crazy horse: Nee, hast recht, funktioniert doch nicht. Entschuldigung an alle, falls ich Verwirrung gestiftet haben sollte :)
So..., guten Morgen zusammen! Habs nun mit nem PCF8574 realisiert. Immer 3 von 4 Ports ziehen nacheinander externe Pullups an den BCD-Codierschalter-Schleifern nach unten, weitere 4 Ports lesen die über 16 Dioden parallelgelegten Ausgänge. Leider kommt bisher Murks raus. Normalerweise schreibt man beim PCF8574 ja erstmal ne 0xff rein, um die Ports lesen zu können. Das lasse ich weg, schliesslich sollen ja 4 Ports weiterhin ihren "3-1"-Zustand an den Schleifern als Ausgang behalten. Oder kann es sein, dass der PCF8574 selbstständig alles auf eins (quasi als inerne Pullups) setzt, sobald man eine Leseaktion ankündigt, es also gar nicht möglich ist, gleichzeitig 4 Ports als Eingänge, die anderen 4 als Ausgänge zu benutzen? Hab allerdings gestern Nacht nicht mehr so lang rumprobiert und war auch nicht mehr der allerfitteste in der Birne, aber vielleicht hatte ja jemand von Euch schon ein ähnliches Problem. Frank
> Normalerweise schreibt man beim PCF8574 ja erstmal ne 0xff rein, um > die Ports lesen zu können. Genauer gesagt: Man schreibt in diejenigen Portbits, die man lesen möchte eine 1. > Das lasse ich weg Wenn in den Eingangsportbits eine 0 steht, kann das externe Signal nicht gelesen werden, es kommt immer eine 0 heraus. Angenommen, die Schleifer sind an P3 bis P7 angeschlossen und die Schalterausgänge an P0 bis P3, musst du in das Port-Register nacheinander folgende Werte schreiben: 0xef -> 1110 1111 0xdf -> 1101 1111 0xbf -> 1011 1111 0x7f -> 0111 1111 Dadurch wird immer genau einer der Schleifer auf Low gezogen, die Eingangsbits sind aber alle 1, so dass von den entsprechenden Pins gelesen werden kann.
ok, danke. Werds heute abend ausprobieren. Denke die oberen 4 Bits muss ich andersrum setzen. Besser gesagt ist eigentlich nur ne Software-Frage. Frank
irgendwie klappt das nicht. Lese an den 4 Eingangsbits immer 0x0f unabhängig von der Schleiferbeaufschlagung. Aber ist eigentlich auch klar: Wenn man die Eingänge auf 1 setzt, um sie zu lesen, wo soll da je eine 0 herkommen? Über die so gesehen in Sperrichtung liegenden Dioden kann ja nichts runtergezogen werden. Habs nun mal mit PullDown-Widerständen an den Eingängen probiert, war leider auch nix. Aber vielleicht waren 0,5 M auch'n bisschen viel... Frank
ja, wäre einfacher gewesen. Die 4 Schleifer fest an 5V, 16 Ausgänge über 2 PCFs abfragen. Wenns mit anderen PullDown-Widerständen nicht klappt, mach ich es so.
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.