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

Download: Mustergenerator und Quelltexte
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. 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
...
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.

Literatur, Bezugshinweise:
[1] www.conrad.de, Ping-Pong- das Retrogame zum Selberbauen
[2] www.elo-web.de, Beiträge zu Ping-Pong, wie z. B. „Ping-Pong selbst programmieren"
[3] B. Kainka „MSR über die RS232 Schnittstelle", Franzis Verlag, 1992