Mustergenerator für die Ping-Pong-Platine

von Hermann Nieder

Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller

Im Dezember kaufte ich mir bei Conrad [1] u. a. auch den Bausatz für Ping-Pong und baute ihn auf. Nachdem ich, angeregt durch die  Beiträge zu Ping-Pong in ELO [2], alle dort verfügbare  Programmsbeispiele heruntergeladen und ausprobiert hatte, versuchte ich auch, mit den 120 LEDs der Platine neben Ziffern und Buchstaben einfache Muster und Symbole darzustellen.

Anfangs entwarf ich ein solches auf kariertem Papier und berechnete die Werte für Leds(1) ... Leds(12)   mit dem Taschenrechner.
Um den Text im Bild oben darzustellen lautet das Listing des BASCOM AVR-Programms nach der Initialisierung folgendermaßen:


Initialisierung
Dim Xx As Single
Dim Yy As Single
Do
Leds(1) = 124
Leds(2) = 84
Leds(3) = 84
Leds(4) = 0
Leds(5) = 124
Leds(6) = 64
Leds(7) = 64
Leds(8) = 0
Leds(9) = 56
Leds(10) = 68
Leds(11) = 56
Leds(12) = 0

loop

...
Möchte man ein “läutendes Telefon” darstellen,





lautet der dies bestimmende Teil des Programmlistings:

...
do
Leds(1) = 96   ‘ „Telefon läutet nicht”, LEDs außer „Telefon“ aus
Leds(2) = 112
Leds(3) = 912
Leds(4) = 592
Leds(5) = 560
Leds(6) = 560
Leds(7) = 560
Leds(8) = 560
Leds(9) = 624
Leds(10) = 912
Leds(11) = 112
Leds(12) = 96
Waitms 500    ‘500ms warten
Leds(1) = 97  ‘ “Telefon läutet“, alle LEDs wie im Bild oben an
Leds(2) = 114
Leds(3) = 916
Leds(4) = 592
Leds(5) = 567
Leds(6) = 560
Leds(7) = 560
Leds(8) = 567
Leds(9) = 624
Leds(10) = 916
Leds(11) = 114
Leds(12) = 97
Waitms 500 ‘500ms warten
Loop ‘und wieder nach do zurück

...

Die Bestimmung der Werte für Leds(1)...Leds(12) geht ganz leicht, wenn man  z. B. das Programm in Visual Basic zur Verfügung hat, das ich eigens dafür entwickelte.
Die Bedienung desselben lässt sich an einem Screenshot erklären.

 

Die Anwenderin / der Anwender  kann   sehr schnell durch Anklicken der gewünschten Kontrollkästchen ein „LED-Muster erzeugen“.
Die 24 Bytes in einem Listenfeld lassen sich speichern, laden und auch über eine serielle Schnittstelle an den ATMEG8 auf der Ping-Pong-Platine übertragen, wenn sich in diesem  der HEX-Code des passenden  Programms befindet, und die betreffende Schnittstelle mit einer Schaltfläche zuvor geöffnet wurde.
Außerdem kann durch Anklicken der Schaltfläche unten links ein Textfeld eingeblendet werden, um passend zu dem jeweiligen „LED-Muster“ den Quelltext anzuzeigen, der unmittelbar in ein Programmlisting in BASCOM AVR kopiert werden kann.
Dieses Textfeld wird auch angezeigt, wenn ein „Muster“ von der Festplatte geladen und „angezeigt wird“.

Damit besteht die Möglichkeit, „LED-Muster auf Vorrat zu entwerfen“ und den zugehörigen Programmtext zu einem späteren Zeitpunkt für ein Projekt zu verwenden.
Auf der Festplatte meines PCs gibt es dazu einen Ordner C:\Leds.

Hier ist ein kleiner Auszug aus dem Listing des Programms in Visual Basic:

...
List1.Clear
LEDh = Check10.Value * 2 + Check9.Value
LEDl = Check8.Value * 128 + Check7.Value * 64 + Check6.Value * 32 + Check5.Value * 16 + Check4.Value * 8 + Check3.Value * 4 + Check2.Value * 2 + Check1.Value
List1.AddItem Str$(LEDl) '1
List1.AddItem Str$(LEDh)
Text3.Text = "Leds(1) =" + Str$(LEDl + 256 * LEDh) + Chr(13) + Chr(10)


Nach Drücken der Schaltfläche „Werte für Muster  in Liste  übern.“ geschieht nach dem Löschen der Eintragungen im Listenfeld folgendes:

Die ersten beiden Bytes im Listenfeld entsprechen den 12  LEDs der ersten  Spalte. Ihre Werte werden mit den Zuständen der Kontrollkästchen berechnet und dann in das Listenfeld übertragen und  anschließend in das Textfeld, das ein- und ausgeblendet werden kann. Dies geschieht nacheinander für alle weiteren Werte, bis im Listenfeld 24 und im Textfeld 12 Eintragungen erfolgt sind.
Die Zeilen  für die restlichen 22 Werte im Listenfeld und die restlichen 11 Zeilen im Textfeld  sind ähnlich wie die oben angegebenen verfasst.
   
Dies ist  ein weiterer kleiner Auszug aus dem Programm-Listing:
w = 0
Dat = Int(Val(List1.List(w)))
Check1.Value = Dat And 1
Check2.Value = (Dat And 2) / 2
Check3.Value = (Dat And 4) / 4
Check4.Value = (Dat And 8) / 8
Check5.Value = (Dat And 16) / 16
Check6.Value = (Dat And 32) / 32
Check7.Value = (Dat And 64) / 64
Check8.Value = (Dat And 128) / 128
w = w + 1
Dat = Int(Val(List1.List(w)))
Check9.Value = Dat And 1
Check10.Value = (Dat And 2) / 2
w = w + 1                           '1
LEDh = Check10.Value * 2 + Check9.Value
LEDl = Check8.Value * 128 + Check7.Value * 64 + Check6.Value * 32 + Check5.Value * 16 + Check4.Value * 8 + Check3.Value * 4 + Check2.Value * 2 + Check1.Value
Text3.Text = "Leds(1) =" + Str$(LEDl + 256 * LEDh) + Chr(13) + Chr(10)
...

Gerade wurde „Muster laden“ gedrückt  und eine Datei  ausgewählt.
Es geschieht nun folgendes:
Die 24 Werte für ein bestimmtes LED-Muster werden in das Listenfeld übernommen, und es folgt die Bestimmung der dazu gehörenden 12 Zeilen für das Textfeld. Außerdem  werden  zur Veranschaulichung für die Anwenderin /den Anwender  die dazu passenden Zustände der Kontrollkästchen wiederhergestellt.
Der Auszug steht für die ersten zwei Werte im Listenfeld und für die erste Zeile im Textfeld  sowie die ersten 12 Kontrollkästchen. Diese entsprechen den 12 Leuchtdioden der ersten Spalte.  
Das Listing für die restlichen  22 Werte im Listenfeld, die 11 restlichen Zeilen im Textfeld und die Zustände der 108 restlichen Kontrollkästchen ist ähnlich gestaltet.




Das Listing des Programms in BASCOM AVR zur Übertragung der 24 Listenwerte für ein LED-Muster über die serielle Schnittstelle sieht auszugsweise so aus:
...
Dim X As Byte
Dim Y As Byte
Dim Einsl As Byte   ‘ Variablen Einsl, Einsh, Eins usw.  bis  Zwoelfl, Zwoelfh, Zwoelf
Dim Einsh As Byte  ‘deklarieren
Dim Zweil As Byte
Dim Zweih As Byte
Dim Dreil As Byte
Dim Dreih As Byte

Do
Inputbin Einsl      ‘Insgesamt 24 Bytes über die serielle Schnittstelle z. B. vom PC einlesen
Inputbin Einsh
Inputbin Zweil
Inputbin Zweih
Inputbin Dreil
Inputbin Dreih
...
Eins = Einsh * 256
Leds(1) = Eins + Einsl     ´Leds(1) ... Leds(12) berechnen
Zwei = Zweih * 256
Leds(2) = Zwei + Zweil
Drei = Dreih * 256
Leds(3) = Drei + Dreil
...
loop
...                                      ‚und LED-Muster darstellen lassen


Als nützlich erwies sich für das hier beschriebene Projekt auch die Schaltung für die Programmierung des ATMEG8 der Ping-Pong-Platine, die in einem ELO-Beitrag [2] dargestellt ist.
Ich erweiterte sie, wie es dem folgenden Bild zu entnehmen ist:


 

Ich verwendete eine 16-polige IC-Fassung, in der ein 16-poliger Flachband-IC-Sockel mit dafür in einer bestimmten Weise gelöteten Verbindungen steckt. An diesem Sockel ist mit Heißkleber ein „Griff“ befestigt, um den Sockel gut handhaben zu können. Wird dieser mit seiner Markierung links aufgesetzt, lässt sich der ATMEG8 nach der Schaltung aus einem ELO-Beitrag [2] programmieren.
Stecke ich den IC-Sockel mit der Markierung nach rechts ein, dient die serielle Schnittstelle zur Kommunikation des Mikrocontrollers z. B. mit einem PC.
Dies erwies sich als sehr nützlich beim  Entwurf der „LED-Muster“ mit dem oben erwähnten Programm in Visual Basic, da ich mir unmittelbar nach der Erstellung eines solchen die wirkliche LED-Anzeige auf der Ping-Pong-Platine anschauen konnte.
Ich verwende  in Anlehnung an eine Schaltung in einem Fachbuch von Burkhard Kainka[3]  ein CMOS-IC des Typs  4011 für die Verbindung der PC-Schnittstelle mit derjenigen des ATMEG8.
Dies ist der komplette Schaltplan dazu:



Hier alle Dateien zum Programm in Visual Basic sowie die beiden Programmlistings für den ATMEGA8 der Ping-Pong-Platine herunterladen und für eigene Zwecke umgestalten.
 




Download: 1001muster.zip


Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller