Mustergenerator für die Ping-Pong-Platine
von Hermann Nieder
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