Atmega48: Dip-Schalter und LEDs in "Matrix" schalten

OP Persönliche Seite #2321122
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
Moderator (Firma: Titel) Persönliche Seite #2321138
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?
#2321184
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 :-(
#2321191
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.
OP Persönliche Seite #2321204
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?
Angehängte Dateien:
Gast #2321248
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 ;-)
OP Persönliche Seite #2321276
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?
Gast #2321279
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.
Angehängte Dateien:
#2321298
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
#2321317
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.
Angehängte Dateien:
OP Persönliche Seite #2321320
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
Angehängte Dateien:
#2321325
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren