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
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?
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...
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)...
Ich werfe mal so hin: Einkopplung über Dioden. Da brauchst du dann 4 Pins.
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...
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 :-(
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.
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.
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?
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 ;-)
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?
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.
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?
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.
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
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
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
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.
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.
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
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
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!!! :)
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.