Forum: Mikrocontroller und Digitale Elektronik Suche Bauteil: 4 Schalter mit 2 uC-Pins abfragen


von Dennis (Gast)


Lesenswert?

Hallo Leute!

Ich habe ein Problem...mein uC hat noch zwei Pins frei und ich muss drei 
Schalter abfragen - ergo fehlt ein Eingang.

Gibt es ein Bauteil, durch welches ich die Schalter abfragen kann? Ob 
ich high oder low-Pegel abfrage ist mir egal, das kann ich in Software 
dann anpassen.
1
S3  S2  S1
2
3
0   0   0
4
0   0   1
5
0   1   0
6
0   1   1
7
1   0   0
8
1   0   1
9
1   1   0
10
1   1   1

Gibt es da irgendeinen weg? Ich habe ja acht Möglichkeiten, also 
bräuchte ich theoretisch 3 Eingänge...gut ist klar, sind auch drei 
Schalter. Aber: kann ich die jetzt irgendwie verschalten, dass ich mit 
zwei Eingängen auskomme?

von Dennis (Gast)


Lesenswert?

Och ich Trottel, jetzt steht im Titel "vier Schalter", sorry! Es sind 
drei!

von Eumel (Gast)


Lesenswert?

Nimm doch ein Schieberegsiter, dann kannst du (bei Bedarf) noch ein paar 
mehr Schalter dran hängen.

von Martin H. (martinhaag)


Lesenswert?

Die vorhandenen Eingänge als Analogeingänge verwenden?

von MiWi (Gast)


Lesenswert?

Dennis schrieb:
> Hallo Leute!
>
> Ich habe ein Problem...mein uC hat noch zwei Pins frei und ich muss drei
> Schalter abfragen - ergo fehlt ein Eingang.
>
> Gibt es ein Bauteil, durch welches ich die Schalter abfragen kann? Ob
> ich high oder low-Pegel abfrage ist mir egal, das kann ich in Software
> dann anpassen.
> S3  S2  S1
>
> 0   0   0
> 0   0   1
> 0   1   0
> 0   1   1
> 1   0   0
> 1   0   1
> 1   1   0
> 1   1   1
>
> Gibt es da irgendeinen weg? Ich habe ja acht Möglichkeiten, also
> bräuchte ich theoretisch 3 Eingänge...gut ist klar, sind auch drei
> Schalter. Aber: kann ich die jetzt irgendwie verschalten, dass ich mit
> zwei Eingängen auskomme?

wenn Du einen Analogeingang frei hast kommst Du mit ein paar 
Widerständne und einem Eingang aus. Wenn Du keinen Analogeingang aber 
einen Komperator frei hast dann könntest Du das mittels RC-Zeiten 
machen.

Grüße

MiWi

von Jürgen D. (poster)


Lesenswert?

Das würde recht einfach gehen wenn du Pins mit AD Wandler funktion frei 
hättest. Oder kanst du vielleicht noch ein Ausgangspin, z.B. für eine 
LED mit verwenden für einen Multiplexer. Für das kurze abfragen einens 
Schalters sieht man das Flackern der LED nicht.
Ich benutze die Ausgänge für eine 3x4 Tastaturmatrix auch gleich mit für 
LEDs.

von Bastler (Gast)


Lesenswert?

@Eumel

Zum Anschluss eines Schieberegisters (z.B.: HC166) benötigt er aber auch 
drei Pins.

von Dennis (Gast)


Lesenswert?

Also nen 74hc165 oder ähnliches? Ich habe halt drei Taster, keinen mehr 
und keinen weniger. Ein 8-Bit-Schieberegister wäre da eigentlich 
oversized. Außerdem...komme ich bei der Ansteuerung des Schieberegisters 
mit zwei Pins aus?

von Dennis (Gast)


Lesenswert?

Oh, da kommen ja schon weitere Vorschläge. Also: einen Pin kann ich 
nicht frei machen, nein. Aber die Sache mit dem AD-Wandler hört sich 
interessant an. Einer der Pins ist tatsächlich am Wandler.

Um mal konkreter zu werden:

Ich habe drei Taster, welche mir verschiedene Funktionen, welche 
eigentlich durch den uC gesteuert werden, auf manuell, bzw. ausschalten 
können. Da es eine Ausgabe über RS232 gibt, fände ich es natürlich ganz 
gut, wenn der uC auch erkennt, dass der Schalter betätigt ist.

Ich wollte daher zweipolige Umschalter verwenden (EIN-EIN), wobei der 
eine Pol den eigentlichen Signalweg umschaltet und der andere wäre zum 
Umschalten einer DUO-LED von grün nach rot. Das ganze halt dreimal. 
Diesen Weg habe ich gewählt, da mir eben die Pins am uC fehlen und ein 
anderer kommt auch nicht in Frage. Sonst würde ich die LEDs ja auch noch 
durch den uC steuern.

Ideal wäre natürlich: Abfragen der drei Schalter durch den uC, sowie 
steuern der 6 LEDs (weil Duo) durch den uC. Aber selbst für die LEDs mit 
einem SR wie dem 595 bräuchte ich drei Pins.

Das ist der Hintergrund für die zweipoligen Umschalter. Aber wie gesagt, 
einen Wandlerpin habe ich noch frei bei den beiden. Wie arrangiere ich 
das jetzt am besten? An jeden Schalter einen Spannungsteiler, jeweils 
mit unterschiedlichen Werten und diese dann im Mittelpunkt 
zusammenfügen. Dann ergibt sich für jede Schalterkombi ein anderer 
Spannungswert am Mittelpunkt?

von Eumel (Gast)


Lesenswert?

Bastler schrieb:
> @Eumel
>
> Zum Anschluss eines Schieberegisters (z.B.: HC166) benötigt er aber auch
> drei Pins.

Ein I2C Modell wäre doch auch eine Lösung, da braucht er nur zwei. Und 
um Taster abzufragen ist I2C in Software auch noch mehr als ausreichend 
schnell.

von Dennis (Gast)


Lesenswert?

Eumel schrieb:
> Ein I2C Modell wäre doch auch eine Lösung, da braucht er nur zwei.

OK, hast Recht. Leider fungiert mein uC als I²C-Slave und muss jederzeit 
auf einen Master reagieren, da kann ich nicht einfach mal zwischendurch 
auf Master umschalten und was anderes mit dem I²C machen. Aber danke für 
den Tip.

von Eumel (Gast)


Lesenswert?

Dennis schrieb:
> OK, hast Recht. Leider fungiert mein uC als I²C-Slave und muss jederzeit
> auf einen Master reagieren, da kann ich nicht einfach mal zwischendurch
> auf Master umschalten und was anderes mit dem I²C machen. Aber danke für
> den Tip.

Du kannst an den zwei frei Pins ja noch ein software I2C implementieren.

von siggi (Gast)


Lesenswert?

S1------o--o
        |  |
        V  V
        |  |
S2-->---o--+----IN1
           |
S3-->------o----IN2

von Dennis (Gast)


Lesenswert?

Auch ne Variante, stimmt.

Aber jetzt würde ich erstmal gerne die Geschichte mit den Widerständen 
am AD-Wandler probieren, weil dann hätte ich sogar noch einen Pin frei.

Daher brauche ich nochmal eure Hilfe. Wie jetzt am besten? Was für 
Widerstände in welcher Kombination? Mein AD-Wandler kann maximal 600mV 
verarbeiten. Als Versorgung habe ich 3,3V. Diese über einen 
Spannungsteiler? Ich muss ja irgendwie sicher detektieren könne, welcher 
Schalter geschlossen ist und welcher nicht.

von Dennis (Gast)


Lesenswert?

siggi schrieb:
> S1------o--o
>         |  |
>         V  V
>         |  |
> S2-->---o--+----IN1
>            |
> S3-->------o----IN2

Das verstehe ich nicht so ganz. Wie erkennt man dann, ob S1 oder S2+S3 
geschaltet sind?

von Karl H. (kbuchegg)


Lesenswert?

> Ideal wäre natürlich: Abfragen der drei Schalter durch den uC, sowie
> steuern der 6 LEDs (weil Duo) durch den uC

Hier wäre eventuell auch noch ein Ansatzpunkt um µC-Pins freizukriegen.
Um eine Duo-Led von rot nach grün umzuschalten (aber nicht aus), 
brauchst du nicht notwendigerweise 2 Pins.

von Dr.Who (Gast)


Lesenswert?

siggi schrieb:
> Datum: 03.04.2013 13:15
>
>       S1------o--o
>
>         |  |
>
>         V  V
>
>         |  |
>
> S2-->---o--+----IN1
>
>            |
>
> S3-->------o----IN2


Das ist doch nicht eindeutig?

von Dr.Who (Gast)


Lesenswert?

Und zum Problem selbst.. in den meisten Fällen fährst du besser, wenn du 
den µC ersetzt.

Die Chance, dass dir auf einmal noch was in den Sinn kommt, was du 
benötigst ist relativ gross.

von Dennis (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hier wäre eventuell auch noch ein Ansatzpunkt um µC-Pins freizukriegen.
> Um eine Duo-Led von rot nach grün umzuschalten (aber nicht aus),
> brauchst du nicht notwendigerweise 2 Pins.

Ich habe die LEDs ja momentan garnicht am uC, also verbrauchen die auch 
keine Pins. Aber trotzdem interessehalber: Wie würde ich die dann 
verschalten?

von Dennis (Gast)


Lesenswert?

Dr.Who schrieb:
> Und zum Problem selbst.. in den meisten Fällen fährst du besser, wenn du
> den µC ersetzt.

Da gebe ich dir vollkommen Recht! Aber das geht nunmal nicht. Mehr 
dazukommen wird definitiv auch nicht. Ursprünglich war es nur mit den 
Schaltern und den zwei freien Pins, ohne Rückmeldung an den uC. Das 
würde ich jetzt aber gerne noch ändern.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

1-wire --> ds2408

von Dennis (Gast)


Lesenswert?

Uwe Berger schrieb:
> 1-wire --> ds2408

Auch nicht schlecht. Danke! Werde ich mir auch mal anschauen.

Dennoch: Kann mir grad erstmal jemand mit den Widerständen helfen? Wie 
das am sinnvollsten realisiert wird?

von Dr.Who (Gast)


Lesenswert?

Ach so.. ja dann wird die ADC Geschichte wohl das klügste sein!
Musst ja nicht alle 10ns abfragen nehme ich an..

von Jürgen D. (poster)


Lesenswert?

Ohne da mal groß zu Rechnen, nur so als erster ansatz:
Spannungsteiler R1=47K von VPlus zu Mittelpunkt.
Von Mittelpunkt drei Wiederstande R21, R22 und R23 jeweils mit Schalter 
in Reihe gegen GND.
R21=10K, R22=47K, R23=100K.

von Dennis (Gast)


Lesenswert?

Dr.Who schrieb:
> Ach so.. ja dann wird die ADC Geschichte wohl das klügste sein!
> Musst ja nicht alle 10ns abfragen nehme ich an..

Nee, auf keinen Fall, da reicht es sekündlich, vielleicht 
1/2-sekündlich. Geht nur um die Position von dem Schalter. Sorry, ich 
sehe gerade, ich schreibe hin und wieder mal Taster. Aber es sind 
Schalter mit Rastfunktion. Da erfolgt kein schnelles hin und 
herschalten.

Jürgen D. schrieb:
> Spannungsteiler R1=47K von VPlus zu Mittelpunkt.
> Von Mittelpunkt drei Wiederstande R21, R22 und R23 jeweils mit Schalter
> in Reihe gegen GND.
> R21=10K, R22=47K, R23=100K.

Vielen Dank! Das ist ja schonmal was, auf dem ich aufbauen kann. Muss 
das nur ein wenig umbasteln, da der Schalter gegen Vcc schaltet (Die 
LEDs habe eine gemeinsame Kathode).

von Jürgen D. (poster)


Lesenswert?

Drehst halt die ganze Schaltung um.
- VCC auf Schalter
- Schalter auf R21,22,23
- R21-22-23 auf Mittelpunkt
- R1 vom Mittelpunkt auf GND

Die genauen Widerstandswerte muß man halt mal ausprobieren,
Kommt halt darauf an das die verschiedenen Schalterkombinationen schon 
unterschiedliche Spannungswerte am Mittelpunkt bringen.
Da würde ich so Wertefenster programmieren, wenn zwischen xxx und yyy 
dann S1=1, S2=0, S3=1 u.s.w.

von Dennis (Gast)


Lesenswert?

So, doch etwas schwieriger als gedacht...:-\

Also mein Konstrukt sieht so aus:
1
         3V3
2
          |
3
  ----------------
4
 |        |       |
5
 |        |       |
6
 \        \       \
7
  \ S1     \ S2    \ S3
8
 |        |       |
9
 |        |       |
10
 R1       R2      R3
11
 |        |       |
12
  ---------------------------> ADC
13
          |
14
          R3
15
          |
16
         GND

Mein ADC kann maximal 600mV, ich habe wegen der besseren Teilung jetzt 
mal 560mV als Maximum genommen. R3 daher als 560R für einen Strom von 
1mA. Unten in der Tabelle sind jetzt mal die Schaltervarianten und der 
erforderliche Gesamtwiderstand von R1 + R2 + R3 zu sehen:

Also habe ich:
1
S1  S2  S3    U[mV]    Rges
2
3
0   0   0       0      undendlich
4
0   0   1      80      22k54
5
0   1   0     160      10k99
6
0   1   1     240       7k14
7
1   0   0     320       5k215
8
1   0   1     400       4k06
9
1   1   0     480       3k29
10
1   1   1     560       2k74

So...soweit so gut, aber da sehe ich nicht wirklich ein weiterkommen bei 
einer sinnvollen Bestimmung der Einzelwiderstände R1, R2 und R3. Kann 
mir da jemand helfen?

Theoretisch müsste es ja wie bei einem R2R-Netzwerk gehen, aber mein 
Schalter kann ja nicht zwischen Vcc und Masse hin- und herschalten, 
sondern nur auf oder zu.

:-\

von Dennis (Gast)


Lesenswert?

Leider kann ich nicht einfach die Werte 22k54, 10k99 und 5k215 
nehmen...das passt nicht.

von Jürgen D. (poster)


Lesenswert?

Du hast 2 R3.
Nennen wir den gegen GND mal R4 =560

Dann mach mal R1=22K, R2=10K, R3=4K7
Rechne da mal die Kombinationen aus. die Zuordnung zu den 
Schalterstellung
nicht ganz so in der Reihenfolge, dürfte aber von der software kein 
Problem sein.
Die Spannungsstufen müssen auch nicht unbedingt immer gleich groß sein.

von Dennis (Gast)


Lesenswert?

Jürgen D. schrieb:
> Du hast 2 R3.
> Nennen wir den gegen GND mal R4 =560

Stimmt, sorry, nennen wir ihn R4

Jürgen D. schrieb:
> die Zuordnung zu den
> Schalterstellung
> nicht ganz so in der Reihenfolge

Das ist ja egal.

Jürgen D. schrieb:
> Dann mach mal R1=22K, R2=10K, R3=4K7

Wie kommst du denn auf diese Werte? Gibt es einen sinnvollen Rechenweg? 
Klar reichen Fenster für die Detektion, feste Werte gehen ja sowieso 
nicht. Dennoch würde ich ja gerne den rechnerischen Hintergrund dazu 
verstehen.

von Jürgen D. (poster)


Lesenswert?

Einfach mal so überschlagen,
R1 alleine hat ja dann ja nach deiner Tabelle die 80mV und alle zusammen 
etwa 2K7 was laut deiner Tabelle 560mV sind.
Ansonten schon weit auf der E Reihe auseinander :)

von Dennis (Gast)


Lesenswert?

Mit deinen Werten habe ich jetzt:
1
  0 mV
2
 82 mV  delta:  82 mV
3
175 mV  delta:  93 mV
4
249 mV  delta:  74 mV
5
351 mV  delta: 102 mV
6
417 mV  delta:  66 mV
7
492 mV  delta:  75 mV
8
551 mV  delta:  59 mV

Das ist ja schonmal ein recht brauchbares Ergebnis. Das würde ich 
natürlich gerne noch optimieren. Ich komme nur leider wirklich nicht 
drauf, wie ich an die Rechnung am besten dran gehe. Du sagst, du hast 
das so überschlagen. Kannst du mir sagen nach welchem Schema?

von Thomas G. (thgauweiler)


Lesenswert?

Dennis schrieb:
> Dennoch: Kann mir grad erstmal jemand mit den Widerständen helfen? Wie
> das am sinnvollsten realisiert wird?

Sieh mal hier:
https://www.mikrocontroller.net/articles/Evaluations-Platine_f%C3%BCr_Heimautomatisierung#Die_Taster

Gruß
____
/homas

von Jürgen D. (poster)


Lesenswert?

Ich finde die Werte doch eigendlich schon ganz gut, die würde ich so 
lassen.
Die Grenzwete habe für Rges habe ich ja aus deiner Tabelle, und das 
ganze einfach so nach Gefühl aufgeteielt und nach dem was man so als 
Bastler im Bestand hat.
Notfalls das ganze nochmal durchrechnen wenn man bei R2 und/oder R3 mal 
einen Wert in der E Reihe rauf oder runter geht. Da würde ich aber bei 
E12 bleiben.

von Sascha W. (arno_nyhm)


Lesenswert?

Meine Güte, warum so kompliziert?!
Mit zwei Pins kannst du ganz einfach sogar vier Taster/Schalter 
auslesen. Folgendes:
Schalte an einem Portpin einfach einen Schalter nach GND und einen 
weiteren nach VCC (evtl. noch ein 100k Pulldown), zur Abfrage folgende 
Abfolge:

- Portpin als Eingang konfigurieren, Pullup deaktiviert
- Ist der Portpin High? Wenn ja, ist der Schalter nach VCC betätigt, 
wenn nein, weiter:
- Pullup aktivieren
- Ist der Portpin Low? Wenn ja, ist der Schalter nach GND betätigt

...fertig, ohne zusätzlichen Bauteilaufwand.

von Sascha W. (arno_nyhm)


Lesenswert?

Ach ja, was mir (etwas spät...) dazu noch einfällt:
Der Schalter nach VCC braucht auf jeden Fall noch einen Widerstand in 
serie, sonst würde es zu einem Kurzschluss kommen wenn beide 
Schalter/Taster gleichzeitig betätigt sind.
...da ist übrigens auch der Nachteil dieser Methode: Dieser Zustand, 
dass beide Schalter betätigt sind, lässt sich so nicht detektieren.
Ich kann mich im Moment nicht so richtig konzentrieren (schlecht 
geschalfen...) aber durch eine geringe Abwandlung dieser Schaltung lässt 
sich auch dieser Zustand detektieren, ich komme derzeit nur nicht mehr 
darauf wie das genau ging - evtl. melde ich mich später noch einmal 
dazu, sofern überhaupt Interesse besteht...

von Thomas G. (thgauweiler)


Lesenswert?

Bei der Lösung mit drei Widerständen:
Wenn zwei Taster gleichzeitig gedrückt werden,
ergibt sich halt ein anderer Spannungspegel,
den man übers Programm auch abfragen kann.

Wie das softwaretechnisch dann aussieht,
kann man im Anhang von meinem Artikel
(Link siehe oben) nachschauen.

@Sascha: Ist eine interessante Idee.
Der Schutz gegen Kurzschluss interessiert mich schon.

Gruß
____
/homas

von Dennis (Gast)


Lesenswert?

Sascha W. schrieb:
> Meine Güte, warum so kompliziert?!
> Mit zwei Pins kannst du ganz einfach sogar vier Taster/Schalter
> auslesen. Folgendes:
> Schalte an einem Portpin einfach einen Schalter nach GND und einen
> weiteren nach VCC

Vielen Dank für deinen Beitrag. Geht sicher generell auch und hört sich 
auch gut an die Idee, aber ich habe halt drei Taster, welche nach Vcc 
schalten.

Sascha W. schrieb:
> Dieser Zustand,
> dass beide Schalter betätigt sind, lässt sich so nicht detektieren.

Das genau muss aber sein. Ich werde daher die Variante mit den 
Widerständen nehmen. Dann brauche ich nur einen Portpin und habe sogar 
noch einen frei...für den allerdings grad noch keine Verwendung.

Thomas Gauweiler schrieb:
> Wie das softwaretechnisch dann aussieht,
> kann man im Anhang von meinem Artikel
> (Link siehe oben) nachschauen.

Vielen Dank! Den habe ich mir bereits angeguckt.

von Dennis (Gast)


Lesenswert?

Jetzt habe ich schon wieder Taster geschrieben...sorry! ES SIND 
SCHALTER, Dennis, SCHALTER!

von Matthias M. (matthias_m69)


Lesenswert?

Du kannst einen Taster von Pin 1 nach GND, einen zweiten von Pin 2 nach 
GND legen, und einen dritten Taster zwischen Pin 1 und Pin 2 legen.

Dann Pin 1 und Pin 2 mit je einen Widerstand gegen +5V (pull-up). Taster 
1 und 2 fragst Du direkt ab. Taster 3 fragst Du ab, indem Du Pin 1 zum 
Ausgang machst und auf 0 setzt. Wenn Du an Pin 2 nun auch eine 0 liest, 
dann ist der Taster gedrückt - sonst eben nicht.

Einen vierten Taster bekommst Du noch dran, wenn Du 3 und vier paralle 
mit Dioden davor schaltest.

von Dennis (Gast)


Lesenswert?

Matthias M. schrieb:
> Du kannst einen Taster von Pin 1 nach GND, einen zweiten von Pin 2 nach
> GND legen

Meine Schalter schalten gegen Vcc!

von Matthias M. (matthias_m69)


Lesenswert?

> Matthias M. schrieb:
>> Du kannst einen Taster von Pin 1 nach GND, einen zweiten von Pin 2 nach
>> GND legen

Dennis schrieb:
> Meine Schalter schalten gegen Vcc!

Warum? Viele Microcontroller haben den PullUp schon eingebaut. Wenn Du 
gegen Vcc schaltest, dann musst Du einen PullDown einbauen... .

Ausserdem, wir haben hier bis zum Schiebereigister und Bussystemen alles 
diskutiert. Warum in aller Welt müssen Deine Schalter gegen Vcc 
schalten?

Naja, mach's wie Du willst.

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.