Forum: Mikrocontroller und Digitale Elektronik Mehrere BCD-Codierschalter pinsparend abfragen


von Frank Z. (frankovic)


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

von Otto (Gast)


Lesenswert?

Hallo Frank,

wenn Du 4 Dioden je Schalter spendierst,
braucht Du insgesamt 8 Pins....

Gruß Otto

von Tom (Gast)


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.

von Frank Z. (frankovic)


Lesenswert?

ok, vielen Dank.

Frank

von yalu (Gast)


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 :)

von Frank Z. (frankovic)


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

von Giradeli (Gast)


Lesenswert?

mit 2 ADCs könnte und 6 widerständen, sollte das auch Funktionieren.

von crazy horse (Gast)


Lesenswert?

@yalu: funktioniert nicht

von yalu (Gast)


Lesenswert?

@crazy horse: doch

von yalu (Gast)


Lesenswert?

@crazy horse:

Nee, hast recht, funktioniert doch nicht. Entschuldigung an alle, falls 
ich Verwirrung gestiftet haben sollte :)

von Frank Z. (frankovic)


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

von yalu (Gast)


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.

von Frank Z. (frankovic)


Lesenswert?

ok, danke. Werds heute abend ausprobieren. Denke die oberen 4 Bits muss 
ich andersrum setzen. Besser gesagt ist eigentlich nur ne 
Software-Frage.

Frank

von Frank Z. (frankovic)


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

von Peter D. (peda)


Lesenswert?

Warum nimmst Du nicht einfach 2 * PCF8574 und sparst Dir die 16 Dioden ?


Peter

von Frank Z. (frankovic)


Lesenswert?

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
Noch kein Account? Hier anmelden.