BASCOM auf der Ping-Pong-Platine

von Burkhard Kainka
ELO 2009
Elektronik-Labor  Labortagebuch  ELO  


 
 

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

 Daneben gibt es eine Testroutine zur Ansteuerung aller LEDs. Genau dieses Unterprogramm wurde auch bei der Produktion verwendet und kann auch in der Komplettsoftware über Portc.2 gestartet werden.

 
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

 

Für das gesittete Abschalten des Controllers gibt es die Sub Standby. Der entscheidende Befehl ist Powerdown. Zuvor muss allerdings jeder Verbraucher im System abgeschaltet werden. Portd.2 ist der Interrupteingang. Der Pin wird als Eingang mit Pullup initalisiert. Ein Low-Pegel am Münzkontakt löst dann den Interrupt aus und weckt damit den Controller auf.

 

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.

 'Pingppong LED-Ansteuerung
$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 ****

 Download: LEDmatrix1.zip

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

Loop

 
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

 

XY-Grafik


 
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

 '******************  Service-Unterprogramme *********************

 

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

Loop

Download: LEDmatrix2.zip



Wanderwellen und AD-Wandler

 

 

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

 Download  LEDmatrix3.zip

 Der AD-Wadler des Mega 8 hat eine Auflösung von 10 Bit und kann daher genau passend als Binärzahl in der Matrix dargestellt werden.
 

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.

 

 Do
  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

 

 

Ein Oszilloskop 

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

 
Das Programm nimmt 12 Messwerte im Abstand von 100 Mikrosekunden auf. Diese werden dann in die Anzeige geplottet. Während der eigentlichen Messung ist das Display abgeschaltet. Durch Sperren des Interrups bleibt die gesamte Rechenzeit frei für die Erfassung analoger Daten.

 
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

 

 Download  LEDmatrix7.zip

 

 


 




Elektronik-Labor  Labortagebuch  ELO