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