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?
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
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.
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?
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?
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.
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.
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.
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.
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?
> 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.
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.
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?
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.
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?
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.
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).
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.
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.
:-\
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.
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.
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 :)
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?
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.
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.
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...
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
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.
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.
> Matthias M. schrieb:>> Du kannst einen Taster von Pin 1 nach GND, einen zweiten von Pin 2 nach>> GND legenDennis 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.