Einarmiger Bandit
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Das Vorbild für dieses Programm war der Einarmige Bandit aus dem
Spielekalender. Aber statt vier LEDs kommen hier sechs LEDs zum
Einsatz. Und es gibt einen Tastschalter. Nach dem Start des Programms
leuchten alle LEDs. Wenn jemand auf den Taster drückt, erscheint ein
zufälliges Bitmuster. Gewonnen hat man, wenn genau jede zweite LED an
ist, also bei 101010 oder bei 010101. Die Wahrscheinlichkeit dafür
beträgt 1 : 32, denn es gibt mit sechs Bits 64 unterschiedliche Zahlen
und zwei davon gewinnen.Wenn man um Geld spielt (Achtung Suchtgefahr!),
geht das so: Für jedes Spiel, also jeden Tastendruck legt man einen
Cent auf den Tisch. Die Spieler wechseln sich reihum ab. Wer eines der
beiden Gewinner-Bitmuster erhält, bekommt den ganzen Geldhaufen. Wer
sich mehr für die Gesetze der Statistik interessiert, kann sich
notieren, nach wie vielen Versuchen jeweils ein Gewinn erscheint. Je
länger man spielt, desto näher wird der Durchschnitt bei 32 liegen. Das
beweist, dass es kein totsicheres System geben kann, das den Gewinn
garantiert.
Hier wird diesmal der Rpi Pico verwendet. Mit einem Klick auf Help
erscheint das Anschlussbild. An P0 bis P5 werden die LEDs mit internen
Vorwiderständen angeschlossen, die gleichen wie im Spielekalender. An
P7 liegt der Taster gegen GND. Das Programm verwendet tatsächlich
sieben Ausgänge, sodass das Spiel auf sieben LEDs erweitert werden
kann. Oder man beschränkt sich auf vier LEDs, was die Gewinnchancen
deutlich erhöht. An P7 liegt der Taster gegen GND. Deshalb wird für
diesen Anschluss der interne Pullup eingeschaltet. Beim Lesen des
gesamten Ports erhält man bei geöffnetem Schalter mindestens das
Ergebnis 128 und maximal 255, also jedenfalls mehr als 127. Die Ausgabe
wird bei jedem Durchlauf um 1 erhöht, wobei der aktuelle Zustand
jeweils in C zwischengespeichert wird, weil A auch noch für die
Tasterabfrage gebraucht wird. Die Schleife enthält sieben Befehle, die
jeweils rund 6 µs brauchen. Das macht 42 µs pro Durchlauf und 42 µs *
64 = ca. 2,7 ms für einen Durchlauf aller Bitmuster. Damit erscheint
jeder Zustand 370 Mal pro Sekunde, was man unmöglich mit dem Auge
verfolgen kann. Deshalb ist der Zeitpunkt des erkannten Tastendrucks
tatsächlich zufällig.
Rem Bandit
0x097F Pdir = 127
0x0A80 Pullup = 128
L1:
0x3700 A = C
0x4500 Pout = A
0x2800 A = A + 1
0x3600 C = A
0x3F00 A = Pin
0x027F B = 127
0x2302 If A>B Goto L1:
L2:
0x1905 Delay ms = 5
0x3F00 A = Pin
0x0280 B = 128
0x2409 If A<B Goto L2:
0x2002 Goto L1:
Wenn ein Tastendruck erkannt wurde, springt das Programm ein eine
zweite Schleife ab L2. Sie wird so lange durchlaufen, wie der Taster
gedrückt gehalten wird. In dieser Zeit bleibt das Bitmuster
eingefroren. Die Wartezeit von 5 ms wird zur Tasten-Entprellung
verwendet, kann aber in diesem Fall auch entfallen.
Wer das Programm für einen der anderen Controller verwenden will, muss
genau beachten, wie da mit dem Pullups umgegangen wird. Beim CH32 wird
z.B. der Pullup auch bei der normalen Portausgabe umgeschaltet. Deshalb
musste eine Zeile A = A Or 128 eingefügt werden, damit der Pullup zu
jeder Zeit eingeschaltet bleibt. Diese Zeile stört aber auch den Pico
nicht, denn da hat sie für den Eingang an P7 keine Wirkung. Die
folgende Version läuft also auf beiden Controllern.
Rem Bandit2
0x097F Pdir = 127
0x0A80 Pullup = 128
L1:
0x3700 A = C
0x1380 A = A OR 128
0x4500 Pout = A
0x2800 A = A + 1
0x3600 C = A
0x3F00 A = Pin
0x027F B = 127
0x2302 If A>B Goto L1:
L2:
0x1905 Delay ms = 5
0x3F00 A = Pin
0x0280 B = 128
0x240A If A<B Goto L2:
0x2002 Goto L1:
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic