Das PingPong wurde komplett in Bascom geschrieben. Damit sind die ersten Schritte für eigene
Software ganz einfach.
Die Timer2-Interruptprozedur erledigt alles was mit dem Display zu tun hat. Auf der Anwenderseite gibt es eine Art Video-RAM im Array Leds(12). Die einzelnen Bits werden dann laufend auf die entsprechenden Ports verteilt. Außerdem erzeugt das Unterprogramm den Schiebetakt. Es wird eine einzelne Null zwischen vielen Einsen durch beide Schieberegister geschoben. Damit wird jeweils eine einzelne Kathoden-Reihe angesteuert.
Tim2_isr:
Col = Col + 1
If Col = 13 Then Col = 1
Vy = Col + 0
Portd = 0
Portb = 0
Portc = 0
If Col = 1 Then Portb.4 = 0 Else Portb.4 = 1
Portb.3 =
1
'cl
Portb.3 = 0
Portb.2 =
1
'Str
Portb.2 = 0
Portdout = Low(leds(vy))
Portcout = Portdout And 15
Portdout = Portdout And 240
Portd = Portdout
Portc = Portcout
Portb = High(leds(vy))
Return
End
Sub Test
For X = 1 To 12
Leds(x) = 1023
Next X
Waitms 1000
For X = 1 To 12
For Y = 1 To 12
Leds(y) = 0
Next Y
Leds(x) = 1023
Waitms 100
Next X
For Y = 1 To 10
For X = 1 To 12
Vhelp = Y - 1
Vhelp = 2 ^ Vhelp
Leds(x) = Vhelp
Next X
Waitms 100
Next Y
For X = 1 To 12
Leds(x) = 0
Next X
End Sub
Sub Standby
Stop Timer2
Portc = 0
Portd = 0
Portb = 0
Stop Adc
Ddrd.2 = 0
Portd.2 = 1
Enable Int0
Powerdown
Ddrd.2 = 1
Portd.2 = 0
Start Adc
Start Timer2
End Sub
Int_isr:
Disable Int0
Return
Wichtig ist die Sub Initialisierung, die man am Anfang eines
eigenen Programms aufrufen sollte. Damit werden alle Ports, der Timer, der
Interrupt und der AD-Wandler passend eingestellt.
Sub Initialisierung
Config Portc =
15
'PORTC als AD-Eingang
Config Portb = Output
Config Portd = 255
Config Timer2 = Timer , Prescale = 8
On Ovf2 Tim2_isr
Enable Timer2
Enable Interrupts
Start Timer2
Config Adc = Single , Prescaler = 64 ,
Reference = Off
Start Adc
Config Int0 = Low Level
'Falling
On Int0 Int_isr
End Sub
Das erste eigene Programm ist damit sehr übersichtlich. Nach
dem Start und der Initalisierung wird der LED-Test aufgerufen und danach der
Controller abgeschaltet. Da beides in einer Do-Loop-Schleife liegt kann man das
Programm über den Münzkontakt beliebig oft starten.
$crystal =
8000000
$regfile =
"m8def.dat"
$hwstack =
64
$swstack =
64
$framesize
= 64
Dim
Leds(12) As Word
Dim X As
Byte
Dim Y As
Byte
Declare Sub
Standby
Declare Sub
Test
Declare Sub Initialisierung
Initialisierung
Do
Test
Standby
Loop
'*** Service-Unterprogramme ****
Probieren Sie mal etwas Eigenes. Es genügt Daten ins
Leds-Addray zu schreiben und schon kann man etwas sehen.
Do
Leds(1) = 1
Leds(2) = 2
Leds(3) = 4
Leds(4) = 8
Leds(5) = 16
Leds(6) = 32
Leds(7) = 64
Leds(8) = 128
Leds(9) = 256
Leds(10) = 512
Leds(11) = 0
Leds(12) = 1023
Wait 4
Standby
Wenn Sie die LED-Muster als Binärzahlen schreiben sind die
entstehenden Muster direkt zu erkennen.
Do
Leds(2) = &B0000000000
Leds(3) = &B0000000100
Leds(4) = &B0011111110
Leds(5) = &B0000000100
Leds(6) = &B0000000000
Wait 4
Standby
Loop
Zwei neue Unterprogramme machen die Grafik-Programmierung noch
einfacher. Nun können Sie einzelne LED-Punkte gezielt ein- und ausschalten.
$crystal =
8000000
$regfile =
"m8def.dat"
$hwstack =
64
$swstack =
64
$framesize
= 64
Dim
Leds(12) As Word
Dim X As
Byte
Dim Y As
Byte
Dim N As
Word
Declare Sub
Standby
Declare Sub
Test
Declare Sub
Initialisierung
Declare Sub
Led1(byval X As Byte , Byval Y As Byte)
Declare Sub
Led0(byval X As Byte , Byval Y As Byte)
Sub
Led1(byval X As Byte , Byval Y As Byte)
If X < 13 Then
Select Case Y
Case 1 : Leds(x).9 = 1
Case 2 : Leds(x).8 = 1
Case 3 : Leds(x).7 = 1
Case 4 : Leds(x).6 = 1
Case 5 : Leds(x).5 = 1
Case 6 : Leds(x).4 = 1
Case 7 : Leds(x).3 = 1
Case 8 : Leds(x).2 = 1
Case 9 : Leds(x).1 = 1
Case 10 : Leds(x).0 = 1
End Select
End If
End Sub
Sub
Led0(byval X As Byte , Byval Y As Byte)
If X < 13 Then
Select Case Y
Case 1 : Leds(x).9 = 0
Case 2 : Leds(x).8 = 0
Case 3 : Leds(x).7 = 0
Case 4 : Leds(x).6 = 0
Case 5 : Leds(x).5 = 0
Case 6 : Leds(x).4 = 0
Case 7 : Leds(x).3 = 0
Case 8 : Leds(x).2 = 0
Case 9 : Leds(x).1 = 0
Case 10 : Leds(x).0 = 0
End Select
End If
End Sub
Hier ein Beispiel, wie die neuen Subs verwendet werden
können. Das Display wird zeilenweise gefüllt und dann in der gleichen Ordnung
wieder gelöscht.
Initialisierung
Do
For X = 1 To 12
For Y = 1 To 10
Led1 X , Y
Waitms 50
Next Y
Next X
For X = 1 To 12
For Y = 1 To 10
Led0 X , Y
Waitms 50
Next Y
Next X
Hier werden laufend fortschreitende Wellen dargestellt. Für
die Sinusfunktion braucht man Real-Variablen.
Dim Xx As
Single
Dim Yy As
Single
Initialisierung
Do
For N = 1 To 60000
For X = 1 To 12
Xx = X * 30
Xx = Xx - N
Xx = Xx / 60
Yy = Sin(xx)
Yy = Yy + 1
Yy = Yy * 5
Yy = Yy + 1
Y = Int(yy)
Leds(x) = 0
Led1 X , Y
Next X
Next N
Standby
Loop
Do
For N = 1 To 120
Leds(2) = Getadc(6)
Leds(4) = Getadc(7)
Leds(6) = Leds(2) + Leds(4)
Waitms 200
Next N
Standby
Loop
Dieses Programm ist zugleich ein Trainingsspiel für
Binärzahlen. Stellen Sie am linken Poti einen beliebigen Wert ein. Stellen Sie
dann das rechte Poti so ein, dass sich genau die komplementäre Zahl ergibt.
Beide werden dann addiert und sollte in der dritten Reihe zehn Einsen anzeigen.
Für die Einstellung haben Sie nur eine Minute Zeit. Wenn Sie etwas trainieren,
erhalten Sie ein gutes Gefühl für Binärzahlen.
1101101101
+0010010010
=1111111111
Download LEDmatrix4.zip
Und hier ein Malprogramm. Der Malstift wird mit beiden Potis
dirigiert. Man hat zehn Minuten Zeit ein Bild zu vollenden. Danach vernichtet
es sich selbst.
For X = 1 To 12
Leds(x) = 0
Next X
For N = 1 To 6000
U = Getadc(6)
U = U / 80
X = U + 1
U = Getadc(7)
U = 1023 - u
U = U / 100
Y = U + 1
Led1 X , Y
Waitms 100
Next N
Standby
Loop
Download LEDmatrix5.zip
Wie sagte schon Dietrich Drahtlos? „Was im Labor niemals
fehlen darf, ist der Kathodenstrahloszillograph!“ Heute nennt man das Gerät
„Oszilloskop“, und es muss auch keine Braunsche Röhre
drin sein, aber es ist immer noch das
wichtigste Messgerät. Bauen Sie deshalb Ihr Pingpong zu einem einfachen
Oszilloskop um. Nötig ist ein Koppelkondensator und ein Messkabel. Mit dem
linken Poti kann dann die Mittellinie passend eingestellt werden.
Initialisierung
Do
For X = 1 To 12
Leds(x) = 0
Next X
Waitms 10
Disable Interrupts
For X = 1 To 12
Oszi(x) = Getadc(6)
Waitus 100
Next X
Enable Interrupts
For X = 1 To 12
U = Oszi(x)
U = U / 110
Y = U + 1
Led1 X , Y
Next N
Waitms 1000
Loop
Download LEDmatrix6.zip
Ein Poti ist noch frei. Es soll nun zur Einstellung der
Zeitbasis verwendet werden. ADC7 erfasst die Verzögerungszeit T. So kann eine
Verzöherung bis 10 ms zwischen den Messungen eingestellt werden.
Initialisierung
Do
For X = 1 To 12
Leds(x) = 0
Next X
Waitms 10
T = Getadc(7)
Disable Interrupts
For X = 1 To 12
Oszi(x) = Getadc(6)
Waitus T
Next X
Enable Interrupts
For X = 1 To 12
U = Oszi(x)
U = U / 110
Y = U + 1
Led1 X , Y
Next N
Waitms 1000
Loop