Forum: Mikrocontroller und Digitale Elektronik Atmega48: Dip-Schalter und LEDs in "Matrix" schalten


von Julian W. (julian-w) Benutzerseite


Lesenswert?

Hallo,

folgendes Problem: ich habe an meinem Atmega48 nur noch 9 PINs frei. 
Daran anschließen müsste ich einen 8x DIP-Schalter sowie 4 LEDs.
Nur leider weiß ich nicht, wie ich das am besten anstelle. Der 
DIP-Schalter muss nur zu Beginn einmal ausgelesen werden.

Ich bin mir sicher, dass das irgendwie geht... nur leider komm ich 
einfach nicht drauf... bei all meinen Gedanken fabriziere ich entweder 
einen Kurzschluss bei geschlossenem Schalter oder verfälsche die 
Ergebnisse beim auslesen des DIP-Schalters :/

Evtl. könnt ihr mir kurz auf die Sprünge helfen ;)

Viele Grüße
Julian

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Julian W. schrieb:
> Daran anschließen müsste ich einen 8x DIP-Schalter sowie 4 LEDs.
> Nur leider weiß ich nicht, wie ich das am besten anstelle.
Das geht nicht, wenn der DIP-Schalter (wie üblich) einen gemeinsamen 
Anschluss hat.

Ich würde für den DIP-Schalter ein Schieberegister vorschlagen...

EDIT: hast du evtl. einen Analogeingang frei?

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Nunja, der DIP-Schalter hat 16 Anschlüsse... 8x2 halt ;)

Aber das muss doch irgendwie geh'n... ich kritzle hier schon die ganze 
Zeit rum, finde aber einfach keine Lösung...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Julian W. schrieb:
> Nunja, der DIP-Schalter hat 16 Anschlüsse... 8x2 halt ;)
Ach schlags kaputt... stimmt, das ist üblich...  :-/

Dann ist das doch nicht kompliziert: nimm 4 Anschlüsse direkt für die 
LEDs und bis zu 5 für die Dip-Schalter-Matrix z.B. 2x4 (da brauchst du 
natürlich zusätzlich noch ein paar Dioden)...

von Ralf G. (ralg)


Lesenswert?

Ich werfe mal so hin: Einkopplung über Dioden. Da brauchst du dann 4 
Pins.

von Julian W. (julian-w) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ralf G. schrieb:
> Ich werfe mal so hin: Einkopplung über Dioden. Da brauchst du dann 4
> Pins.

Was!? 4 Stück nur!? wie geht denn das!? also ich komme momentan 
zumindest auf 6 Pins...

von Karl H. (kbuchegg)


Lesenswert?

3 zu 8 Dekoder

3 Ausgänge + 1 Eingang

von Ralf G. (ralg)


Lesenswert?

Ganz einfach:
(Sn = Schalter; Pn = Pin)
S1 an P1
S2 an P2
S3 über Dioden an P1 und P2
S4 an P3
S5 über Dioden an P1 und P3
S6 über Dioden an P2 und P3
S7 über Dioden an P1, P2 und P3
S8 an P4

geht auch noch bis 15 so weiter, danach braucht man aber den nächsten 
Pin.


Edit:
Mist! Da hast Du dann natürlich nur 0..8 :-(

von Karl H. (kbuchegg)


Lesenswert?

Ralf G. schrieb:
> Ganz einfach:
> (Sn = Schalter; Pn = Pin)
> S1 an P1
> S2 an P2
> S3 über Dioden an P1 und P2
> S4 an P3
> S5 über Dioden an P1 und P3
> S6 über Dioden an P2 und P3
> S7 über Dioden an P1, P2 und P3
> S8 an P4
>
> geht auch noch bis 15 so weiter, danach braucht man aber den nächsten
> Pin.

Wie unterscheidest du den Fall "S1 gleich 0" vom Fall "S1 gleich 1", 
wenn gleichzeitig S3 auf 1 ist?

Was du da hast ist eien Eingabe von Binärzahlen in Form von 8 Schaltern, 
von denen immer nur einer auf ein sein darf. Das ist meistens nicht das, 
wozu man ein Mäuseklavier einsetzt.

von MWS (Gast)


Lesenswert?

LEDs von VCC über µC gegen GND schalten, DIP an GND, mit Widerständen 
2k7 von jedem DIP-Schalter an 'nen Portpin, beim Start PUps einschalten 
und Zustand auswerten. Im Betrieb werden die 2k7 mitgetrieben.

von Julian W. (julian-w) Benutzerseite


Angehängte Dateien:

Lesenswert?

Also du meinst so, wie ich es im Anhang habe?

Beim auslesen setzte ich die PINs dann auf Eingang, aktiviere den 
internen PullUp-Widerstand und lese die Werte aus.

Danach schalte ich die Eingänge auf Ausgänge. Sobald ich den Ausgang auf 
GND schalte, leuchtet die LED. Ansonsten schalte ich den Ausgang auf VCC 
und die 2,7kΩ werden getrieben (und die LED an 3,7kΩ, wobei man das wohl 
nicht wahrnehmen dürfte).

Hab ich's richtig verstanden?

Edit: kann man die 2,7kΩ eigentlich größer wählen... oder hat das 
negative Auswirkungen?

von MWS (Gast)


Lesenswert?

Julian W. schrieb:
> Hab ich's richtig verstanden?

Ja, bis auf den Umstand, daß die LED in der Zeichnung verkehrt herum 
drin sitzt.

Wobei ich übersehen hab', daß die LED bei Schalter und Widerstand gegen 
GND den Spannungslevel soweit anhebt, daß die Erkennung nicht mehr 
klappt, außer man verkleinert den 2k7 noch stark.

Das DB sagt 1.8V Threshold für die rote LED, wenn VCC=5V ist, I_LED~10mA 
und damit Rvor=330 dann müsste RDIP=330 sein, um auf unter IO-Threshold 
2,5 - Hysterese 0,5V = 2,0V zu kommen.

5V - 1,8V = 3,2V
3,2V / (330 + 330) * 330 = 1,6V
Dazu käme dann noch der angeschaltete PUp mit ~20k, dann wäre das 
Ergebnis ~1,9V.

Du hast dann aber den Effekt, daß bei LED=Aus, also Pin=High der Port 
noch um die 15mA treiben muss, mehr als mit Led. Wäre nicht so das 
Problem bei 'ner anderen LED-Farbe, bzw. anderer Threshold. Nimm' blaue 
Leds und es funktioniert perfekt ;-)

von Julian W. (julian-w) Benutzerseite


Lesenswert?

also leider auch nicht so die "non-plus Ultra" Lösung...

Edit: Wobei, ich habe ja 9 PINs frei... 8 sind an den Schaltern... 
könnte ich dann nicht einen PIN nehmen, an den ich die LEDs anschließe?

Wenn ich den DIP-Schalter auslese setz ich den Pegel auf GND, treibe ich 
die LEDs setzte ich den PIN auf VCC?

von Ralf G. (ralg)


Lesenswert?

Wenn ich richtig mitgezählt habe, müsste doch noch ein Pin frei sein?
Den zum Zuschalten der LEDs nach Plus verwenden? (Oder Tasten nach Plus 
und LEDs nach Minus)
Edit: zu spät.

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Mal einen konkreten Vorschlag:

Schaltung wie oben, nur alle LEDs gehen an einen Port Pin (und sind 
richtig rum gepolt^^).

Wenn ich jetzt den DIP auslesen möchte, wie muss ich dann den Port Pin 
schalten? Als Eingang? Dann dürften die LEDs das Auslesen des DIP 
Schalters ja nicht beeinflussen? Die LEDs liegen einfach an einem 
hochomigen Eingang an... und das war's doch, oder?

Und die 2,7kΩ kann ich dann doch auch größer wählen, oder?

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Julian W. schrieb:
> Edit: Wobei, ich habe ja 9 PINs frei... 8 sind an den Schaltern...
> könnte ich dann nicht einen PIN nehmen, an den ich die LEDs anschließe?

Würd' ich nicht machen, denn dann muss der eine Pin im schlechtesten 
Fall den Strom aller Leds treiben. Aber das mit dem 9ten Pin kam mir 
auch, allerdings in 'ner etwas anderen Version, siehe Anhang.

Wenn beim Start jeder Pin einmal gegen GND gezogen wird und an Pin9 der 
Pullup eingeschaltet ist, dann sollte sich jeder gesetzte Schalter als 
Low erkennen lassen, ohne die anderen Nachteile.

von Jobst M. (jobstens-de)


Lesenswert?

Das ist doch gar kein Problem:
1
Port-------+---+---+---,
2
           |   |   |   |
3
Port-----+---+---+---, |
4
         | | | | | | | |
5
         v v v v v v v v  = 8x 1N4148
6
         - - - - - - - -
7
         | | | | | | | |
8
         S S S S S S S S  = DIP-Schalter
9
         | | | | | | | |
10
Port-----+-+-|-|-|-|-|-|---|<--R--+--+5V
11
Port---------+-+-|-|-|-|---|<--R--+
12
Port-------------+-+-|-|---|<--R--+
13
Port-----------------+-+---|<--R--,
14
15
                         4x LED + Vor-R
16
17
6 Ports ...

Die oberen Ports sollten zur Abfrage nur auf Pullup geschaltet werden. 
Aber auf jeden Fall immer ein Eingang bleiben!

Bei den unteren Ports wird durch L eine LED zum leuchten gebracht. Und 
man kann -sofern die drei anderen Ausgänge auf H liegen- zwei DIPs 
abfragen.


Gruß

Jobst

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Jobst M. schrieb:
> Die oberen Ports sollten zur Abfrage nur auf Pullup geschaltet werden.

Nunja.. würde nicht durch die LEDs schon ein High-Pegel auf den 4 
unteren Ports liegen?

Edit: Wobei, ist im Grunde ja egal.. ich hab 9 Ports. 9-6=3... 3 freie 
Ports würden mir reichen :D

von Jobst M. (jobstens-de)


Lesenswert?

Julian W. schrieb:
> Nunja.. würde nicht durch die LEDs schon ein High-Pegel auf den 4
> unteren Ports liegen?

Die unteren 4 Ports sind Ausgänge.
L = LED an und DIPs können gelesen werden
(Porteingang (die beiden oben) L = DIP geschlossen, H = DIP offen)

H = LED aus und diese beiden Schalter werden nicht abgefragt.



Gruß

Jobst

von MWS (Gast)


Lesenswert?

Julian W. schrieb:
> Nunja.. würde nicht durch die LEDs schon ein High-Pegel auf den 4
> unteren Ports liegen?

Das stört nicht, es zählt nur der Low-Pegel. Prinzipiell derselbe 
Vorschlag wie von mir, außer daß Jobst's Vorschlag weniger Pins braucht, 
weshalb ich ihm den Vorzug geben würde.

von Ralf G. (ralg)


Angehängte Dateien:

Lesenswert?

Wie im Anhang würde ich's mal probieren. Nicht so genial, aber auf acht 
LEDs erweiterbar. Man weiß ja nie ;-)
'Vorwiderstände' der Taster sind unkritisch, 10k gehen bestimmt.
Und dann dein Ablauf: Pin9 auf Ausgang mit 'high'. Pin1..Pin8 auf 
Eingang. Daten einlesen. Pin1..Pin8 als Ausgang. Pin9 auf 'low'. 
Pin1..Pin8 schalten, wie man will.

von Julian W. (julian-w) Benutzerseite


Angehängte Dateien:

Lesenswert?

So, ich habe das ganze dann mal in meinen Schaltplan übernommen :D

Zu Beginn des Programms muss ich den DIP auslesen, also gehe ich wie 
folgt vor:

Die unteren 4 PINs werden alle auf Ausgang/HIGH geschaltet. Die 2 
Eingänge oben werden als Eingang mit PullUP eingestellt. Nun schalte ich 
nacheinander die 4 PINs unten auf LOW und kann an den 2 Eingängen oben 
den Wert des DIP-Schalter's auslesen.

Anschließend kann ich die oberen 2 Pins "ignoriere" und schalte mit 
unten den 4 Ausgängen die LEDs.

So, ich glaub, ich hab's verstanden :D

von Jobst M. (jobstens-de)


Lesenswert?

Beispiel:

Ich nennen die Ports nun von oben nach unten A bis F

Du hast die oberen beiden Ports (A und B) als Eingang mit internem 
Pullup konfiguriert.
Die unteren vier (C - F) sind Ausgänge.

Du setzt C auf L, D-F auf H.

Du fragst an A und B die ersten beiden Schalter ab. Bekommst Du ein L, 
ist der Schalter geschlossen, bekommst Du ein H, ist der schalter offen.

Nun setzt Du C auf H und D auf L.

Jetzt fragst Du wieder A und B ab.

Dann setzt Du D auf H und E auf L.

...


Dadurch flimmern die LEDs einmal kurz durch - allerdings vermutlich kaum 
wahrnehmbar.



EDIT : Ach, ich hätte es ja gar nicht mehr beschreiben zu brauchen ... 
;-)

Julian W. schrieb:
> So, ich glaub, ich hab's verstanden :D

Glaube ich auch ...


Gruß

Jobst

von Julian W. (julian-w) Benutzerseite


Lesenswert?

DANKE :D :D

Die Lösung hab ich jetzt auch übernommen. Schon genial, wie man mittels 
einfacher Tricks mächtig PINs sparen kann ;)

Also vielen Danke!!! :)

von Thorsten S. (whitenoise)


Lesenswert?

Zur Info,

9Pins reichen fü 8 7-Segmentanzeigen und 8 Taster. (Atmega168)

Zutaten:

9-10 Widerstände und 8 Dioden.

Das ist das Maximum was bei 9Pins noch machbar ist ohne externe Logik 
oder Halbleiter.

Stichwort:
Charlieplexing und Tastenmatrix in Kombination.

Gruß,
Thorsten

von Helmut L. (helmi1)


Angehängte Dateien:

Lesenswert?

Oder noch eine Loesung fuer 12 Tasten/Schalter.

Es wird immer ein Port auf 0 gesetzt und die andern 3 abgefragt ob einer 
0 ist.

von Jobst M. (jobstens-de)


Lesenswert?

Helmut Lenzen schrieb:
> Oder noch eine Loesung fuer 12 Tasten/Schalter.

Mehrere Schalter gleichzeitig gehen nicht. Könnte man mit 8 weiteren 
Dioden aber beheben.
Die Pullups kann der uC übernehmen.

Aber LEDs fehlen ;-)


Gruß

Jobst

von Helmut L. (helmi1)


Lesenswert?

Jobst M. schrieb:
> Aber LEDs fehlen ;-)

Dafuer hat er ja noch 5 Ports frei.

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.