Einarmiger Bandit                              

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic         




Video zur Entwicklung des Programms: https://youtu.be/9TkD0xcQokQ?si=eS-adDvDX9p7H4ls

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