Servus,
ich habe am Sonntag einmal für meinen Neffen ein Spielboard auf die Schnelle gebastelt. Ist eigentlich ganz nett und denke auch eine gute Anregung für eigene Ideen.
Dazu habe ich aus dem Keller eine alte Bremsleuchte genholt und diese eben als LED-Zeile auf das Brett montiert. Die vier Segmente haben je einen Transistor und sind somit direkt nach geringer Modifikation am AVR betriebsfähig. Weiterhin habe ich vorne vier Digi-Taster angebracht welche die Eingabe darstellen. Diese sind durch 1N4148 gegen Fremdspannung geschützt und eben intern gepullupt (siehe Software). Einen Festplattenmotor habe ich aus Jux eben auch noch aufgeschraubt. Dieser läßt sich in Drehzahl und Richtung schalten. Ein altes VU-Meter aus einer Technics-Anlage habe ich auch aufgesetzt. diese ist einfach mit 10k Vorwiderstand am AVR-Oit angeschlossen und wird PWM-Generiert gepulst zum entsprechenden Ausschlag. Als µC habe ich einen DIL20-µC verwendet, einen Tiny2313 und als IDE BASCOM.
Das Programm beginnt zu Anfang mit einer auf/abblendenden LED-Zeile welches die Ausganssituation anzeigt. Wird Programm 1 angewählt, wird die Sequenz gespeichert und immer wiederholt wiedergegeben. Drückt man weitere Tasten werden diese getoggelt in das laufende Pattern implementiert und ebenfalls wiedergegeben. Bei drücken vom Taste 2 wird eben das selbe gemacht, nur eben die gedrückte Tastensequenz wie ein Pappagei verzögert ausgegeben. Programm 3 hat sechs verschiedene Programme die eben fest programmiert sind die in Geschwindigkeit direkt verändert werden können (wie ein Lichtcomputer eben). Programm 4 ist die Ansteuerung des Festplattenmotors. Weil keine Kontrolle der Phasen erfolgt ist das ein kniffliges Spiel mit dem Speed den Motor auf Drehzahl zu bekommen ohne das er die Synchronisation verliert.
Ein kleines Video im AVI-Format mit der DigiCam habe ich einmal aufgezeichnet unter www.mds-5.de/temp/RMOV0862.AVI weiterhin ist das Programm hierzu das folgende:
Code:
$Regfile = "2313def.dat"
$Crystal = 8000000
VuMeter Alias PortD.5
Ph1 Alias PortD.0
Ph2 Alias PortD.1
Ph3 Alias PortD.2
Led4 Alias PortB.0
Led2 Alias PortB.1
Led3 Alias PortB.2
Led1 Alias PortB.3
Taster1 Alias PinD.3
Taster2 Alias PinB.4
Taster3 Alias PinD.6
Taster4 Alias PinD.4
Dim i As Byte
Dim Speed As Byte
Dim Prog As Byte
Dim TmpByte As Byte
Dim TmpWord As Word
Dim Taste As Byte
Dim Led As Byte
Dim Pat(96) As Byte
Dim PatPntr As Byte
WaitMs 200
'DDRD = 00100111
'DDRB = 00001111
'PortD = 01011000
PortB.4 = 1
DDRD.5 = 1
DDRD.0 = 1
DDRD.1 = 1
DDRD.2 = 1
DDRB.0 = 1
DDRB.1 = 1
DDRB.2 = 1
DDRB.3 = 1
PortD.6 = 1
PortD.4 = 1
PortD.3 = 1
Main:
Ph1 = 0
Ph2 = 0
Ph3 = 0
VuMeter = 0
GoSub ReadTasten
If Taste > 0 Then GoTo Main
MainLoop:
Incr TmpByte
If TmpByte.7 = 0 Then
' Aufblenden
For i = 0 To 127
If i < TmpByte Then
Led = 15
VuMeter = 1
Else
Led = 0
VuMeter = 0
End If
GoSub ProgWeiche
WaitUs 100
Next i
Else
' Abblenden
For i = 255 To 128 Step -1
If i > TmpByte Then
Led = 15
VuMeter = 1
Else
Led = 0
VuMeter = 0
End If
GoSub ProgWeiche
WaitUs 100
Next i
End If
Goto MainLoop
ProgWeiche:
GoSub SetLeds
GoSub ReadTasten
If Taste.0 = 1 Then GoTo Programm1
If Taste.1 = 1 Then GoTo Programm2
If Taste.2 = 1 Then GoTo Programm3
If Taste.3 = 1 Then GoTo Programm4
Return
Programm1:
' Programm löschen
For PatPntr = 1 To 96
Pat(PatPntr) = 0
Next PatNr
PatPntr = 1
Do
' LED's anzeigen
Led = Pat(PatPntr)
GoSub SetLeds
' Taster einlernen
GoSub ReadTasten
If Taste.0 = 1 Then
If Pat(PatPntr).0 = 0 Then
Pat(PatPntr).0 = 1
Else
Pat(PatPntr).0 = 0
End If
End If
If Taste.1 = 1 Then
If Pat(PatPntr).1 = 0 Then
Pat(PatPntr).1 = 1
Else
Pat(PatPntr).1 = 0
End If
End If
If Taste.2 = 1 Then
If Pat(PatPntr).2 = 0 Then
Pat(PatPntr).2 = 1
Else
Pat(PatPntr).2 = 0
End If
End If
If Taste.3 = 1 Then
If Pat(PatPntr).3 = 0 Then
Pat(PatPntr).3 = 1
Else
Pat(PatPntr).3 = 0
End If
End If
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
' Weiterschalten im Speicher
Incr PatPntr
If PatPntr > 96 Then PatPntr = 1
' VU-Anzeige
GoSub VuMeterTakt
' Wartezeit
WaitMs 50
Loop
GoTo Main
Programm2:
' Programm löschen
For PatPntr = 1 To 96
Pat(PatPntr) = 0
Next PatNr
PatPntr = 1
Do
' LED's anzeigen
Led = Pat(PatPntr)
GoSub SetLeds
' Taster einlernen
GoSub ReadTasten
Pat(PatPntr) = Taste
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
' Weiterschalten im Speicher
Incr PatPntr
If PatPntr > 96 Then PatPntr = 1
' VU-Anzeige
GoSub VuMeterTakt
' Wartezeit
WaitMs 50
Loop
GoTo Main
VuMeterTakt:
' VU-Anzeige
TmpByte = PatPntr Mod 8
If TmpByte < 2 Then
VuMeter = 1
Else
VuMeter = 0
End If
Return
Programm3:
PatPntr = 0
Speed = 10
Prog = 0
Do
' Programm ausgeben
TmpByte = Prog * 16
TmpByte = TmpByte + PatPntr
TmpByte = Lookup(TmpByte, Patterns)
Led = TmpByte
GoSub SetLeds
' Weiterschalten
Incr PatPntr
PatPntr = PatPntr And &h0F
' Taster einlesen und auswerten
Taste = Taste * 16
GoSub ReadTasten
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
TmpByte = Taste And &h0F
If TmpByte = 0 Then
If Taste.4 = 1 Then Incr Speed
If Taste.5 = 1 Then Decr Speed
If Prog > 0 Then
If Taste.6 = 1 Then Decr Prog
End If
If Prog < 5 Then
If Taste.7 = 1 Then Incr Prog
End If
End If
TmpByte = Speed * 10
WaitMs TmpByte
Loop
GoTo Main
Programm4:
' Taster 1: Speed -
' Taster 2: Speed +
' Taster 3: Links
' Taster 4: Rechts
Speed = 20
TmpByte = 0
Do
If i = 0 Then
If TmpByte = 2 Then TmpByte = 0 Else Incr TmpByte
Else
If TmpByte = 0 Then TmpByte = 2 Else Decr TmpByte
End If
' Motor ansteuern
Ph1 = 0
Ph2 = 0
Ph3 = 0
If TmpByte = 0 Then Ph1 = 1
If TmpByte = 1 Then Ph2 = 1
If TmpByte = 2 Then Ph3 = 1
' Taster einlesen und auswerten
GoSub ReadTasten
If Speed < 255 Then
If Taste.0 = 1 Then Speed = Speed + 1
End If
If Speed > 2 Then
If Taste.1 = 1 Then Speed = Speed - 1
End If
If Taste.2 = 1 Then i = 0
If Taste.3 = 1 Then i = 1
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
WaitMs Speed
Loop
GoTo Main
ReadTasten:
Taste.0 = Not Taster1
Taste.1 = Not Taster2
Taste.2 = Not Taster3
Taste.3 = Not Taster4
Return
SetLeds:
Led1 = Led.0
Led2 = Led.1
Led3 = Led.2
Led4 = Led.3
Return
Patterns:
Data &b10001001 ' 1
Data &b10001001
Data &b01000110
Data &b01000110
Data &b00100110
Data &b00100110
Data &b00011001
Data &b00011001
Data &b00011001
Data &b00011001
Data &b00100110
Data &b00100110
Data &b01000110
Data &b01000110
Data &b10001001
Data &b10001001
Data &b00000001 ' 2
Data &b00000001
Data &b00000010
Data &b00000010
Data &b00000100
Data &b00000100
Data &b00001000
Data &b00001000
Data &b00000001
Data &b00000001
Data &b00000010
Data &b00000010
Data &b00000100
Data &b00000100
Data &b00001000
Data &b00001000
Data &b00001111 '3
Data &b00000111
Data &b00000011
Data &b00000001
Data &b00000000
Data &b00000000
Data &b00000000
Data &b00000000
Data &b00001111
Data &b00000111
Data &b00000011
Data &b00000001
Data &b00001000
Data &b00000100
Data &b00000010
Data &b00000001
Data &b00001000 '4
Data &b00000001
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00001000
Data &b00000001
Data &b00000010
Data &b00000100
Data &b00001000 '5
Data &b00000000
Data &b00000100
Data &b00000000
Data &b00000010
Data &b00000000
Data &b00000001
Data &b00000000
Data &b00000001
Data &b00000000
Data &b00000010
Data &b00000000
Data &b00000100
Data &b00000000
Data &b00001000
Data &b00000000
Data &b00001111 '6
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00001111
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00001001
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00001000
Data &b00000000
Grüße Wolfgang
Lesezeichen