K.I.T.T. Lichteffekt (aus der Serie "Knight Rider")

Micha

Mitglied
07. Juni 2007
57
0
6
Sprachen
Hallo AVR-Freunde,

ich wollte euch mal ein nettes Projekt vorstellen und Fragen, was ihr davon haltet.

Es handelt sich um den Scanner an dem Fahrzeug KITT aus der Serie Knight Rider. Ihr wisst schon, das rote Licht, das unter der Motorhaube immer hin und her läuft.

Nun ich habe den Effekt mal mit Bascom auf nem ATmega8 programmiert. Und auf meiner Seite findet ihr das Teil mit Video, Schaltbild und Bascom Source-Code. Der Code ist für eigene Erweiterungen ausgelegt und eine hoffentlich ausführliche Beschreibung ist auf der Seite ebenfalls.

Übrigens läuft das Licht nicht einfach hin und her, sondern es leuchtet nach. Geschwindigkeit der Bewegung und Nachleuchtdauer sind einstellbar per Poti.

Würde mich freuen, wenn das mal jemand ausprobiert bzw. sich die Seite ansieht und ein bischen Feedback gibt.

Hier gehts zum KITT-Projekt.

Bin auf euer Feedback gespannt.

Gruß Mitch.
 

Anhänge

  • Fahrzeug_KITT_2.jpg
    Fahrzeug_KITT_2.jpg
    40,7 KB · Aufrufe: 22
Kitt-Projekt

Danke Dino,

das hört man gerne. Es funktioniert auch tadellos.
Bin auf weitere Feedbacks gespannt.

Mitch.
 
Hi Micha,

yip, sehr nett. Das brauch ich jetzt natürlich in 1:43...:rolleyes:
Doch leider gibt's keine LED's mit D=0.5mm. Doch hab ich da schon eine Idee...:D


Grüsse,

Michael
 
Hi Dino,

es geht noch besser und mit noch mehr "Gefrickel". Wart's ab.


Grüsse,

Michael

P.S.: Bitte nicht vergessen: Egal ob Bremslicht oder K.I.T.T.- Lauflicht - alles nur just for fun, Spass an der Bastelei, die Freizeit einigermaßen sinnvoll nutzen. Im Fahrbetrieb sieht man nicht viel, dafür sind die Flitzer zu schnell...
 
K.I.T.T. Projekt

Danke für eure Kommentare.

Natürlich ist das Projekt eher als Fun anzusehen. Und die Freizeit ist auch sinnvoll genutzt. Zum einen Übung in Assembler-Programmierung und zum anderen wollte ich mich mal intensiver mit Soft-PWM beschäftigen.

Ob ich das Teil nun am Ende baue ist 'ne andere Frage.
Aber sollte ich das in mein Auto (Kühlergrill) einbauen, dann werde ich die LED's natürlich in 0805 Baugröße verwenden :)

Und wenn ich das an den Kettcar baue, dann nehme ich 21W/12V Grühbirnen!
Ist doch logisch :)

Mal im ernst.
In Deutschland ist sowas am Auto sowieso verboten (Danke Merkel, Vorgänger & Co.). Aber wenn mans doch tut, dann würden sich pro PWM-Ausgang mehrere Superhelle LED's anbieten. Z.B. 4, 6 oder sogar 9 LED's, damit wird die Leuchtfläche größer. Ich bin überzeugt, dass man das dann auch während dem Fahren von weitem sehen würde. Alternativ könnte man auch 6W Grühbirnen nehmen (gleiche Birne wie Begrenzungslicht hinten).

Aber wie gesagt. Es ist for Fun. Viele haben auch probleme eine Software-PWM zu schreiben. Hier kann der Sorce vielleicht vielen helfen, selbst was zusammen zu basteln bzw. die Routine verwenden. Sie ist in Assembler und deshalb auch recht schnell. :pcguru:

Gibts noch weitere Feedbacks?

Mitch
 
.....Viele haben auch probleme eine Software-PWM zu schreiben. Hier kann der Sorce vielleicht vielen helfen, .....

Hi Micha!

Ich denke auch, dass der Ein oder Andere dadurch einen Denkanstoß erhält.

Wäre allerdings schön, wenn du hier vielleicht deinen BASCOM-Code einstellen würdest.
Wenn auch nur auszugsweise und mit den interessanten Stellen.

Habe deinen Code auf deiner Page gesehen, aber leider sind ja die wichtigsten Dinge in ASM geschrieben. :(

Ich weiß daher nicht, ob ein "Bascomer" dein Programm wirklich als Hilfe ansehen kann...... wohl eher als Möglichkeit.
Am Ende wird es dadurch nur auf "Copy and Paste" hinauslaufen und keinem ist wirklich geholfen. ;)

Trotz allem.....
Nettes Projekt!

Gruß,
Cassio
 
K.I.T.T. Projekt

Ja natürlich sind die wichtigsten Dinge in Assembler geschrieben.

Es ist ja auch angedacht dass Leute, die so einen Effekt haben möchten, den Source von meiner Seide downloaden und dann nach ergenem belieben erweitern. Die Assemblerroutinen müssen ja nicht geändert werden.

Assembler war leider notwendig, da sonst die PWM zu langsam wäre und ein Nachleuchteffekt nicht umsetzbar gewesen wäre. Ich habs zwar nicht versucht, aber ich denke es ist so.

Hier den Code nochmal reinzustellen wäre doppelt gemoppelt. Auf meiner Seite ist alles schön beschrieben - Gerade der Assembler-Code.

Aber vielleicht hilft es, die Routinen der Verdeutlichung wegen in Bascom zu schreiben. Damit wird dann das Prinzip auch klarer.

Wenn gewünscht, kann ich das noch machen.

Mitch.
 
Abgespeckte Version vollständig in BASCOM

Hallo ich nochmal.

Man Staune doch immer wieder.
Habe mal den Code vollständig in Bascom realisiert. Allerdings nicht einstellbar.
Aber es funktioniert soweit.

Hier der Code in Bascom:

Code:
   $regfile = "m8def.dat"
   $crystal = 8000000
   $hwstack = 32
   $swstack = 8
   $framesize = 24

   '  Pins konfigurieren
   LED_01 Alias Portd.0                                     ' PWM-Ausgänge für LED (oder Treiber)
   LED_02 Alias Portd.1
   LED_03 Alias Portd.2
   LED_04 Alias Portd.3
   LED_05 Alias Portd.4
   LED_06 Alias Portb.6
   LED_07 Alias Portb.7
   LED_08 Alias Portd.5
   LED_09 Alias Portd.6

   Config LED_01 = Output                                   ' PWM-Ausgänge als Ausgang konfigurieren
   Config LED_02 = Output
   Config LED_03 = Output
   Config LED_04 = Output
   Config LED_05 = Output
   Config LED_06 = Output
   Config LED_07 = Output
   Config LED_08 = Output
   Config LED_09 = Output


   Const PWMCount_Max = 63                                  ' PWM-Max-Wert (Auflösung)
   Dim TmrCount as Byte                                     ' Zähler für PWM-Aufrufe

   Dim PWM_01 as Byte                                       '  Werte für die 9 PWM-Kanäle
   Dim PWM_02 as Byte
   Dim PWM_03 as Byte
   Dim PWM_04 as Byte
   Dim PWM_05 as Byte
   Dim PWM_06 as Byte
   Dim PWM_07 as Byte
   Dim PWM_08 as Byte
   Dim PWM_09 as Byte

   Dim AfterGlow as Byte                                    ' Nachleuchtdauer Einstellwert (Max-Wert)
   Dim _AfterGlow_Count as Byte                             ' Verzögerung Nachleuchteffekt (Zähler)
   Dim Motion_Step as Byte
   Dim Flags as Byte
      Const fMotionChange = 6                               ' Flag=1, dann Effekt-Bewegung

   AfterGlow = 100                                          ' Hier Nachleuchtdauer einstellen (0..255)

   Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
   Compare1A = 2000

   Config Timer2 = Timer , Prescale = 8 , Clear Timer = 1
   ocr2 = 156 - 1

   On oc1a ISR_Timer1
   On OC2 ISR_Timer2
   Enable OC1A
   Enable OC2
   Enable Interrupts

'  --------------------------------------------------------
'  Hauptschleife
'  --------------------------------------------------------

   do
      nop
      if Flags.fMotionChange = 1 then                       ' Flag=1, dann Bewegungs-Routine aufrufen
         Gosub _MotionSet_02                                ' Aufruf der Bewegungs-Routine
         Flags.fMotionChange = 0                            ' Flag zieder auf NULL
      End if
   loop

   End

   ISR_Timer1:
      Set Flags.fMotionChange                               ' Flag setzen, Effekt-Bewegung erforderlich
   Return

'  --------------------------------------------------------
'  PWM-Routine
'  --------------------------------------------------------

   ISR_Timer2:
      If TmrCount = 0 then

         TmrCount = PWMCount_Max
         Reset LED_01                                       ' wenn TmrCounter=0, dann Counter auf Max. setzen (PWMCount_Max)
         Reset LED_02                                       ' und alle Ports ausschalten
         Reset LED_03
         Reset LED_04
         Reset LED_05
         Reset LED_06
         Reset LED_07
         Reset LED_08
         Reset LED_09

       Else                                                 ' Wenn TmrCounter>0

         If PWM_01 = TmrCount then Set LED_01
         If PWM_02 = TmrCount then Set LED_02
         If PWM_03 = TmrCount then Set LED_03
         If PWM_04 = TmrCount then Set LED_04
         If PWM_05 = TmrCount then Set LED_05
         If PWM_06 = TmrCount then Set LED_06
         If PWM_07 = TmrCount then Set LED_07
         If PWM_08 = TmrCount then Set LED_08
         If PWM_09 = TmrCount then Set LED_09
         Decr TmrCount

      End If

      If _AfterGlow_Count = 0 then                          ' Nachleucht-Routine

         _AfterGlow_Count = AfterGlow
         If PWM_01 > 0 then Decr PWM_01
         If PWM_02 > 0 then Decr PWM_02
         If PWM_03 > 0 then Decr PWM_03
         If PWM_04 > 0 then Decr PWM_04
         If PWM_05 > 0 then Decr PWM_05
         If PWM_06 > 0 then Decr PWM_06
         If PWM_07 > 0 then Decr PWM_07
         If PWM_08 > 0 then Decr PWM_08
         If PWM_09 > 0 then Decr PWM_09

       Else

         Decr _AfterGlow_Count

      End If
   Return


'  --------------------------------------------------------
'  Effekt-Routine
'  --------------------------------------------------------
_MotionSet_02:
   Select Case Motion_Step
      Case 0
         PWM_09 = PWMCount_Max
      Case 1
         PWM_08 = PWMCount_Max
      Case 2
         PWM_07 = PWMCount_Max
      Case 3
         PWM_06 = PWMCount_Max
      Case 4
         PWM_05 = PWMCount_Max
      Case 5
         PWM_04 = PWMCount_Max
      Case 6
         PWM_03 = PWMCount_Max
      Case 7
         PWM_02 = PWMCount_Max
      Case 8
         PWM_01 = PWMCount_Max
      Case 9
         PWM_02 = PWMCount_Max
      Case 10
         PWM_03 = PWMCount_Max
      Case 11
         PWM_04 = PWMCount_Max
      Case 12
         PWM_05 = PWMCount_Max
      Case 13
         PWM_06 = PWMCount_Max
      Case 14
         PWM_07 = PWMCount_Max
      Case 15
         PWM_08 = PWMCount_Max
   End Select
   incr Motion_Step
   If Motion_Step > 15 then Motion_Step = 0
Return


Dieser Code ist vollständig und lauffähig und kann direkt in einen ATMega8 geflashed werden.

Ich hoffe, die Kritiker von Bascom überzeugt das ein bischen.
Schreiben der Software ca 1 Std. :banghead:
Gehts in Assembler schneller?
 
Jetzt auch einstellbar

Hier nochmal der lauffähige Code, die die Einstellung der Laufgeschwindigkeit und die Einstellung der Nachleuchtdauer zuläßt (ADC0, ADC1).

Code:
   $regfile = "m8def.dat"
   $crystal = 8000000
   $hwstack = 32
   $swstack = 8
   $framesize = 24

   '  Pins konfigurieren
   LED_01 Alias Portd.0                                     ' PWM-Ausgänge für LED (oder Treiber)
   LED_02 Alias Portd.1
   LED_03 Alias Portd.2
   LED_04 Alias Portd.3
   LED_05 Alias Portd.4
   LED_06 Alias Portb.6
   LED_07 Alias Portb.7
   LED_08 Alias Portd.5
   LED_09 Alias Portd.6

   Config LED_01 = Output                                   ' PWM-Ausgänge als Ausgang konfigurieren
   Config LED_02 = Output
   Config LED_03 = Output
   Config LED_04 = Output
   Config LED_05 = Output
   Config LED_06 = Output
   Config LED_07 = Output
   Config LED_08 = Output
   Config LED_09 = Output


   Const PWMCount_Max = 63                                  ' PWM-Max-Wert (Auflösung)
   Dim TmrCount as Byte                                     ' Zähler für PWM-Aufrufe

   Dim PWM_01 as Byte                                       '  Werte für die 9 PWM-Kanäle
   Dim PWM_02 as Byte
   Dim PWM_03 as Byte
   Dim PWM_04 as Byte
   Dim PWM_05 as Byte
   Dim PWM_06 as Byte
   Dim PWM_07 as Byte
   Dim PWM_08 as Byte
   Dim PWM_09 as Byte

   Dim AfterGlow as Byte                                    ' Nachleuchtdauer Einstellwert (Max-Wert)
   Dim _AfterGlow_Count as Byte                             ' Verzögerung Nachleuchteffekt (Zähler)
   Dim Motion_Step as Byte
   Dim Flags as Byte
      Const fMotionChange = 6                               ' Flag=1, dann Effekt-Bewegung
   Dim tmpWord as Word

   AfterGlow = 100                                          ' Hier Nachleuchtdauer einstellen (0..255)

   Config ADC = Single , Prescaler = 32 , Reference = AVCC

   Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
   Compare1A = 2000

   Config Timer2 = Timer , Prescale = 8 , Clear Timer = 1
   ocr2 = 156 - 1

   On oc1a ISR_Timer1
   On OC2 ISR_Timer2
   Enable OC1A
   Enable OC2
   Enable Interrupts

'  --------------------------------------------------------
'  Hauptschleife
'  --------------------------------------------------------

   do
      nop
      if Flags.fMotionChange = 1 then                       ' Flag=1, dann Bewegungs-Routine aufrufen
         Gosub _MotionSet_02                                ' Aufruf der Bewegungs-Routine
         Flags.fMotionChange = 0                            ' Flag zieder auf NULL
         tmpWord = GetADC(1)                                ' Nachleuchtdauer Einstellbar machen
         shift tmpWord , right , 2
         AfterGlow = low(tmpWord)
         tmpWord = GetADC(0)                                ' Bewegungsgeschwindigkeit
         tmpWord = tmpWord + 20
         tmpWord = tmpWord * 8
         Compare1A = tmpWord
      End if
   loop

   End

   ISR_Timer1:
      Set Flags.fMotionChange                               ' Flag setzen, Effekt-Bewegung erforderlich
   Return

'  --------------------------------------------------------
'  PWM-Routine
'  --------------------------------------------------------

   ISR_Timer2:
      If TmrCount = 0 then

         TmrCount = PWMCount_Max
         Reset LED_01                                       ' wenn TmrCounter=0, dann Counter auf Max. setzen (PWMCount_Max)
         Reset LED_02                                       ' und alle Ports ausschalten
         Reset LED_03
         Reset LED_04
         Reset LED_05
         Reset LED_06
         Reset LED_07
         Reset LED_08
         Reset LED_09

       Else                                                 ' Wenn TmrCounter>0

         If PWM_01 = TmrCount then Set LED_01
         If PWM_02 = TmrCount then Set LED_02
         If PWM_03 = TmrCount then Set LED_03
         If PWM_04 = TmrCount then Set LED_04
         If PWM_05 = TmrCount then Set LED_05
         If PWM_06 = TmrCount then Set LED_06
         If PWM_07 = TmrCount then Set LED_07
         If PWM_08 = TmrCount then Set LED_08
         If PWM_09 = TmrCount then Set LED_09
         Decr TmrCount

      End If

      If _AfterGlow_Count = 0 then                          ' Nachleucht-Routine

         _AfterGlow_Count = AfterGlow
         If PWM_01 > 0 then Decr PWM_01
         If PWM_02 > 0 then Decr PWM_02
         If PWM_03 > 0 then Decr PWM_03
         If PWM_04 > 0 then Decr PWM_04
         If PWM_05 > 0 then Decr PWM_05
         If PWM_06 > 0 then Decr PWM_06
         If PWM_07 > 0 then Decr PWM_07
         If PWM_08 > 0 then Decr PWM_08
         If PWM_09 > 0 then Decr PWM_09

       Else

         Decr _AfterGlow_Count

      End If
   Return


'  --------------------------------------------------------
'  Effekt-Routine
'  --------------------------------------------------------
_MotionSet_02:
   Select Case Motion_Step
      Case 0
         PWM_09 = PWMCount_Max
      Case 1
         PWM_08 = PWMCount_Max
      Case 2
         PWM_07 = PWMCount_Max
      Case 3
         PWM_06 = PWMCount_Max
      Case 4
         PWM_05 = PWMCount_Max
      Case 5
         PWM_04 = PWMCount_Max
      Case 6
         PWM_03 = PWMCount_Max
      Case 7
         PWM_02 = PWMCount_Max
      Case 8
         PWM_01 = PWMCount_Max
      Case 9
         PWM_02 = PWMCount_Max
      Case 10
         PWM_03 = PWMCount_Max
      Case 11
         PWM_04 = PWMCount_Max
      Case 12
         PWM_05 = PWMCount_Max
      Case 13
         PWM_06 = PWMCount_Max
      Case 14
         PWM_07 = PWMCount_Max
      Case 15
         PWM_08 = PWMCount_Max
   End Select
   incr Motion_Step
   If Motion_Step > 15 then Motion_Step = 0
Return

Der Schaltplan, die Einstellung der Fusebits und weitere Infos sind wie gesagt auf meine Homepage zu finden.

Noch Kommentare oder Feedbacks?

Gruß Mitch.
 
Hallo Mitch!

Na, super!
Das ist ja ein prompter Service! :)

Jetzt kann auch ein Anfänger, der in BASCOM programmiert, den Code vollständig nachvollziehen und etwas lernen. ;)

Schaltplan und Weiteres kann er dann ja auf deiner Homepage sehen!


Danke schön, im Namen aller Bascomer! ;)

Cassio
 
Hi Mitch,

schliesse mich Cassio an.

Doch leider ist der Mega8 zu groß für die Slotcars, das geht nur z. Bsp. mit einem Tiny85 und 4 Leuchten, vielleicht auch noch ein 24er, der hätte genug Pins und würde platz- und gewichtsmäßig grad noch gehen. Wird auf jeden Fall eine echte Pfriemelei. Ich dachte da an Lichtleitfasern bis max. D=0.75mm. Und eine Corvette- Karosserie müßte ich auch "opfern" und schwarz lackieren:D.

Dank Dir für den Denkanstoss für eine weitere, nette Bastelei.;)


Grüsse,

Michael
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)