$regfile = "m16def.dat"
$crystal = 15000000
$baud = 115200
$hwstack = 40
$swstack = 40
$framesize = 40
'Timer0 konfigurieren
'150000000 (Systemtakt) / 64 (Prescaler) = 234375 (Counts)
Config Timer1 = Timer , Prescale = 64
'Soft-SPI konfigurieren
Config Spi = Soft , Din = Portd.3 , Dout = Portd.4 , Ss = None , Clock = Portd.5
Spiinit
'LED1 an PD.6
Led1 Alias Portd.6
Config Led1 = Output
Led1 = 0
'SCHALTER1 an PA0
Schalter1 Alias Pina.0
Config Schalter1 = Input
Porta.0 = 1 'PullUp-Widerstand einschalten
'SCHALTER2 an PA1
Schalter2 Alias Pina.1
Config Schalter2 = Input
Porta.1 = 1 'PullUp-Widerstand einschalten
'SCHALTER3 an PA2
Schalter3 Alias Pina.2
Config Schalter3 = Input
Porta.2 = 1 'PullUp-Widerstand einschalten
'SCHALTER4 an PA3
Schalter4 Alias Pina.3
Config Schalter4 = Input
Porta.3 = 1 'PullUp-Widerstand einschalten
'SCHALTER5 an PA4
Schalter5 Alias Pina.4
Config Schalter5 = Input
Porta.4 = 1 'PullUp-Widerstand einschalten
'SCHALTER6 an PA5
Schalter6 Alias Pina.5
Config Schalter6 = Input
Porta.5 = 1 'PullUp-Widerstand einschalten
'SCHALTER7 an PA6
Schalter7 Alias Pina.6
Config Schalter7 = Input
Porta.6 = 1 'PullUp-Widerstand einschalten
'SCHALTER8 an PA7
Schalter8 Alias Pina.7
Config Schalter8 = Input
Porta.7 = 1 'PullUp-Widerstand einschalten
'Dip Schalter für Pixelmengenangabe
Dim Zaehler As Integer ' Zähler für Wertmenge zur Ausgabe von Startpunkt zu Startpunkt
Dim Rgb(450) As Byte ' Werte für jede Farbe R-G-B * 150 LEDs
Dim Startpunkt As Bit ' Startpunktdefinition wenn Wert 1 gefunden wurde wird Bit gesetzt
Dim Zwischenwert As Byte ' Zwischenwert Variable die jeden durch URD übertragenen Wert annimmt
Dim Zwischenzaehler As Byte 'Togglebit Setzen resetzen von 1 zu 1
Dim Startausgabe As Byte
Dim Takt As Bit
Dim X As Byte
Dim Test As Byte
Dim Aktiv As Bit
Dim Pixelmenge As Integer
Dim Überlauf As Integer
Aktiv = 0
Startpunkt = 0
Zwischenzaehler = 0
Zaehler = 0
Überlauf = 0
'Interupts definieren und Einschalten
On Urxc Onrxd 'Interupt für RS232 Schnittstelle
Enable Urxc 'Einschalten Interupt RS232
On Ovf1 On_ovf1
Enable Ovf1 'Timer0 Overflow Interrupt 'Dieser Interrupt wird beim Überlauf (255 nach 0) ausgelöst
'234375 (Counts) / 65535 (16-Bit Timer) = 3,576 (Interrupts die Sekunde)
Enable Interrupts 'Einschalten Interupts gesamt
Led1 = 1
Gosub Pixelmengenrechner 'Ermitteln wieviele Lampen eingestellt sind
Gosub Starten 'Einsprung zum löschen aller Werte der Lampen beim Einschalten
Do
If Takt = 1 Then
If Zwischenwert = 1 Then Startpunkt = 1
If Startpunkt = 1 And Zwischenwert <> 1 Then
Incr Zaehler
Rgb(zaehler) = Zwischenwert
If Zaehler = Pixelmenge Then Gosub Ausgabe
End If
Takt = 0
End If
Loop
End
Onrxd: 'RS 232 Empfang verarbeiten
Zwischenwert = Udr
Takt = 1
Überlauf = 1
Return
Ausgabe:
If Zaehler <= 255 Then
Spiout Rgb(1) , Zaehler
Startpunkt = 0
Zaehler = 0
Else
Spiout Rgb(1) , 255
Spiout Rgb(256) , Zaehler
Startpunkt = 0
Zaehler = 0
End If
Return
Starten: ' Unterprogramm um alle LEDs beim Start von 155 nach 0 zu löschen
For X = 155 To 0 Step -1 ' hierbei wird ermittelt ob die Einzelnen LEDs Farbtechnisch OK sind
Waitms 4
For Zaehler = 1 To Pixelmenge
Rgb(zaehler) = X
Next Zaehler
If Pixelmenge =< 255 Then
Spiout Rgb(1) , Pixelmenge
Else
Spiout Rgb(1) , 255
Spiout Rgb(256) , Pixelmenge
End If
Next X
Startpunkt = 0
Zwischenzaehler = 0
Zaehler = 0
Return
'Anhand der Dip Schalter einstellen wieviele Pixel am Bus hängen
Pixelmengenrechner:
Pixelmenge = 255
If Schalter1 = 0 Then Pixelmenge = Pixelmenge -1
If Schalter2 = 0 Then Pixelmenge = Pixelmenge -2
If Schalter3 = 0 Then Pixelmenge = Pixelmenge -4
If Schalter4 = 0 Then Pixelmenge = Pixelmenge -8
If Schalter5 = 0 Then Pixelmenge = Pixelmenge -16
If Schalter6 = 0 Then Pixelmenge = Pixelmenge -32
If Schalter7 = 0 Then Pixelmenge = Pixelmenge -64
If Schalter8 = 0 Then Pixelmenge = Pixelmenge -128
Pixelmenge = Pixelmenge * 3
'Print "Ausgabe Kanäle R-G-B :" ; Pixelmenge
Waitms 20
Return
'Timer0 Overflow Interrupt
On_ovf1:
Incr Überlauf
If Überlauf => 8 Then Goto Starten
Print Überlauf
Return