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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.