Ich habe folgendes Problem ich habe 8 Taster die bei jeweiligem Drücken verschiedene Aktion ausfüren (Soundtracks abspielen), aber wenn man 2 oder mehr taste drückt, schaltet sich die nachfolgende Schaltung ab. Deshalb will ich wie in dieser Schaltung für 4 Taster einen "Quizmaster" nach den Tastern anlöten, da dieser die anderen Taster sperrt sobald einer gedrückt wurde. Nun meine Frage: Wie oder kann ich überhaupt diese Schaltung auf 8 Taster erweitern? Schaltplan für 4 Taster im Anhang ! Link zur Seite : http://www.dieelektronikerseite.de/Circuits/Quizmaster.htm Vielen Dank schon mal im vorraus !!! David
David K. schrieb: > Nun meine Frage: Wie oder kann ich überhaupt diese Schaltung auf 8 > Taster erweitern? Jup. den Flipflop-Block duplizieren, und halt die Dioden-Ver"oder"ung in der Mitte, die alle andern Tasten sperrt, sobald eine ausgelöst wird, entsprechend erweitern. Wenn ich mich nicht verrechnet habe, brauchst du nachher dafür 56 Dioden allein in der Mitte. Macht nix, ab 100 werden die Billiger ;)
DAnke für die Antwort =) Das kann ja spaßig weden alles zusammen zulöten %)
Mit nem kleinen TINY kann man das Ganze kleiner und billiger bauen...
Oder ich nehm einen fertigen 8 bit Flip-Flop Baustein und löte "nur noch" die dioden an. Hab leider noch nicht so viel erfahrung mit dem proggrammieren einen atmega 8 hab ich zwar noch wüsste aber nicht wie ich das programm schreiben sollte.
David K. schrieb: > Oder ich nehm einen fertigen 8 bit Flip-Flop Baustein und löte "nur > noch" die dioden an. Jou...mit Logigbausteinen geht das mit Sicherheit auch "kompakt". Mit nem kleinen TINY wird es dann halt ganz klein. Spannungsversorgung, TINY & Hühnerfutter, Taster, LEDs o.ä für Signalisierung...ferdisch. Programm wäre z.B. einfach nur in der Mainschleife ein Polling aller beteiligten Ports (Taster) durchzuführen, dann auszuwerten was für ein Taster gedrückt wurde und die LEDs zu setzen. Damit hätten dann zwar theoretisch die Schalter die Du als erstes überprüfst eine Priorität...aber bei 20MHz (z.B. TINY2313) passiert da nix. Grüße P.S.: mit ein paar Relais und Selbsthaltung wäre auch noch eine Lösung :-D
Danke nochmal =) Wie genau müsste ich denn das Programm gestalte für den attiny? Könnte mir jemand ein beispielprogramm schreiben? Am besten in Basic oder c++ dann kann ich mir den Aufbau mal genauer anschauen :)
David K. schrieb: > Könnte mir jemand ein beispielprogramm schreiben? Das wäre das ideale Projekt für einen Einstieg in die uC-Welt. Innerhalb von 1-2 Tagen müsste das für einen Anfänger zu schaffen sein. (Jemand wo es kann schreibt es in 10min) Eigentlich musst Du nur 1) Ein- und Ausgänge definieren 2) Portregister für Taster einlesen 3) Taster nacheinander überprüfen ob betätigt 4) wenn ein Taster betätigt, die zugehörige LED anschalten 5) und die anderen LEDs "verriegeln" 6) Wenn der Master-Button gedrückt wurde alle LEDs off Thats it. Durch das setzen der LED brauchst Du theoretisch noch nicht einmal eine Entrprellung der Taster. Ich empfehle das Tutorial des Forums: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Grüße
NopNop schrieb: > Mit nem kleinen TINY wird es dann halt ganz klein. > Spannungsversorgung, TINY & Hühnerfutter, Taster, LEDs o.ä für > Signalisierung...ferdisch. Natürlich kann man das mit nem "Tiny" oder "ATMega" machen, obwohl das eigentlich nicht die Frage war. Es drängt sich der Verdacht auf, dass ein Großteil der hier Postenden mit der diskreten Schaltung schon überfordert ist. Schade, dass da jetzt erst wieder ein Programm geschrieben werden muss. Das Forum heisst doch Mikrocontroller und Elektronik. Davon abgesehen, dass man ein paar elektronische Bauteile benötigt um einen "Tiny" zu betreiben, haben hier doch viele Fanboys keinen blassen Schimmer von Elektronik an sich. NopNop schrieb: > Thats it. > > Durch das setzen der LED brauchst Du theoretisch noch nicht einmal eine > Entrprellung der Taster. Ok, von Programmierung haben hier auch viele keine Ahnung. Also was solls...
Bös schrieb: > Natürlich kann man das mit nem "Tiny" oder "ATMega" machen, obwohl das > eigentlich nicht die Frage war. Es drängt sich der Verdacht auf, dass > ein Großteil der hier Postenden mit der diskreten Schaltung schon > überfordert ist. Was ist denn bitte an ein paar FF überfordernd? Wie gesagt...theoretisch geht es auch mit ein paar Relais. Wenn ich dass allerdings mal kurz überschlage kostet die oben vorgeschlagene Transistorschaltung um die 4,80 Euro (bei annahme 24xTransistor á 4 Cent, 34xWiderstand á 8 Cent und 56xDiode 2 Cent). Nen TINY2313 bekommt man für 1,70 Euro, dann noch nen Spannungsregler dran für 20 Cent, evtl. noch nen Pullup-Widerstand und ein paar Kondesatoren, dann ist man alles in allem bei 2 Euro. Man kann die Schaltung mit ATINY also 2,5 Mal öfters aufbauen als diskret. Vom Platz und wahrscheinlich auch vom Stromverbrauch mal ganz zu schweigen. Da es bei so einem Gerät evtl. um ein tragbares Gerät gehen soll also auch nicht gerade unwichtig. Bös schrieb: > Das Forum heisst doch Mikrocontroller und Elektronik. So eine Schaltung passt in meinen Augen sowieso besser in das Unterforum "Analogtechnik". Bös schrieb: > NopNop schrieb: >> Thats it. >> >> Durch das setzen der LED brauchst Du theoretisch noch nicht einmal eine >> Entrprellung der Taster. > > Ok, von Programmierung haben hier auch viele keine Ahnung. Also was > solls... Was soll an dieser Aussage falsch sein!? Wenn ein Taster betätigt wurde ist sowieso jede weitere Ausgabe gesperrt...ansonsten könnten die anderen Teilnehmer ja auch noch drücken. Und selbst wenn die eine LED durch das Prellen mehrere Male gesetzt werden soll...was soll das bitte ausmachen? Grüße
Währe das eine möglichkeit ? oder ist das alles nur müll? $regfile = "m8def.dat" $crystal = 1000000 Config Pinc.0 = Input Portd = 1 Config Portd = Input Portd = 1 Config Portb = Output Do If Pind.0 = 0 Then Pinb.0 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.1 = 0 Then Portb.1 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.2 = 0 Then Portb.2 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.3 = 0 Then Portb.3 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.4 = 0 Then Portb.4 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.5 = 0 Then Portb.5 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.6 = 0 Then Portb.6 = 1 Goto Warten Else Pinb.0 = 0 End If If Pind.7 = 1 Then Portb.7 = 1 Goto Warten Else Pinb.0 = 0 End If Loop Warten: If Pinc.0 = 0 Then Portb = 0 Else Return End If End
Ups hab was übersehn =) nach dem else natürlich den entsprechenden pin auf 0 setzen (lassen) LG
Da sollte ein BASCOMIANER drüber schauen...kenne mich da mit dem Syntax nicht aus. Habe dennoch mal ein paar Kommentare dran gemacht (ohne Gewähr).
1 | $regfile = "m8def.dat" |
2 | $crystal = 1000000 |
3 | |
4 | Config Pinc.0 = Input 'Rücksetztaster als Eingang |
5 | Portc.0 = 1 '==> Sollte das nicht Portc.0=1 heißen für den Pullup an c.0 ? |
6 | Config Portd = Input 'Andere 8 Taster als Eingänge |
7 | Portd = 1 'Alle Pullups für Taster an |
8 | Config Portb = Output 'PortB komplett Ausgänge (LED) |
9 | |
10 | |
11 | Do |
12 | If Pind.0 = 0 Then 'Taster 0 gedrückt |
13 | Pinb.0 = 1 'Zugehörige LED an |
14 | Goto Warten 'Sprungbefehle sind wahrscheinlich auch in BASCOM nicht so schön aber ok... |
15 | End If |
16 | |
17 | Elseif Pind.1 = 0 Then |
18 | Portb.1 = 1 |
19 | Goto Warten |
20 | End If |
21 | |
22 | ' Und so weiter für die anderen Taste... |
23 | Loop |
24 | |
25 | Warten: |
26 | Do 'Solange der Rücksetztaster nicht gedrückt wurde warten |
27 | If Pinc.0 = 0 Then |
28 | Portb = 0 'Alle LEDs aus |
29 | Return 'Zurück zur Hauptschleife |
30 | End If |
31 | |
32 | Loop |
33 | |
34 | End |
Keine Ahnung ob das so passt...bin gerade etwas in Eile, da Feierabend :-D Grüße
In C gehts einfacher:
1 | #include <avr/io.h> |
2 | |
3 | |
4 | int main() |
5 | {
|
6 | uint8_t mask, input; |
7 | |
8 | DDRB = 0xFF; // output on |
9 | PORTD = 0xFF; // input: pullups on |
10 | PORTC = 1; // PC.0 = reset input |
11 | |
12 | while( 1 ){ |
13 | PORTB = 0; // all outputs off |
14 | mask = 1; |
15 | input = ~PIND; // invert (low active) |
16 | do{ |
17 | if( input & mask ){ |
18 | PORTD = mask; // output on |
19 | while( PINC & 1 ); // until reset pressed |
20 | break; // leave loop |
21 | }
|
22 | mask <<= 1; // next bit |
23 | }while( mask ); |
24 | }
|
25 | }
|
Peter
Peter Dannegger schrieb: > In C gehts einfacher: Find ich auch schöner zu lesen...aber ich glaube kürzer wie so geht nicht mehr :-D
1 | .include "m48def.inc" |
2 | |
3 | ; IN = Port D (Low-active) |
4 | ; OUT = Port B (High-active) |
5 | ; Reset = Reset (Low-active) |
6 | |
7 | .def temp = r16 ; allgemeines Register |
8 | |
9 | .org 0x0000 |
10 | ; Stack wird nicht benötigt |
11 | |
12 | ldi temp, 0xFF |
13 | out PORTD, temp ; Port D mit Pullup |
14 | out DDRB, temp ; Port B als Ausgang |
15 | |
16 | ldi temp, 0x05 ; Power down & Sleep-Enable |
17 | out SMCR, temp |
18 | |
19 | clr temp |
20 | out MCUCR, temp ; PUD - Pullups erlauben |
21 | out DDRD, temp ; Port D als Eingang |
22 | out PORTB, temp ; Port B auf L |
23 | |
24 | wait_for_key: |
25 | in temp, PIND ; Eingang lesen (Ports alle '1' wenn nicht aktiv) |
26 | com temp ; Invertieren |
27 | breq wait_for_key ; Wenn Z gesetzt ist keine Taste gedrückt - also weiter nach Taste gucken |
28 | |
29 | out PORTB, temp ; Taste gedrückt und ausgeben |
30 | |
31 | death_end: |
32 | sleep |
33 | jmp death_end ; Auf Reset warten |
Nochwas in ASM Edit: geht noch etwas kürzer ... ;-) Gruß Jobst
Vielen Dank für die Hilfe ! Dann werd ich das mal in c testen =)
David K. schrieb: > Dann werd ich das mal in c testen =) Und vorallem versuch es zu verstehen was da gemacht wird. Hätte das selbst nie so geschrieben, aber ich finde es echt Wahnsinn wie kompakt man das zusammenbekommt. Grüße
Peter Dannegger schrieb: > PORTD = mask; // output on Hmmm ... Ehr: Pullup on Ich denke, daß das PORTB sein soll ... 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.