Anbei ein kleines Retro-Projekt in through-hole-technology, ein elektronischer Würfel. Die Schaltung kommt mit nur drei NE555 aus und ist in der Zahl der Bauteile absolut minimiert. Es gibt keinen Zähler IC, wie CD4017. Kommt jemand darauf, wie er funktioniert? ;) (Die 1µF Kondensatoren sind in Ermangelung von Elkos übrigens als SMD auf der Rückseite bestückt) Das Projekt ist das Ergebnis einiger Optimierungsrunden hier: https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition Details zur Implementierung: https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition/log/203213 Wer kann die Schaltung noch weiter vereinfachen? https://youtu.be/87U51SCs45A
:
Bearbeitet durch User
Ohne jetzt dem Link gefolgt zu sein, wenn es keinen Zähler gibt, dann werden die einzelnen 3 relevanten Bits mit jeweils einem 555 erwürfelt. Es sind quasi 3 Zufallsgeneratoren :-)
Gerald B. schrieb: > Ohne jetzt dem Link gefolgt zu sein, wenn es keinen Zähler gibt, dann > werden die einzelnen 3 relevanten Bits mit jeweils einem 555 erwürfelt. > Es sind quasi 3 Zufallsgeneratoren :-) Drei bits sind allerdings 8 Zustände. Es werden genau 6 gebraucht :)
Gratuliere zum echten Rückschritt: statt eines ATtiny13(a), drei NE555, drei Transistoren plus Kleinkram.
Tim . schrieb: > Wer kann die Schaltung noch weiter vereinfachen? Die Schaltung würfelt nicht statistisch sauber, jede Augenzahl kommt unterschiedlich oft. Ganz viele Würfel http://pegons-web.de/555game.html ganz ohne IC http://www.dieelektronikerseite.de/Circuits/Elektronischer%20Wuerfel.htm
MaWin schrieb: > Die Schaltung würfelt nicht statistisch sauber, jede Augenzahl kommt > unterschiedlich oft. Wie kommst Du darauf? Das stimmt nicht.
MaWin schrieb: > http://www.dieelektronikerseite.de/Circuits/Elektronischer%20Wuerfel.htm Danke! Interessante Implementierung.
Tim . schrieb: > Wie kommst Du darauf? Das stimmt nicht. Die Phasenverschiebung ist nicht exakt 60 Grad sondern von den Bauteilen abhängig.
Theoretisch genügt ein einziger 7492 und ein Taktgeber. Die beiden 7402 (NOR) können weitestgehend durch ODER-Dioden ersetzt werden. Die Invertierung der LED QA (grüner Kreis) wird durch Umklemmen an GND realisiert. Lediglich die UND-Verknüpfung LED QA und QC (roter Kreis) muss mit einem Transistor umgesetzt werden (De Morgan anwenden). Alle anderen Treiber-Transistoren können wegen modernen LEDs entfallen.
MaWin schrieb: > Die Phasenverschiebung ist nicht exakt 60 Grad sondern von den Bauteilen > abhängig. Ja, das stimmmt. Ist aber eher nur über eine sehr große Statistik zu sehen.
Michael M. schrieb: > ediglich die UND-Verknüpfung LED QA und QC (roter Kreis) > muss mit einem Transistor umgesetzt werden (De Morgan anwenden). Könnte man auch durch Dioden parallel zur LED ersetzen. Siehe hier: https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition/log/203107-005-dice3904-8-minimal-transistor-based-dice Aber ein Zähler-IC ist irgendwie geschummelt :)
Geht auch ohne 555 :) Du brauchst 7 Lampen 4 x BC 108 4 x 4.7k Ohm 2 x 1k OHM 2 x Elko 10 MF 1 Taster 1 x 7402 1 x 7404 1 x 7492 Fertig :) Das waren noch Zeiten als ich mit der 74.er Serie gespielt habe. Zusammenstellung aus einen Fachbuch. War damals mein erstes Projekt. Ich habe 2 Versuche gebraucht bis er funktioniert ;)
Schlaumaier schrieb: > Geht auch ohne 555 Tatsächlich? :) Schlaumaier schrieb: > 7 Lampen > 1 x 7492 Schöne Retro-Implementierung mit Glühlampen und Original-TTL. Bietet jemend Röhren? Relais hatten wir auch schon :)
:
Bearbeitet durch User
Tim . schrieb: > https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition/log/203107-005-dice3904-8-minimal-transistor-based-dice Gefaellt mir. Ich habe vor 1½ Jahren auch einen Transistor-Wuerfel gebaut, aber auf die Idee mit dem Johnson-Zaehler bin ich gar nicht gekommen. Mit einem Binaerzaehler mit Rueckkopplung, um zwei Zaehlerstaende zu ueberspringen, kommt man auf eine aehnliche Anzahl Bauteile: <http://arnerossius.de/temp/PNP-Dice/>. Total: 61 components (9 C, 8 D, 7 LED, 28 R, 1 S, 8 T). Die Transistoren sind alle 2N2646: ein echter und 7 gefaelschte, die in Wirklichkeit PNP-Transistoren sind ;-). Verwendet man einen Taster mit zwei Oeffnerkontakten, kann man sogar noch einen Transistor einsparen, indem man den Oszillator und die erste Zaehlerstufe kombiniert: <http://www.recursion.jp/prose/dice/index.html>.
Grmpf, in der Vorschau haben die Links funktioniert ... Hier nochmal in (hoffentlich) richtig: http://arnerossius.de/temp/PNP-Dice/ http://www.recursion.jp/prose/dice/index.html
Tim . schrieb: > Anbei ein kleines Retro-Projekt in through-hole-technology, ein > elektronischer Würfel. > > Die Schaltung kommt mit nur drei NE555 aus und ist in der Zahl der > Bauteile absolut minimiert. Es gibt keinen Zähler IC, wie CD4017. Kommt > jemand darauf, wie er funktioniert? ;) > > (Die 1µF Kondensatoren sind in Ermangelung von Elkos übrigens als SMD > auf der Rückseite bestückt) > > Das Projekt ist das Ergebnis einiger Optimierungsrunden hier: > https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition > > Details zur Implementierung: > https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition/log/203213 > > Wer kann die Schaltung noch weiter vereinfachen? > > https://youtu.be/87U51SCs45A Nettes Projekt, tolle Idee und supereinfach zum Umsetzen! Ja, es geht!!!! Man kann nochmal 2 Transistoren und 2 Widerstände sparen. Anstatt die 3 Taktleitungen zu unterbrechen lege ich ControlVoltage auf VDD, wenn er nicht zählen soll. Daher braucht es noch einen Transistor um den Taster zu negieren. Wenn man statt dem Schließer-Taster einen Öffner nimmt, dann kann man auch noch auf den Transi+Widerstand verzichten. Im Anhang der Schaltplan (geänderte Leiterbahnen rot) und ein Foto vom Brett-Aufbau. Ich hatte keine 3x NE555 in DIP, daher ist der Versuchsaufbau mit 1x NE556 und 1x NE555. Und damit ich da was Blinken sehe verwende ich für den Versuch 22µF statt 100nF. Der echte Würfel sollte natürlich 100nF haben. Der Wettberwerb geht weiter ... geht noch mehr?
:
Bearbeitet durch User
Arne schrieb: > Gefaellt mir. Ich habe vor 1½ Jahren auch einen Transistor-Wuerfel > gebaut, aber auf die Idee mit dem Johnson-Zaehler bin ich gar nicht > gekommen. Mit einem Binaerzaehler mit Rueckkopplung, um zwei > Zaehlerstaende zu ueberspringen, kommt man auf eine aehnliche Anzahl > Bauteile: http://arnerossius.de/temp/PNP-Dice/ > > Total: 61 components (9 C, 8 D, 7 LED, 28 R, 1 S, 8 T). Interessant! Du hast also drei Toggle-FF zu einem ripple-counter in Serie geschaltet. Die Rückkopplung ist über R13/C7 realisiert? Sieht ziemlich clever aus. Was ich noch nicht ganz verstehe: Wie funktioniert der Oszillator mit T8? Da fehlt mir irgendwie die Rückkopplung? Übrigens schöne Realisierung. Bei der Platine habe ich natürlich etwas geschummelt, die hätte man früher selbst gezeichnet und geätzt :)
Arne schrieb: > http://www.recursion.jp/prose/dice/index.html Die analoge Version gefällt mir! Ist aber wahrscheinlich ziemlich schwer zu stabilisieren - die Kondensatorwerte und das Timing müssen genau passen.
Markus M. schrieb: > Nettes Projekt, tolle Idee und supereinfach zum Umsetzen! > > Ja, es geht!!!! > Man kann nochmal 2 Transistoren und 2 Widerstände sparen. > Anstatt die 3 Taktleitungen zu unterbrechen lege ich ControlVoltage auf > VDD, wenn er nicht zählen soll. Daher braucht es noch einen Transistor > um den Taster zu negieren. Wenn man statt dem Schließer-Taster einen > Öffner nimmt, dann kann man auch noch auf den Transi+Widerstand > verzichten. > Im Anhang der Schaltplan (geänderte Leiterbahnen rot) und ein Foto vom > Brett-Aufbau. > > Ich hatte keine 3x NE555 in DIP, daher ist der Versuchsaufbau mit 1x > NE556 und 1x NE555. Und damit ich da was Blinken sehe verwende ich für > den Versuch 22µF statt 100nF. Der echte Würfel sollte natürlich 100nF > haben. > > Der Wettberwerb geht weiter ... geht noch mehr? Wow! Gute Idee, das muss ich gleich einmal ausprobieren. Hatte auch kurz darüber nachgedacht, etwas mit dem Eingang zu machen, habe mich aber nicht getraut den Node extern zu biasen. Allerdings hängen da ja auch nur drei 5kohm Widerstände dran - warum also nicht. Erreicht der Zähler denn alle Zustände mit gleiche Wahrscheinlichkeit? Der TRESH-Eingang wirde deaktiviert, wenn man CONT auf VCC zieht, der TRIG-Eingang ist aber noch aktiv?
Tim . schrieb: > Erreicht der Zähler denn alle Zustände mit gleiche Wahrscheinlichkeit? > Der TRESH-Eingang wirde deaktiviert, wenn man CONT auf VCC zieht, der > TRIG-Eingang ist aber noch aktiv? Das kann ich schlecht nach kontrollieren, ich hatte in ja nur die 3 LED's auf dem Steckboard dran. Sah jedoch danach aus.
Tim . schrieb: > Wer kann die Schaltung noch weiter vereinfachen? Der Zufallsgenerator besteht praktisch nur daraus das alle Würfelmuster hintereinander ausgegeben werden solange man den Taster drückt, wenn dieser losgelassen wird, bleibt der Würfel stehen. Da dies aber viel schneller passiert als das menschliche Auge, oder auch eine Kamera es erfassen kann, ist das Ergebnis tatsächlich zufällig.
:
Bearbeitet durch User
Hab noch eine Platine designt: - Mit Spannungsregler, damit man das an 9V anschließen kann - Verpolungsschutz - Daher 5 Bauteile extra - Größe der Platine 45x45mm
Mich lässt die Würfel-Schaltung noch nicht in ruhe... Leider habe ich doch keinen 7805 in SOT89 in meiner Kiste, nur einen in TO220 und das war mir zu hoch. Die LED's und den Taster habe ich nun doppelt gezeichnet, einmal als SMD und THT, damit hat man etwas mehr Freiheiten was man gerade in der Kiste liegen hat. Daher habe ich mich nun doch zu einem Step-Down Spannungsregler entschieden. Und da er ein "Enable" Pin hat, dachte es müsste doch irgendwie möglich sein, dass man mit dem "Würfeln" die Schaltung aktiviert und diese sich nach 20..60 Sekunden dann wieder schlafen legt. Im Schlaf liefert der "Enable" Eingang einen konstanten Strom von 2µA, damit sollte eine 9V Batterie so ziemlich lange leben. Falls jemand mag, bitte schaut mal auf den Schaltplan und gebt Bescheid ob der Trick mit dem "Würfeln" und dem "Aktivieren" der Stromversorgung so funktioniert wie ich mir das ausdachte. Zu meinen Gedanken zur Funktion und den verwendeten Werten: Zwischen Basis und Emitter von T1 dürfen lt. Datenblatt maximal 6V sein, daher D19. R12 mit 10K, denn wenn der Taster betätigt wird und am Eingang 24V Versorgung anliegen, so würde durch den Widerstand 1,9mA fließen (24V-5V=19V) und die Spannung würde damit auch nicht über 5V angehoben werden, da die 2mA durch die LED's fließen. Die Abschaltdauer ist nicht so einfach zu errechnen, Schwelle von EN ist 1,24V mit einer Konstantstromquelle von 2µA. Sobald der Widerstand R11 > als 620KOhm ist würde der Spannungsregler nicht mehr abschalten. C9 ist ein optionaler Platz, falls man etwas mehr Kapazität braucht. Und sollte das doch nicht so funktionieren, so kann mit J1-Lötbrücke und Umbestückung die Funktion vom Taster wie vom zuvorigen Thread erreicht werden.
Ich habe mal eines von meinen PCBs umgebaut (siehe Bild, mit fliegendem PNP-Transistor). Leider sieht es so aus, als wenn nur die Patters 1,2,6 angezeigt werden. Ich vermute, dass bei den anderen der Würfel auch dann "weiter rollt", wenn er angehalten ist. Möglicherweise ein Problem mit dem noch aktiven TRIG-Eingang. Muss später einmal darüber nachdenken.
Markus M. schrieb: > Leider habe ich doch keinen 7805 in SOT89 in meiner Kiste, nur einen in > TO220 und das war mir zu hoch. Benötigst Du wirklich einen Spannsungsregler? Alle Bauteile können einen relativ großen Spannungsbereich ab. Bei höheren Spannungen werden lediglich die LEDs etwas heller. Kann meinen Würfel problemlos zwischen 4-10V betreiben.
Ich wollte den mit 9V Batterie betreiben, auch mit 12V Akkus oder mal 24V. Und die Doppel-LED's hab ich in Reihe geschaltet, daher läuft meine Schaltung mit 4V nicht mehr, bzw. sollte relativ exakt 5V haben. Bei 9V würde wegen dem LED Vorwiderstand, der für 5V ausgelegt ist, viel zu viel Strom durch die LED's fließen. Auch sollten die LED's schön gleich hell leuchten, daher nicht parallel. > als wenn nur die Patters 1,2,6 angezeigt werden Ich müsste mein Steckbrett auch nochmal zusammen stecken, hab mir leider kein Video gedreht.
Tim . schrieb: > Interessant! Du hast also drei Toggle-FF zu einem ripple-counter in > Serie geschaltet. Die Rückkopplung ist über R13/C7 realisiert? Sieht > ziemlich clever aus. Ich habe zum Thema Transistor-Zaehler vor einiger Zeit mal intensiv recherchiert, und diese Idee IIRC in einem US-Patent gefunden. Leider kann ich es auf die Schnelle nicht mehr wiederfinden. Die Service Manuals zu den alten HP-Frequenzzaehlern sind auch einen Blick wert (z.B. AC-4, Roehrenbestueckter BCD-Zaehler, oder etwas moderner 5245L mit Transistoren). > Was ich noch nicht ganz verstehe: Wie funktioniert der Oszillator mit > T8? Da fehlt mir irgendwie die Rückkopplung? T8 ist ein UJT, da gibt es einen Bereich mit negativem Widerstand aehnlich wie bei einer Glimmlampe (oder sogar BJT: https://www.dos4ever.com/ring/ring.html#amazing), aber bei niedrigerer Spannung. Die hier verwendete Oszillatorschaltung findet man so oder aehlich auch in mehreren Elektor-Schaltungen aus den 1970ern -- spaeter waren dann wohl zwei BJT billiger ;-). Tim . schrieb: > Die analoge Version gefällt mir! Ist aber wahrscheinlich ziemlich schwer > zu stabilisieren - die Kondensatorwerte und das Timing müssen genau > passen. Das dachte ich mir auch, daher habe ich lieber auf die digitale Schaltung gesetzt. Offenbar bekommt man die analoge Version aber sogar mit noch mehr Stufen zuverlaessig hin: http://www.fernekes.com/2020/04/all-transistor-clock/
Tim . schrieb: > Ich habe mal eines von meinen PCBs umgebaut (siehe Bild, mit fliegendem > PNP-Transistor). > > Leider sieht es so aus, als wenn nur die Patterns 1,2,6 angezeigt werden. > Ich vermute, dass bei den anderen der Würfel auch dann "weiter rollt", > wenn er angehalten ist. Möglicherweise ein Problem mit dem noch aktiven > TRIG-Eingang. Muss später einmal darüber nachdenken. Ok, bin leider erst jetzt dazu gekommen. (Ja, wenn man mitten in der Nacht aufwacht...) Die Sequenz des Ring-Zählers ist wie folgt:
1 | 001 3 |
2 | 011 1 |
3 | 010 5 |
4 | 110 6 |
5 | 100 4 |
6 | 101 2 |
Das Mapping auf die Augenzahlen steht daneben. Wie man sehen kann, ändert sich immer ein Bit zur Zeit. Entweder von einer 1 auf eine 0, oder umgekehrt. Wie oben schon geschrieben, deaktiviert man durch das Hochziehen da CONT/CA Pins auf VCC den TRSH eingang. Der TRIG-Eingang ist aber trotzdem noch aktiv. Ein LO Pegel am TRIG-Eingang zieht den Ausgang auf HI. Dass heisst immer dann, wenn der nächste Bitübergang einer von 0 auf 1 ist, wird dieser durch CONT/CA nicht gestoppt. D.h. die Übergange des Zählers 3->1, 5->6 und 4->2 finden auch be gestopptem Würfel statt. Das erklärt, warum der Würfel nur bei 1,2,6 stehen bleibt.
:
Bearbeitet durch User
Arne schrieb: > T8 ist ein UJT, da gibt es einen Bereich mit negativem Widerstand > aehnlich wie bei einer Glimmlampe (oder sogar BJT: > https://www.dos4ever.com/ring/ring.html#amazing), aber bei niedrigerer > Spannung. Die hier verwendete Oszillatorschaltung findet man so oder > aehlich auch in mehreren Elektor-Schaltungen aus den 1970ern -- spaeter > waren dann wohl zwei BJT billiger ;-). https://en.wikipedia.org/wiki/Unijunction_transistor https://saliterman.umn.edu/sites/saliterman.dl.umn.edu/files/general/solid_state_power_switching.pdf Ah ok, war mir als Device noch gar nicht bekannt. Interessant! Allerdings heute wohl sehr exotisch.
Tim . schrieb: > D.h. die Übergange des Zählers 3->1, 5->6 und 4->2 finden auch be > gestopptem Würfel statt. Das erklärt, warum der Würfel nur bei 1,2,6 > stehen bleibt. Danke für die Erklärung! Dann ist meine Idee der Optimierung eher Suboptimal. Erhöht zwar die Chancen eine 6 zu bekommen, dafür auch die kleine Zahlen zu bekommen.
Markus M. schrieb: > Erhöht zwar die > Chancen eine 6 zu bekommen, dafür auch die kleine Zahlen zu bekommen. Naja, die Wahrscheinlichkeit eine 1,2 oder 6 zu bekommen liegt bei jeweils 33.3% (+- Bauteiletoleranz), während sie für 3,4,5 bei 0% liegt.
:
Bearbeitet durch User
Tim T. schrieb: > Tim . schrieb: >> Wer kann die Schaltung noch weiter vereinfachen? > > Der Zufallsgenerator besteht praktisch nur daraus das alle Würfelmuster > hintereinander ausgegeben werden solange man den Taster drückt, wenn > dieser losgelassen wird, bleibt der Würfel stehen. Da dies aber viel > schneller passiert als das menschliche Auge, oder auch eine Kamera es > erfassen kann, ist das Ergebnis tatsächlich zufällig. Einen µC zu nutzen ist natürlich geschummelt. :) Trotzdem kann man den MCU-Würfel noch weiter vereinfachen: https://cpldcpu.wordpress.com/2016/11/26/dice10-electronic-dice-controlled-by-two-gpio/ https://cpldcpu.wordpress.com/2015/05/24/plexingplus/
:
Bearbeitet durch User
Ein µC wollte ich jetzt auch nicht nutzen, ich hab das schon den ganzen Tag von Beruf wegen. Das ist mal was "Analoges" etwas entspanntes dazwischen ganz gut.
:
Bearbeitet durch User
Tim . schrieb: > > Einen µC zu nutzen ist natürlich geschummelt. :) Naja, ich bin von den Anforderungen THT, wenig Bauteile und preiswert ausgegangen. Generell nutze ich den NE555 schon lange nicht mehr, da ein Tiny13A bei mir praktisch immer die einfachere und flexiblere Variante darstellt.
Guten Abend, liebe Gemeinde ;) Wer einen prellenden Taster hat, braucht für einen elektronischen Würfel keinen Oszillator. Und da es hier um Retro ging, wollte ich gerne auch noch einmal posten, was ich mir vor 48 Jahren überlegt hatte: Nur 2 ICs sollten es sein, Treiber inklusive. Damals brauchte eine LED noch 20 mA, so dass die 40 mA, die ein 7447 schafft, gut passten. Um herauszufinden, wie der 7447 am Eingang und am Ausgang zu beschalten ist, hat mir ein Kumpel damals ein Lochkarten-Programm geschrieben. Das lief dann 12 Stunden, bis es die Lösung fand. Ich habe dieselbe Aufgabe heute meinem ESP gestellt. Er brauchte 1600 Millisekunden, um 8 LÖsungen zu finden.
... und falls sich jemand dafür interessiert, wie man sowas lösen kann, hier noch der Code:
1 | /* |
2 | * |
3 | * 1/ Aufgabenstellug: |
4 | * =================== |
5 | * Es soll ein elektronischer Würfel mit 7 LEDs realisiert werden. |
6 | * Als Zähler soll ein 7492 oder 74LS97 o.ä. eingesetzt werden. |
7 | * Die LEDs sollen an einen zweckentfremdeten 7-Segment-Decoder/Treiber |
8 | * 7447 oder 74LS47 angeschlossen werden (Ausgangsstrom: 40 bzw. 24 mA). |
9 | * |
10 | * 2/ Nomenklatur: |
11 | * =============== |
12 | * M = LED in der Mitte des Würfels (für die Würfelbilder 1, 3 und 5) |
13 | * L = LED-Paar von links unten nach rechts oben (für die 2, 3, 4, 5, 6) |
14 | * R = LED-Paar von rechts unten nach links oben (für die 4, 5, 6) |
15 | * Q = LED-Paar quer (für die 6) |
16 | * a, b, c, d, e, f, g = Ausgänge des Decoder/Treibers 7447/74LS47 |
17 | * A, B, C, D = Eingänge des Decoder/Treibers |
18 | * U, V, W = der Eindeutigkeit halber umbenannte Ausgänge |
19 | * des Zählers 7492/74LS92 (eigentlich: QB, QC, QD) |
20 | * X = Festpotenzial, wahlweise low(0) oder high(1) |
21 | * |
22 | * 3/ Lösungsansatz |
23 | * ================ |
24 | * a/ Die LED-Anschlüsse M,L,R,Q können auf unterschiedliche Weise mit |
25 | * den Decoder/Treiber-Ausgängen a,b,c,d,e,f,g verbunden werden. |
26 | * b/ Die Eingänge des Decoder/Treibers können auf unterschiedliche Weise mit |
27 | * den Zählerausgängen U,V,W (s.o.) und dem Festpotenzial X verbunden werden. |
28 | * Das Festpotenzial X kann 0 oder 1 sein. |
29 | * c/ Für jede der Kombinationen aus /a/ und /b/ ist zu prüfen, ob damit dann |
30 | * die 6 Zustände des Zählers: 0, 1, 2, 4, 5, 6 |
31 | * die 6 gewünschten Würfelbilder ergeben, wobei die Reihenfolge einerlei ist; |
32 | * es muss nur die Häufigkeit des Auftretens gezählt werden. |
33 | * |
34 | * 4/ Lösung |
35 | * ========= |
36 | * Drei ineinander verschchtelte Prozeduren, darin jeweils einige ineinander |
37 | * verschachtelte Schleifen simulieren die o.g. Kombinationen /a/ und /b/. |
38 | * In der innersten Prozedur /c/ wird das Durchlaufen des Zähler simuliert |
39 | * und geprüft, ob jedes der gewünschten Würfelbilder mindestens einmal auftritt. |
40 | * Falls ja, wird das Ergebns über die Serial ausgegeben. |
41 | * Während der Entwicklung waren weitere Ausgaben über die Serial hilfreich. |
42 | * Diese können mit der Variable 'debugLevel' freigeschaltet oder unterdrückt werden. |
43 | * |
44 | * 5/ Ergebnis |
45 | * =========== |
46 | * Die nachfolgenden Prozeduren wurden auf einer Node-MCU V.3 / ESP-12E implementiert: |
47 | * 1.451.520 verschachtelte Schleifen benötigten 1604 ms und ergaben 8 Lösungen. |
48 | * Einzelheiten siehe RESULTATE im Kommentar am Ende dieses Sketches. |
49 | * Eine der 8 Lösungen wurde für den Stromlaufplan übernommen. |
50 | * |
51 | * |
52 | */ |
53 | |
54 | // ********** Deklarationen ********** // |
55 | |
56 | // ---------- Konstanten ------------- // |
57 | #define countof(a) (sizeof(a) / sizeof(a[0])) |
58 | |
59 | const unsigned int debugLevelA = 9 ; // auf Ebene: SchleifeEINgangsBeschaltung() |
60 | const unsigned int debugLevelB = 8 ; // auf Ebene: SchleifeAUSgangsBeschaltung() |
61 | const unsigned int debugLevelC = 7 ; // auf Ebene: SchleifeWuerfelBilderUeberZaehlerStaende() |
62 | const unsigned int debugLevel = 7 ; // freigeben bzw. unterdrücken der Debug-Ausgaben via Serial |
63 | |
64 | const char cntOut[] = "UVWX" ; // SN7492: R=QB, S=QC, T=QD, X=Dauer-0 oder Dauer-1 |
65 | const char decInp[] = "ABCD" ; |
66 | const char decOut[] = "abcdefg"; |
67 | const char Decoder[17][8] = { "1111110", // 0 - Abbild des 7-Segment-Decoders: SN7447/SN74LS47 |
68 | //abcdefg// hier gilt: 0=OFF, 1=ON (und nicht: 0=low, 1=high) |
69 | "0110000", // 1 |
70 | "1101101", // 2 |
71 | "1111001", // 3 |
72 | "1001100", // 4 |
73 | "1011011", // 5 |
74 | "0011111", // 6 |
75 | "1110000", // 7 |
76 | "1111111", // 8 |
77 | "1110011", // 9 |
78 | "0001101", // 10 |
79 | "0011001", // 11 |
80 | "0100011", // 12 |
81 | "1001011", // 13 |
82 | "0001111", // 14 |
83 | "0000000"}; // 15 |
84 | |
85 | const char Wuerfel[7][5] = { "????", // pseudo-0 |
86 | // QLRM // |
87 | "0001", // 1 |
88 | "0010", // 2 |
89 | "0011", // 3 |
90 | "0110", // 4 |
91 | "0111", // 5 |
92 | "1110"}; // 6 |
93 | |
94 | // Ausgangssignale des SN7492 an den Pins QB=0, QC=1, QD=2, bit-pos 3=FestPotenzial |
95 | const int cntSteps[2][6][4] = {{{ 0,0,0,0 }, // 0 - ab hier Dauer-LOW |
96 | // Bit-Position 0,1,2,3 // - LSB ist hier links ! |
97 | { 1,0,0,0 }, // 1 |
98 | { 0,1,0,0 }, // 2 |
99 | { 0,0,1,0 }, // 4 |
100 | { 1,0,1,0 }, // 5 |
101 | { 0,1,1,0 }}, // 6 |
102 | {{ 0,0,0,1 }, // 0 - ab hier Dauer-HIGH |
103 | { 1,0,0,1 }, // 1 |
104 | { 0,1,0,1 }, // 2 |
105 | { 0,0,1,1 }, // 4 |
106 | { 1,0,1,1 }, // 5 |
107 | { 0,1,1,1 }}}; // 6 |
108 | |
109 | |
110 | // ---------- Variablen -------------- // |
111 | |
112 | char PrintString[100]; // im ESP ist Platz genug... |
113 | int successCount[7]; // 1(!) ... 6(!), zur Überprüfung, ob jedes Würfelbild mindestens einmal auftritt |
114 | int hurra = 0; // Erfolgszähler für passende Beschaltungs-Kombinationen |
115 | int M, L, R, Q ; // legt die Eingänge des Würfels auf 0..6, das sind die 7 Ausgänge a..g des Decoders |
116 | int A, B, C, D ; // legt die Eingänge des Decoders auf 0..3, das sind die 3+1 Ausgänge B,C,D + Hi or Lo des Zählers |
117 | int FP; // FestPotenzial: 0 oder 1 für low oder high |
118 | int DecInpVal ; // Decoder-Input-Value in Abhängigkeit von der Eingangsbeschaltung und dem Zählerstand |
119 | int CntOutNum ; // Zählerstand 0..5, obgleich der Zähler anders zählt: 0,1,2,4,5,6 plus FestPotential |
120 | long int rowCnt =0 ; // numeriert die Zeilen für die Debug-Ausgaben via Serial |
121 | long int LoopCnt=0 ; // zählt die ineinander verschachtelten Schleifen |
122 | |
123 | |
124 | |
125 | |
126 | // ***** ***** IMPLEMENTIERUNG ***** ***** // |
127 | // ----- ----- Haupt-Routinen ----- ----- // |
128 | |
129 | void loop() { |
130 | delay( 1000 ); // hier gibt es ansonsten nix zu tun |
131 | } |
132 | |
133 | |
134 | void setup() { |
135 | Serial.begin( 115200 ); delay( 1000 ); |
136 | Serial.println(); |
137 | Serial.println( F( "Elektronischer Würfel mit 2 ICs: Suchlauf für Eingangs- und Ausgangs-Matrix" )); |
138 | Serial.println( F( "SN7492(012456) --> E-Matrix --> SN7447 --> A-Matrix --> Würfel(MLRQ)" )); |
139 | Serial.println( F( "***** START *****" )); |
140 | Serial.println(); |
141 | |
142 | long stoppUhr = millis(); |
143 | SchleifeEingangsBeschaltung(); |
144 | stoppUhr = millis() - stoppUhr; |
145 | Serial.println(); |
146 | snprintf_P( PrintString, countof( PrintString ), |
147 | PSTR( "*** fertig! *** %d verschachtelte Schleifen benötigten %d ms und ergaben %d Lösungen" ), |
148 | LoopCnt, stoppUhr, hurra ); |
149 | Serial.println( PrintString ); |
150 | } |
151 | |
152 | |
153 | |
154 | |
155 | // ----- ----- Unter-Routinen ----- ----- // |
156 | |
157 | void SerialPrintInputOutput(){ |
158 | snprintf_P( PrintString, |
159 | countof( PrintString ), |
160 | // PSTR( "%5d Eingang: A=%c B=%c C=%c D=%c X=%d / Ausgang: M=%c L=%c R=%c Q=%c" ), |
161 | // rowCnt, cntOut[A], cntOut[B], cntOut[C], cntOut[D], FP, decOut[M], decOut[L], decOut[R], decOut[Q] ); |
162 | PSTR( "Eingang: A=%c B=%c C=%c D=%c X=%d / Ausgang: M=%c L=%c R=%c Q=%c" ), |
163 | cntOut[A], cntOut[B], cntOut[C], cntOut[D], FP, decOut[M], decOut[L], decOut[R], decOut[Q] ); |
164 | Serial.println( PrintString ); |
165 | } |
166 | |
167 | |
168 | void SchleifeEingangsBeschaltung(){ |
169 | // Die 4 EingangsPins A,B,C,D des Decoders werden in allen möglichen Kombinationen ... |
170 | // ... auf die 3 AusgangsPins B,C,D des Zählers SN7492 sowie ein FestPotenzial gelegt. |
171 | // Die AusgangsPins B,C,D sind auf die BitPositionen 0,1,2 gemappt, das FestPotenzial auf Pos.3 |
172 | // cntSteps[2][6][4] |
173 | for( FP=0; FP<=1; FP++ ){ |
174 | for( A=0; A<4; A++ ){ |
175 | for( B=0; B<4; B++ ){ |
176 | for( C=0; C<4; C++ ){ |
177 | for( D=0; D<4; D++ ){ |
178 | if( A!=B && A!=C && A!=D && B!=C && B!=D && C!=D ){ |
179 | if( debugLevel >= debugLevelA ){ |
180 | snprintf_P( PrintString, |
181 | countof( PrintString ), |
182 | PSTR( "Eingang: A=%d B=%d C=%d D=%d FP=%d --> " ), |
183 | A, B, C, D, FP ); |
184 | Serial.print( PrintString ); |
185 | } // end of debugLevel >= debugLevelA |
186 | SchleifeAusgangsBeschaltung() ; |
187 | } // end of keine Doppel |
188 | } // D |
189 | } // C |
190 | } // B |
191 | } // A |
192 | } // FP |
193 | } // end of loopLevelA |
194 | |
195 | |
196 | void SchleifeAusgangsBeschaltung(){ |
197 | // Die 4 EingangsPins M,L,R,Q des Decoders werden in allen möglichen Kombinationen ... |
198 | // ... auf die 7 AusgangsPins a,b,c,d,e,f,g des Decoders SN7447 gelegt. |
199 | for( M=0; M<7; M++ ){ |
200 | for( L=0; L<7; L++ ){ |
201 | for( R=0; R<7; R++ ){ |
202 | for( Q=0; Q<7; Q++ ){ |
203 | if( M!=L && M!=R && M!=Q && L!=R && L!=Q && R!=Q ){ |
204 | rowCnt++; |
205 | if( debugLevel >= debugLevelB ){ SerialPrintInputOutput(); } |
206 | SchleifeWuerfelBilderUeberZaehlerStaende(); // prüft, ob hierbei die gewünschten Würfel-Kombinationen auftreten |
207 | } // end of keine Duplikate |
208 | } // Q |
209 | } // R |
210 | } // L |
211 | } // M |
212 | } // end of SchleifeAusgangsBeschaltung() |
213 | |
214 | |
215 | void SchleifeWuerfelBilderUeberZaehlerStaende(){ |
216 | // Mittels Variable CntOutNum werden die 6 Zustände 0..5 des Zählers simuliert |
217 | // Der Zähler selbst zählt: 0,1,2,4,5,6 plus Dauer-Low oder -High |
218 | // Was davon am Decoder-Eingang ankommt (DecInpVal), bestimmt die SchleifeEingangsBeschaltung() |
219 | // cntSteps[2][6][4] |
220 | for( int i=1; i<=6; i++ ){ successCount[i] = 0; } // ErgebnisSpeicher löschen/initialisieren |
221 | for( CntOutNum=0; CntOutNum<=5; CntOutNum++ ){ // Schleife über die 6 ZählerStände |
222 | DecInpVal = cntSteps[ FP ][ CntOutNum ][ A ] |
223 | + cntSteps[ FP ][ CntOutNum ][ B ] * 2 |
224 | + cntSteps[ FP ][ CntOutNum ][ C ] * 4 |
225 | + cntSteps[ FP ][ CntOutNum ][ D ] * 8 ; |
226 | int found=0 ; |
227 | char vector[ 10 ]; |
228 | vector[0] = Decoder[ DecInpVal ][ Q ] ; // war: [ M ] ; |
229 | vector[1] = Decoder[ DecInpVal ][ R ] ; // war: [ L ] ; |
230 | vector[2] = Decoder[ DecInpVal ][ L ] ; // war: [ R ] ; |
231 | vector[3] = Decoder[ DecInpVal ][ M ] ; // war: [ Q ] ; |
232 | vector[4] = 0 ; |
233 | for( int j=1; j<=6; j++ ){ // Würfel zählt von 1 bis 6 |
234 | LoopCnt++ ; |
235 | if( strcmp( vector, Wuerfel[j]) == 0 ){ // ist der Vector ein Würfelbild? |
236 | found=j; |
237 | successCount[j]++; |
238 | } // end of Vector ist ein Würfelbild |
239 | } // end of loop over j=1 to 6 |
240 | } // end of Durchlaufen der 6 Zählerstände |
241 | int help=true; |
242 | for( int i=1; i<=6; i++ ){ // kam in der Schleife oben jedes Würfelbild einmal vor |
243 | if( successCount[i] < 1 ){ help=false; } // war !=1 |
244 | } // end of Untersuchung der 6 Häufigkeiten |
245 | if( help==true ){ |
246 | hurra++; |
247 | if( debugLevel >= debugLevelC ){ SerialPrintInputOutput(); } |
248 | } // end of if help=true |
249 | } // end of SchleifeWuerfelBilderUeberZaehlerStaende() |
250 | |
251 | |
252 | |
253 | |
254 | /* ***** ***** RESULTATE ***** ***** // |
255 | vom Serial Monitor aufgezeichnet: |
256 | --------------------------------- |
257 | |
258 | Elektronischer Würfel mit 2 ICs: Suchlauf für Eingangs- und Ausgangs-Matrix |
259 | SN7492(012456) --> E-Matrix --> SN7447 --> A-Matrix --> Würfel(MLRQ) |
260 | ***** START ***** |
261 | |
262 | Eingang: A=W B=X C=U D=V X=1 / Ausgang: M=a L=d R=e Q=f <---<< diese Variante für den Schaltplan verwendet |
263 | Eingang: A=W B=X C=U D=V X=1 / Ausgang: M=a L=g R=e Q=f |
264 | Eingang: A=W B=X C=U D=V X=1 / Ausgang: M=b L=d R=e Q=f |
265 | Eingang: A=W B=X C=U D=V X=1 / Ausgang: M=b L=g R=e Q=f |
266 | Eingang: A=W B=X C=V D=U X=1 / Ausgang: M=a L=d R=e Q=f |
267 | Eingang: A=W B=X C=V D=U X=1 / Ausgang: M=a L=g R=e Q=f |
268 | Eingang: A=W B=X C=V D=U X=1 / Ausgang: M=b L=d R=e Q=f |
269 | Eingang: A=W B=X C=V D=U X=1 / Ausgang: M=b L=g R=e Q=f |
270 | |
271 | *** fertig! *** 1451520 verschachtelte Schleifen benötigten 1604 ms und ergaben 8 Lösungen |
272 | |
273 | |
274 | |
275 | */ |
Korrektur: Der Anschluss "/BI-/RBO" muss offen bleiben
Claus K. schrieb: > Guten Abend, liebe Gemeinde ;) > Wer einen prellenden Taster hat, braucht für einen elektronischen Würfel > keinen Oszillator. hmm... Kann man das irgendwie optimieren? :) > Und da es hier um Retro ging, wollte ich gerne auch noch einmal posten, > was ich mir vor 48 Jahren überlegt hatte: Nur 2 ICs sollten es sein, > Treiber inklusive. Damals brauchte eine LED noch 20 mA, so dass die 40 > mA, die ein 7447 schafft, gut passten. Um herauszufinden, wie der 7447 > am Eingang und am Ausgang zu beschalten ist, hat mir ein Kumpel damals > ein Lochkarten-Programm geschrieben. Das lief dann 12 Stunden, bis es > die Lösung fand. Ich habe dieselbe Aufgabe heute meinem ESP gestellt. Er > brauchte 1600 Millisekunden, um 8 LÖsungen zu finden. Cleverer Ansatz! Der 74LS82 ist so konfiguriert, dass er von 0-5 zählt? (mit durch zwei geteilter clock) Auf was für einem Rechner lief Dein ursprüngliches Programm? 12 Stunden klingt schon nach wirklich viel, sieht allerdinsg auch nach Brute-Force Anbsatz aus, oder?` Könnte man einen CD4026 mit einem ähnlichen Ansatz nutzen? (Vorausgesetzt man findet einen Weg, den zähler zu resetten).
Hab das Programm mal in (ich hoffe) standard-C++ "portiert". Da läuft es auf meinem i7-Rechner im Releasemode 8 Millisekunden.
Tim . schrieb: > Auf was für einem Rechner lief Dein ursprüngliches Programm? 12 Stunden > klingt schon nach wirklich viel, sieht allerdinsg auch nach Brute-Force > Anbsatz aus, oder?` Brute-Force-Ansatz stimmt. - Die 12 Stunden mögen eher die gefühlte Brutto- als die tatsächliche Netto-Rechenzeit gewesen sein. Wenn ich jetzt mal grob überschlage: 1,5 Mio Schleifendurchläufe je 10 Assemblerzeilen je 10 Takte ergibt 150 Mio Takte; das wären 150 Sekunden, wenn so ein Rechner 1974 vielleicht mit 1 MHz lief? Allerdings bekam man diese Rechenzeit nicht am Stück, sondern nur im Time-Sharing-Verfahren. Als Studenten mussten wir damals solche Programme in den Nachtlauf geben, und am anderen Tag lag dann das Ergebnis im Ausgabefach. Tim . schrieb: > Der 74LS82 ist so konfiguriert, dass er von 0-5 zählt? > (mit durch zwei geteilter clock) 74LS92: via CKA und QA könnte man die clock durch zwei Teilen, ist aber nicht erforderlich; ich lege den Takt direkt an CKB, das ist der Eingang für den 3-stelligen Zähler mit den Ausgängen QB, QC, QD. Dieser ist intern so konfiguriert, dass er die 6 Zählerstände {0,1,2,4,5,6} liefert (wenn man QB als LSB und QD als MSB betrachtet). Tim . schrieb: > Könnte man einen CD4026 mit einem ähnlichen Ansatz nutzen? Im CD4026 ist ja ein 7-Segment-Decoder fest verdrahtet mit einem Zähler. Die Lösungen, die mein Programm gefunden hat, benötigen allesamt eine davon abweichende Zuordnung der Decoder-Eingänge {A,B,C,D} mit den Zähler-Ausgängen (die ich im Programm {U,V,W,X} genannt habe).
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.