Forum: Projekte & Code Retro-Projekt: NE555 basierter Elektronischer Würfel in THT


von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

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
von Gerald B. (gerald_b)


Lesenswert?

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 :-)

von Jabba (Gast)


Lesenswert?

Der NE555 ist jetzt 50 Jahre alt geworden.

von Tim  . (cpldcpu)


Lesenswert?

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 :)

von Martin (Gast)


Lesenswert?

Gratuliere zum echten Rückschritt: statt eines ATtiny13(a), drei NE555, 
drei Transistoren plus Kleinkram.

von MaWin (Gast)


Lesenswert?

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

von Tim  . (cpldcpu)


Lesenswert?

MaWin schrieb:
> Die Schaltung würfelt nicht statistisch sauber, jede Augenzahl kommt
> unterschiedlich oft.

Wie kommst Du darauf? Das stimmt nicht.

von Tim  . (cpldcpu)


Lesenswert?


von MaWin (Gast)


Lesenswert?

Tim  . schrieb:
> Wie kommst Du darauf? Das stimmt nicht.

Die Phasenverschiebung ist nicht exakt 60 Grad sondern von den Bauteilen 
abhängig.

von Michael M. (Firma: Autotronic) (michael_metzer)


Angehängte Dateien:

Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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 :)

von Schlaumaier (Gast)


Lesenswert?

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 ;)

von Tim  . (cpldcpu)


Lesenswert?

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
von Arne (Gast)


Lesenswert?

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>;.

von Arne (Gast)


Lesenswert?

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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Angehängte Dateien:

Lesenswert?

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
von Tim  . (cpldcpu)


Lesenswert?

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 :)

von Tim  . (cpldcpu)


Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Angehängte Dateien:

Lesenswert?

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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Angehängte Dateien:

Lesenswert?

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.

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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.

von Arne (Gast)


Lesenswert?

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/

von Tim  . (cpldcpu)


Lesenswert?

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
von Tim  . (cpldcpu)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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
von Tim  . (cpldcpu)


Lesenswert?

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
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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
von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.

von Claus K. (claus_k246)


Angehängte Dateien:

Lesenswert?

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.

von Claus K. (claus_k246)


Lesenswert?

... 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
*/

von Claus K. (claus_k246)


Angehängte Dateien:

Lesenswert?

Korrektur: Der Anschluss "/BI-/RBO" muss offen bleiben

von Tim  . (cpldcpu)


Lesenswert?

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).

von loeti2 (Gast)


Angehängte Dateien:

Lesenswert?

Hab das Programm mal in (ich hoffe) standard-C++ "portiert".
Da läuft es auf meinem i7-Rechner im Releasemode 8 Millisekunden.

von Claus K. (claus_k246)


Lesenswert?

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).

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

Falls jemand interesse hat: Ich hätte noch ein paar Platinen gegen 
Portoerstattung abzugeben.

von Steffen S. (dl7ate)


Lesenswert?

Tim  . schrieb:
> Falls jemand interesse hat: Ich hätte noch ein paar Platinen gegen
> Portoerstattung abzugeben.

Die Platinen sind heute angekommen, vielen Dank dafür.
Die Azubis werden sich freuen 😀

Steffen

von Gerald B. (gerald_b)


Lesenswert?

Den 7447 brauchst du auch nicht. Der 74192/193 o.ä. BCD Zähler reicht. 
Guck dir mal den BCD Code an A = die mittlere LED, B zwei LED und C = 4 
LED, satt Reset Null wird Set 1 verwendet, bei Erreichen der 7 (UND 
A,B,C).
Sind ebenfalls 2 ICs der Zähler und 1x Grundgatter ;-)

von Joe (Gast)


Angehängte Dateien:

Lesenswert?

Tja, wie manch altes Zeug die Gemueter erfreuen kann.

von Tim  . (cpldcpu)


Lesenswert?

Man kann so einen Würfel auch als ASIC implementieren. Ist es dadurch 
nicht mehr "altes Zeug"? Der intellektuelle Anspruch bleibt der gleiche.

https://hackaday.io/project/183938-circuit-golf-electronic-dice-edition/log/210501-007-tinydice-dice-on-an-asic

(Der dazu gehörige IC ist inzwischen wohl gepackaged und auf dem Weg zu 
Matt Venn.)

: Bearbeitet durch User
von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

Ah, und auch das hier:
https://hackaday.io/project/183038-ne555-dice-inversion

Die EDA-Tools waren nicht ganz so clever darin, die Anzahl der NE555 zu 
reduzieren, wie in der Schaltung oben.

: Bearbeitet durch User
von Gerald B. (gerald_b)


Lesenswert?

Darum brauchen wir inzwischen dicke Mehrkernprozessoren für Dinge, die 
früher ein Z80 erledigt hat ;-)

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.