Mehrere BCD-Codierschalter pinsparend abfragen

OP #565949
Lesenswert?

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
Gast #565960
Lesenswert?

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.
Gast #565975
Lesenswert?

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 :)
OP #565987
Lesenswert?

...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
OP #566160
Lesenswert?

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
Gast #566274
Lesenswert?

> 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.
OP #570066
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren