PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Led fader



Luppi
07.11.2008, 17:08
HI

Also es geht um folgendes.

Ich versuche einen Led fader zu Programmieren.

Eine Led faden klappt ganz gut über einen Port.

Jetzt wollte ich aber weitere Leds über einen anderen Port zusätlich faden lassen. Also langsamer als die erste und die andere schneller

Nur hab ich grad nen gedanken fehler. Ich weiß einfach nicht was ich in dem Programm ändern muß damit andere Ports angesprochen werden.

Vielleicht kann mir da mal einer auf die sprünge helfen.

MFG

Hier mal der code



$regfile = "m8def.dat"
$crystal = 4000000

Dim A As Word
Dim B As Word
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 8
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output

Do

For A = 255 To 10 Step -1
Pwm1a = A
Waitms 10
Next

For A = 10 To 255
Pwm1a = A
Waitms 10
Next

For A = 255 To 100 Step -1
Pwm1a = A
Waitms 10
Next

For A = 100 To 255
Pwm1a = A
Waitms 10
Next

For A = 255 To 50 Step -1
Pwm1a = A
Waitms 10
Next

For A = 50 To 255
Pwm1a = A
Waitms 10
Next

For A = 255 To 200 Step -1
Pwm1a = A
Waitms 10
Next

For A = 200 To 255
Pwm1a = A
Waitms 10
Next

Loop
End

Furtion
07.11.2008, 20:49
Hi,

du benutzt in diesem Fall ja den Hardware PWM d.h. das Signal wird dann
auf OC1A ausgegeben (Pwm1a) wenn du auf dem OC1B was ausgeben willst
muss du Pwm1b benutzen also Pwm1a = 50, Pwm1b = 100. Wenn du die jetzt
unterschiedlich schnell dimmen willst würde ich so was vorschlagen:

Do

I = I + 1
Pwm1a = I

A = A + 2
Pwm1b = A

Waitms 10

Loop

Damit wird Pwm1a langsamer gedimmt als Pwm1b da 1a nur in 1ser
Schritten erhöht wird, 1b in 2er Schritten

Luppi
07.11.2008, 23:04
so weit so gut.

Nur fadet das ja nur aus und nicht aus und wieder ein.

Hab das mal so gemacht. Geht soweit auch aber wie kriege ich es hin das beide zusammen läuft und nicht nacheinander

For A = 255 To 10 Step -1
Pwm1a = A
Waitms 40
Next
For B = 255 To 10 Step -1
Pwm1b = B
Waitms 30
Next

For A = 10 To 255
Pwm1a = A
Waitms 20
Next
For B = 10 To 255
Pwm1b = B
Waitms 10
Next

UriAn
08.11.2008, 11:30
Eine Led faden kann man auch so http://www.b-kainka.de/bastel108.htm.
nur so als tipp.
is evt. einfacher.

MfG René

Luppi
08.11.2008, 12:32
gut ist eventuell einfacher aber die schaltung soll noch erweitert werden damit ich ca 20 Leds pro Kanal schalten kann. Deswegen dachte ich da an nen atmega8 und nen max323 als verstärker.

Furtion
08.11.2008, 15:58
Hi,

naja 20 Leds mit einem Atmega8 könnten etwas problematisch werden,
da du dann den Software PWM benutzen musst, und je mehr Pwm Signale
du erzeugst, desto mehr Zeit braucht der Chip und die daraus resultierende
ist ein "Flackern" von Leds. Gut ich erzeuge mit einem Chip (Atmega16) 27
Pwm Signale, aber der Chip hat dann nicht mehr wirklich viel Zeit was
anderes zu machen (z.B. Daten von dem I²C Bus holen). Gut zu deinem
Problem:

Mit den ForSchleifen fadest du immer nur eine Led durch und danach die
andere, das Faden dauert zwar unterschiedlich lange, aber passiert nicht
gleichzeitig. Um dies zu erreichen musst du in einer For Schleife beide
Kanäle dimmen, den einen Schneller den anderen langsamer. Dies kannst
du dann auch per Loop Schleife machen, so wie ich das schon oben
geschrieben habe, um das ganze zurückzufaden, also dunkler zu machen
kannst du das einfach wieder abziehen:


Do
I = I - 1
Pwm1a = I
A = A - 2
Pwm1b = A
Waitms 10
if I = 0 or A = 0 then exit do
Loop

Do
I = I + 1
Pwm1a = I
A = A + 2
Pwm1b = A
Waitms 10
if I = 255 or A = 255 then exit do
Loop

Uwe DK1KQ
08.12.2008, 14:37
Hi,
darf ich mich in Euer Thema einklinken, da ich ein ähnliches vor habe.
zuerst einmal eine Grundsatzfrage
Ich möchte LEDs -- nacheinander --- dimmen. Es ist ein Lauflicht mit 24 (oder mehr) LEDs die im Kreis angeordnet sind .
Es soll nun so veränderet werden, dass jede LED nacheinander gedimmt wird.
Der Atmega 8 hat 3 PWM - Ausgänge.
Brauche ich jetzt einen Atmega mit 24 PWM ?

Dank Eures Threads habe ich beinahe verstanden wie man ein PWM mit varibaler Frequenz erzeugt.
was mir noch nicht klar ist, warum mehrere For -next vorhanden sind.

Verstehe das so, das man einmal hochzählt (steigende helligkeit) und dann wieder zurückzählt.
Bis zur nächsten LED muß dann eine weitere zeitschleife sein bis bei der nächsten LED der PWM erneut begonnen wird.

Ist das so richtig ?

Könnte das Programm eventuell mehr auskommentiert werden, damit ich den verlauf besser verstehen kann ?
Gruß Uwe

guenter1604
08.12.2008, 16:04
Hallo Uwe,

24 Kanäle wird schon wegen fehlender IO-Pins nicht gehen.

15Kanäle hab ich mit einem ATMega88 realisiert. Da ich keinen Quarz benutzen wollte und der 88er mit dem RC 8MHz schafft. Als PWM hab ich eine Softwarelösung gewählt, dann bin ich mit der Anzahl der dimmbaren Kanäle flexibel. Das flackern hält sich trotz zusätzlicher AD-Wandlung und IR-Empfang in Grenzen.
Anbei der prinzipielle Code:

$regfile = "m8def.dat"
$crystal = 1000000

Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

Osccal = 255

Dim Hell0 As Byte
Dim Hell1 As Byte
Dim Hell2 As Byte
'bis hell123456 Zwinkern

Dim Tick As Byte
Dim Range As Byte
Range = 100

On Timer0 Ontimer0
Tccr0 = &B00000001
Timsk.toie0 = 1
Enable Interrupts

Hell0 = 100
Hell1 = 10
Hell2 = 1

Do

Loop

End

Ontimer0:
Tick = Tick + 1
Timer0 = 254
If Tick >= Range Then
Tick = 0
End If
If Tick < Hell0 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
If Tick < Hell1 Then
Portb.2 = 1
Else
Portb.2 = 0
End If
If Tick < Hell2 Then
Portb.3 = 1
Else
Portb.3 = 0
END IF
Return

Uwe DK1KQ
08.12.2008, 18:18
Hallo Günter,
habe eben einmal das Programm in den Atmega8 geladen.
Doch da tut sich nichts.
Kanst Du das einmal bei Dir gegen. checken um heraus zu finden ob es bei mir oder anm Programm liegt. ?

Ziel ist es -- nach einander -- 24 oder mehr leds zu faden.
Einen bekomme ich hin aber nicht mehr ;-(
hier mein Programm

$regfile = "m8def.dat"
$crystal = 1000000 ' interner RC Oszillator

Dim A As Word
Dim B As Word
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1

Config Pinb.15 = Output

Do

For A = 255 To 10 Step -10
Pwm1a = A
Waitms 50
Next

For A = 10 To 255 Step 10
Pwm1a = A
Waitms 50
Next

Loop
End

Uwe

Andree-HB
08.12.2008, 21:15
Config Pinb.15 = Output


...den Pin gibt es nicht !

Uwe DK1KQ
09.12.2008, 10:37
Config Pinb.15 = Output


...den Pin gibt es nicht !

ja richtig, korrekt wäre Config Pinb.1

Damit funktioniert es auch, ein Schritt weiter, hilft allerdings nicht viel weiter
im eigentlichen Thema

Gruß Uwe

Andree-HB
09.12.2008, 10:53
...da Du in Deinem Code die Hardware-PWM benutzt, kannst Du nur insgesamt max. drei LED`s an fest definierten (!) Portpins nutzen - Guenthers Code hingegen löst die Steuerung über Software, damit kannst Du dann jeden I/O-Port ansprechen...Probiere einfach seinen Code mit LED`s an den von ihm angegeben Portpins...

Euer beider Codes arbeiten halt grundverschieden !

guenter1604
09.12.2008, 11:31
Hallo Uwe,

das Beispiel von mir zeigt nur, wie eine Software-PWM funktioniert. Da musst du dich jetzt reinknien und fragen bis du es begriffen hast ;-)

-Der Timer0 zählt bis zum Anschlag und löst einen Interrupt aus.
-Die Zählvariable Tick im Interrupt wird eins höher gesetzt und geprüft, ob der maximalwert Range erreicht ist.
-jetzt wird Tick mit dem gewünschten Helligkeitswert verglichen. Unterhalb des Werts wird der gewünschte Ausgang auf 1, ansonsten auf 0 gesetzt.

Ist der Helligkeitswert groß, bleibt der Ausgangswert lange auf 1 bevor Tick die Grösse vom Helligkeitswert erreicht hat und den Ausgang auf 0 schaltet.

Ist der Helligkeitswert klein, erreicht Tick schneller den Helligkeitswert und schaltet schneller auf 0.

Nachdem du jetzt genügend PWMs erzeugt hast kannst du in den Variablen Hell0 bis Hell23 die gewünschten Helligkeiten mit den For-Schleifen einstellen lassen.

Günter