Also ich hab mal mit Paint und exel gespielt und das kam raus:
Sättigung 240
Helligkeit 128
Hier der Rotanteil wie man sieht keine Kurve, mit einigen if bedingungen sollte man die Übergägne so hinbekommen. Unten der Farbverlauf.
MFg Moritz
Druckbare Version
Also ich hab mal mit Paint und exel gespielt und das kam raus:
Sättigung 240
Helligkeit 128
Hier der Rotanteil wie man sieht keine Kurve, mit einigen if bedingungen sollte man die Übergägne so hinbekommen. Unten der Farbverlauf.
MFg Moritz
Hallo,
Guck mal hier rein:
http://www.led-tech.de/produkt-pdf/rainbow.pdf
Dort findest du ein Datenblatt zu einer
sogenannten Rainbow-Fading-LED.
Das ist eine LED, die selbständig nacheinander
alle Farben des Spektrums "durchläuft".
In dem Datenblatt sind an Schluß die Timingcharts
für die drei R, G und B LEDS angegeben.
Timingchart 2 oder 3 müsste das richtige für dich sein sein.
Diese Effkt-LED sieht übrigens Suuuper aus.
Hab ich an den Rotorblatt-Enden meines Modellhubschraubers,
für Nachtflug.
Gruß Jan
Danke erst einmal für die Zahlreichen Antworten.
Also das mit der Farbmischung ist soweit erst mal klar für mich. Mein Problem ist jetzt noch - wie bekomme ich 3 PWMs in einem Timer unter?
Ich hab das probieren jetzt garade aufgegeben. Oder muss ich da mehrere Timer nehmen. Soweit ich weiß kann ich z.B. nur immer einen Timer0 nehmen?
Das mit der Kurvenberechnung hab ich jetzt nicht so recht verstanden, könnte mir da evtl. jemand ein Beispiel geben.
Wie schon gesagt, mit zwei LEDs habe ich die Regelung hinbekommen, abder die dritte will da nicht so richtig mitmachen.
Grüße und danke
Enrico
Hallo,
ich habe mir jetzt mal die Mühe gamacht und alle 255 Werte für das komplatte Farbspecktrum in eine Excel-Liste mit Diagramm zu fassen.
Die Datei findet ihr im Anhang. Also so müsste das im Endeffekt aussehen, leider bin ich mir nicht im klaren darüber we ich das mit einem Timer realisieren soll?
Die 3 PWMs habe ich jetzt übrigens hinbekommen. Hier mal mein jetziger Code:
$regfile = "m8def.dat"
$crystal = 3686400
On Timer0 Ontimer0
Dim Led1 As Byte
Dim Led2 As Byte
Dim Led3 As Byte
Ddrc = &B00000000
Admux = &B01100000
Adcsr = &B11101111
Sreg.7 = 1
Config Pinb.1 = Output
Config Pinb.2 = Output
Tccr0 = &B00000010
Timsk.toie0 = 1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Compare = Clear , Prescale = 1
Do
Compare1a = Led1
Compare1b = Led2
Ocr2 = Led3
Loop
Ontimer0:
Led1 = Adch
Led2 = Adch
Led3 = Not Adch
Return
End
Das funktioniert soweit erst einmal.
Wenn jetzt noch jemand eine Idee hat - immer her damit :-)
Grüße und danke
Enrico
Aber du kannst den PWm auch selber schreiben, du nimmst dir einen Timer der relativ schnell nen Interrupt auslöst, im Interrupt zählst du in einer Variablen (i) bei jedem interrupt immer +1, von 0 bis 255, nach dem Wert für die entsprechende LED wird die Led dann ausgeschaltet, bei i = 0 werden die die Leds eingeschaltet. So hast du einen PWM und den Vorteil, dass du quasi beliebig viele PWMs aus einem Timer generieren kannst.
MFG Moritz
Hallo,
kannst du mir dafür ein Beispiel geben.
Mein Verständnisproblem liegt momentan darin, dass ich nur einen Eingang (Potentiometer) habe, welcher Werte zwischen 0 und 255 annehmen kann. Wenn ich jetzt 3 verschiedene PWMs habe müssen diese wie im Diagram dargestellt geregelt werden.
Für mich heist das, dass sich 6 verschiedene Kombinationen ergeben (240 / 40 = 6), eigentlich sind es 8, aber alle LEDs an und alle LEDs aus will ich jetzt mal weglassen.
Ich habe also für jede Kombination 40 Schritte (vom Potentiometer) mit denen ich das PWM-Signal von 0 - 240 in 6er-Schritten regeln muss.
Ich hatte mir da folgenden Code gedacht:
Leider funktioniert das so nicht, die LEDs gehen so mehr oder minder schlagartig an und aus, wenn ich am Poti drehe.Code:$regfile = "m8def.dat"
$crystal = 3686400
On Timer0 Ontimer0
Dim Led1 As Byte
Dim Led2 As Byte
Dim Led3 As Byte
Dim D1 As Byte
Dim D2 As Byte
Dim D3 As Byte
Dim D4 As Byte
Dim D5 As Byte
Dim D6 As Byte
Dim D2_1 As Byte
Dim D4_1 As Byte
Dim D6_1 As Byte
Ddrc = &B00000000
Admux = &B01100000
Adcsr = &B11101111
Sreg.7 = 1
Config Pinb.1 = Output
Config Pinb.2 = Output
Tccr0 = &B00000010
Timsk.toie0 = 1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Compare = Clear , Prescale = 1
Do
Compare1a = Led1
Compare1b = Led2
Ocr2 = Led3
Loop
D1 = Adch
D2_1 = Adch - 40
D2 = Not D2_1
D3 = Adch - 80
D4_1 = Adch - 120
D4 = Not D4_1
D5 = Adch - 160
D6_1 = Adch - 200
D6 = Not D6_1
Ontimer0:
If Adch <= 40 Then
Led1 = 240
Led2 = D1 * 6
Led3 = 0
Else
If Adch <= 80 Then
Led1 = D2 * 6
Led2 = 240
Led3 = 0
Else
If Adch <= 120 Then
Led1 = 0
Led2 = 240
Led3 = D3 * 6
Else
If Adch <= 160 Then
Led1 = 0
Led2 = D4 * 6
Led3 = 0
Else
If Adch <= 200 Then
Led1 = D5 * 6
Led2 = 0
Led3 = 240
Else
If Adch <= 240 Then
Led1 = 240
Led2 = 0
Led3 = D6 * 6
Else
End If
End If
End If
End If
End If
End If
Return
End
Also für weitere Hilfe bin ich sehr dankbar.
Grüße
Enrico
HM... also komeltt schreiben kann ichs dir wohl nicht, aber mal einen Anfang machen. Leider hab ich hier kein Bascom, es könnte also sein, das ein par Fehler drin sind, oder Dinge die leicht umgeschrieben werden können:
So sollte es gehen, der Vorteil, du musst halt nicht zwangsläufig bis 255 gehen, da das Farbchema ja nur bis 240 gehen, kannst du das besser anpassen. Außerdem brauchst du nur einen Timer.Code:Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 100 'Je nachdem wie hoch die PWM rate sein soll, musst du hier andere Werte setzen
Enable Timer0
Enable Interrupts
Dim i as byte
Do
Led1
Led2
Led3
'Hier werden die Werte für den PWM berechnet, wenn du nur Wert von 0 bis 240 hast, musst du unten einfach nur sagen dass i ab 240 wieder auf null geht.
Loop
end
Timer_irq
Timer0 = Timervorgabe
i++
If i >= 255 Then
i = 0
end if
if i > Led1 then portx = 0 'Portx muss vorher definiert werden
if i <= Led1 then portx = 1
if i > Led2 then portx = 0
if i <= Led2 then portx = 1
if i > Led3 then portx = 0
if i <= Led3 then portx = 1
Return
Wenn du eine PWM-Rate von 100Hz haben willst, müsstest du 8Mhz und Prescale 8 bei Timer0, außerdem einem PWM von 255 (mal gard nicht nicht 240) dann muss die Timervorgabe:
8000000/8/255=3906,25
Wenn der Timer jetzt bei 39 auslöst, hast du 100 Hz, Timervorgabe dann 256-39=217 sein.
MFG Moritz
Hallo nochmal,
ich hab jetzt endlich die Lösung:
Ob das nun die Endlösung ist wage ich mal zu bezweifeln, aber es funktioniert so wie ich es will und auch so wie es im Diagramm dargestellt ist.Code:$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Ddrd = &B11100000
Admux = &B01100000
Adcsr = &B11101111
Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 237
Enable Timer0
Enable Interrupts
Dim I As Byte
Dim Led1 As Byte
Dim Led2 As Byte
Dim Led3 As Byte
Dim D1 As Byte
Dim D2 As Byte
Dim D3 As Byte
Dim D4 As Byte
Dim D5 As Byte
Dim D6 As Byte
Dim D2_1 As Byte
Dim D4_1 As Byte
Dim D6_1 As Byte
Do
D1 = Adch
D2_1 = Adch - 40
D2 = Not D2_1
D3 = Adch - 80
D4_1 = Adch - 120
D4 = Not D4_1
D5 = Adch - 160
D6_1 = Adch - 200
D6 = Not D6_1
If Adch <= 40 Then
Led1 = 240
Led2 = D1 * 6
Led3 = 0
Else
If Adch <= 80 Then
Led1 = D2 * 6
Led2 = 240
Led3 = 0
Else
If Adch <= 120 Then
Led1 = 0
Led2 = 240
Led3 = D3 * 6
Else
If Adch <= 160 Then
Led1 = 0
Led2 = D4 * 6
Led3 = 240
Else
If Adch <= 200 Then
Led1 = D5 * 6
Led2 = 0
Led3 = 240
Else
If Adch <= 240 Then
Led1 = 240
Led2 = 0
Led3 = D6 * 6
Else
End If
End If
End If
End If
End If
End If
Loop
Timer_irq:
Timer0 = Timervorgabe
I = I + 1
If I = 255 Then
I = 0
End If
If I > Led1 Then Portd.5 = 0
If I <= Led1 Then Portd.5 = 1
If I > Led2 Then Portd.6 = 0
If I <= Led2 Then Portd.6 = 1
If I > Led3 Then Portd.7 = 0
If I <= Led3 Then Portd.7 = 1
Udr = Adch
Return
End
Wer jetzt noch Verbesserungsschläge hat - immer her damit.
Ich habe z.B. festgestellt, dass die LEDs nie ganz aus sind, sie leuchten auch bei eingestelltem 0-Wert noch ganz schwach (kaum zu sehen). Woran könnte das liegen?
Grüße und danke für eure Hilfe
Enrico
Also schön, wenn es so klappt, folgendes könntest du noch änder (minimal):
Ich hab dir ja geschriben:
Sinniger wäre:Zitat:
If I > Led1 Then Portd.5 = 0
If I <= Led1 Then Portd.5 = 1
If I >= Led1 Then Portd.5 = 0
If I < Led1 Then Portd.5 = 1
da sonst auch bei 0, da =0 immer ein Verhältniss von 1 zu 255 entsteht, auch bei Ledx = 0, aber ich glaube kaum dass das was ausmacht.
MFG Moritz
Hallo,
hattest recht, das hat auch was gebracht, jetzt sind die LEDs wirklich aus wenn sie auf 0 stehen. Nur wenn ADCH den Wert 255 hat (also wenn das Poti voll auf ist), leuchtet die 3. LED noch ganz leicht. Könnte das der Restwert von 240 auf 255 sein?
Grüße
Enrico