TobiasBlome
11.01.2009, 22:35
Hallo,
ich möchte eine RGB LED Lichtleiste ansteuern. Jede Farbe(Rot, Grün, Blau) ist an einem µC-Pin.
Ich benutze einen Mega8 mit Basic.
Ziel ist, dass immer eine Led aus ist und 2 zum mischen leuchten. Die 2 die leuchten sollen invertiert sein: also wenn eine mit 20% leuchtet soll die andere mit 80% leuchten.
Da ich nur 3 Timer habe benutze ich die Software PWM.
Über eine Fernbedinung (RC5) sollen die Farben bei Taste festhalten durchlaufen, ich möchte aber auch feste "Farbkombinationen"(zb. 20%rot + 80%Grün) auf eine Taste legen.
Prinzip:
bei 3 Led´s habe ich 3 Möglichkeiten:
Rot / Grün
Grün / Blau
Blau / Rot
-> also 3 "Gruppen"
nun wechsel ich die 3 gruppen immer durch und gebe jeweils die 2 Software-PWM Signale auf die aktive Gruppe.
PROBLEM:
nach 2 Gruppen geht es nicht mehr weiter. Ich kann dann nur noch in die andere Richtung die Farbe ändern aber auch da ist dann nach 2 Gruppen Schluss.
Zur Tastenbelegung:
mit 8 & 0 werden die Farben vor- zurück durchlaufen.
1-3 wählt die aktive Gruppe (von Hand)
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega32
$crystal = 8000000 'Quarz: 8 MHz intern
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'INFO´s
'PWM_Wert = Sollwert für Software PWM
'Led Rot = Portb.1 = 1
'Led Grün = Portb.2 = 1
'Led Blau = Portb.3 = 1
'Auswahl = 1 -> Rot+Grün
'Auswahl = 2 -> Grün+Blau
'Auswahl = 3 -> Blau+Rot
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B1111111 '1 Ausgang, 0 Eingang = Pin PB7-0
'-------------------------------------------------------------------------------
'Timer0 = 8 Bit
'wird für RC5 Auswertung benötigt!!!
Config Rc5 = Pind.3 'Timer0 in Benutzung!!!
Portd.3 = 1
'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer1_irq
Const Timervorgabe = 57722 'also ca 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts
'Timer2 = 8 Bit SOFTWARE - PWM
Config Timer2 = Timer , Prescale = 1 'Teiler
Enable Timer2
On Timer2 Pwm_prog 'timer einschalten
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------
Dim Address As Byte , Command As Byte
Dim Flag As Bit
'PWM
Dim Z As Word
Dim Pwm_wert As Byte 'Sollwert
Dim Ri As Byte ' Hilfsregister
Dim Auswahl As Byte 'Wert 1-3 um die PWM auf die LED´s aufzuteilen
Dim Updown As Bit 'Merker für automatisch hoch und runter dimmen
Dim Updownm As Bit
'-------------------------------------------------------------------------------
'Vor Programmstart:
Flag = 1 'Merker für PWM
Pwm_wert = 100 'PWM-Wert
Auswahl = 1 'LED Auswahl
Updown = 0 'Merker um vor zurück zu änden
Updownm = 0
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
'Rc5 Code einlesen:
Getrc5(address , Command)
If Flag = 1 Then
Print "wait for command"
Flag = 0
End If
If Address <> 255 Then
Reset Command.7 ' reset toggle bit
Print "Address: " ; Address
Print "Command: " ; Command
Flag = 1
End If
'-------------------------------------------------------------------------------
'RC5 Code umsetzen:
'PWM-Wert über Taste 8 & 0 hoch runter
'PWM-Wert wird auf 0-255 begrenzt
'Wenn das Ende einer Richtung erreicht ist, wird automatisch in die andere Richtung gezählt (Merker: UpDown)
If Command = 8 And Pwm_wert < 250 And Updown = 0 Then
Pwm_wert = Pwm_wert + 5
End If
If Command = 0 And Pwm_wert > 4 And Updown = 0 Then
Pwm_wert = Pwm_wert - 5
End If
'---
If Command = 0 And Pwm_wert < 250 And Updown = 1 Then
Pwm_wert = Pwm_wert + 5
End If
If Command = 8 And Pwm_wert > 4 And Updown = 1 Then
Pwm_wert = Pwm_wert - 5
End If
'--------Umschaltung Updown 0/1 (Hilfsmerker: UpDownM)
If Pwm_wert = 0 And Updownm = 0 Then
Toggle Updown
Updownm = 1
End If
If Pwm_wert = 5 Then
Updownm = 0
End If
'--------LED-PAAR auswählen
'Auswahl 1 über FB LED Rot und Grün
If Command = 1 Then
Auswahl = 1
End If
'Auswahl 2 über FB LED Grün und Blau
If Command = 2 Then
Auswahl = 2
End If
'Auswahl 3 über FB LED Blau und Rot
If Command = 3 Then
Auswahl = 3
End If
'-------------------------------------------------------------------------------
'nicht benötigte 3. LED-Farbe bei Auswahl ausschalten
If Auswahl = 1 Then 'Rot und Grün -> Blau aus
Portb.3 = 0
End If
If Auswahl = 2 Then 'Grün und Blau -> Rot aus
Portb.1 = 0
End If
If Auswahl = 3 Then 'Blau und Rot -> Grün aus
Portb.2 = 0
End If
'-------------------------------------------------------------------------------
'Farbübergänge: zwischen den LED Paaren wechseln
If Command = 8 And Pwm_wert > 251 Then
If Auswahl = 3 Then
Auswahl = 1
Else
Auswahl = Auswahl + 1
End If
End If
If Command = 0 And Pwm_wert < 4 Then
If Auswahl = 1 Then
Auswahl = 3
Else
Auswahl = Auswahl - 1
End If
End If
Loop
End
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'TIMER SPRUNGMARKEN:
Timer1_irq:
Timer1 = Timervorgabe
'Print "Command: " ; Command ; " RC5 von FB"
'Print "PWM_Wert: " ; Pwm_wert ; " Sollwert"
'Print "Auswahl: " ; Auswahl ; " Wert 1-3 um die PWM auf die LED´s aufzuteilen"
'Print "UpDown: " ; Updown ; " Merker für automatisch hoch und runter dimmen"
'Print "UpDownM: " ; Updownm
'Print " "
Return
Pwm_prog:
'Funktion:
'Wenn der Zähler (z) =0 ist, dann beginnt ein neuer PWM Zyklus:
'Der Zähler (z) wird auf 255 gesetzt weil ein PWM Zyklus 255 Takte hat!
'In das Hilfsregister (Ri) wird der Sollwert (PWM_Wert) geladen
'der Zähler wird -1 gezählt
'wenn Ri z.B. = 50 dann ist Ri größer 0 und der Ausgang wird eingeschaltet Ri wird -1 gerechnet
'beim nächsten Durchlauf wird der Zähler wieder um 1 runtergezählt. Ri ist 50-1 also 49. 49ist größer als 0 und der Ausgang wird eingeschaltet
'wenn irgendwann Ri = 0 ist wird der Ausgang ausgeschaltet. Und das passiert solange (soviele Takte)bis der Zähler (Z) auf 0 heruntegezählt wurde
'wenn der Zähler (Z) = 0 ist ist ein PWM Zyklus zuende, der Zähler wird wieder auf 255 gesetzt und alles beginnt von vorne
'bei einem Sollwert von 50 (Ri=50) wird der Ausgang also 50 Takte EIN geschaltet und 205 Takte AUS geschaltet;
'das entspricht bei 5V im Mittel ca. 1V
If Z = 0 Then 'Z = Zähler für Verhältnisstakte
Z = 255 'Zähler (Z) auf 255 setzen
Ri = Pwm_wert 'Sollwert (PWM_Wert) in Hilfregister (Ri) schreiben
End If
'Zähler runterzählen
Z = Z - 1
'PWM UMSETZUNG ANFANG
If Ri > 0 Then 'wenn Hilfsregister (Ri) größer 0, dann
'PWM auf die LED-Paare übertragen
If Auswahl = 1 Then 'Auswahl der LED Farben
Portb.1 = 1 'ROT PWM-Ausgang einschalten
Portb.2 = 0 'GRÜN PWM-Ausgang ausschalten
End If
If Auswahl = 2 Then 'Auswahl der LED Farben
Portb.3 = 1 'BLAU PWM-Ausgang einschalten
Portb.2 = 0 'GRÜN
End If
If Auswahl = 3 Then 'Auswahl der LED Farben
Portb.1 = 1 'ROT PWM-Ausgang einschalten
Portb.3 = 0 'BLAU
End If
Else 'sonst
If Auswahl = 1 Then
Portb.1 = 0 'ROT PWM-Ausgang ausschalten
Portb.2 = 1 'GRÜN PWM-Ausgang einschalten
End If
If Auswahl = 2 Then
Portb.3 = 0 'BLAU
Portb.2 = 1 'GRÜN
End If
If Auswahl = 3 Then
Portb.1 = 0 'ROT
Portb.3 = 1 'BLAU
End If
End If
'PWM UMSETZUNG ENDE
Ri = Ri - 1
If Ri = 255 Then Ri = 0
Return
ich möchte eine RGB LED Lichtleiste ansteuern. Jede Farbe(Rot, Grün, Blau) ist an einem µC-Pin.
Ich benutze einen Mega8 mit Basic.
Ziel ist, dass immer eine Led aus ist und 2 zum mischen leuchten. Die 2 die leuchten sollen invertiert sein: also wenn eine mit 20% leuchtet soll die andere mit 80% leuchten.
Da ich nur 3 Timer habe benutze ich die Software PWM.
Über eine Fernbedinung (RC5) sollen die Farben bei Taste festhalten durchlaufen, ich möchte aber auch feste "Farbkombinationen"(zb. 20%rot + 80%Grün) auf eine Taste legen.
Prinzip:
bei 3 Led´s habe ich 3 Möglichkeiten:
Rot / Grün
Grün / Blau
Blau / Rot
-> also 3 "Gruppen"
nun wechsel ich die 3 gruppen immer durch und gebe jeweils die 2 Software-PWM Signale auf die aktive Gruppe.
PROBLEM:
nach 2 Gruppen geht es nicht mehr weiter. Ich kann dann nur noch in die andere Richtung die Farbe ändern aber auch da ist dann nach 2 Gruppen Schluss.
Zur Tastenbelegung:
mit 8 & 0 werden die Farben vor- zurück durchlaufen.
1-3 wählt die aktive Gruppe (von Hand)
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega32
$crystal = 8000000 'Quarz: 8 MHz intern
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'INFO´s
'PWM_Wert = Sollwert für Software PWM
'Led Rot = Portb.1 = 1
'Led Grün = Portb.2 = 1
'Led Blau = Portb.3 = 1
'Auswahl = 1 -> Rot+Grün
'Auswahl = 2 -> Grün+Blau
'Auswahl = 3 -> Blau+Rot
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B1111111 '1 Ausgang, 0 Eingang = Pin PB7-0
'-------------------------------------------------------------------------------
'Timer0 = 8 Bit
'wird für RC5 Auswertung benötigt!!!
Config Rc5 = Pind.3 'Timer0 in Benutzung!!!
Portd.3 = 1
'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer1_irq
Const Timervorgabe = 57722 'also ca 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts
'Timer2 = 8 Bit SOFTWARE - PWM
Config Timer2 = Timer , Prescale = 1 'Teiler
Enable Timer2
On Timer2 Pwm_prog 'timer einschalten
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------
Dim Address As Byte , Command As Byte
Dim Flag As Bit
'PWM
Dim Z As Word
Dim Pwm_wert As Byte 'Sollwert
Dim Ri As Byte ' Hilfsregister
Dim Auswahl As Byte 'Wert 1-3 um die PWM auf die LED´s aufzuteilen
Dim Updown As Bit 'Merker für automatisch hoch und runter dimmen
Dim Updownm As Bit
'-------------------------------------------------------------------------------
'Vor Programmstart:
Flag = 1 'Merker für PWM
Pwm_wert = 100 'PWM-Wert
Auswahl = 1 'LED Auswahl
Updown = 0 'Merker um vor zurück zu änden
Updownm = 0
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
'Rc5 Code einlesen:
Getrc5(address , Command)
If Flag = 1 Then
Print "wait for command"
Flag = 0
End If
If Address <> 255 Then
Reset Command.7 ' reset toggle bit
Print "Address: " ; Address
Print "Command: " ; Command
Flag = 1
End If
'-------------------------------------------------------------------------------
'RC5 Code umsetzen:
'PWM-Wert über Taste 8 & 0 hoch runter
'PWM-Wert wird auf 0-255 begrenzt
'Wenn das Ende einer Richtung erreicht ist, wird automatisch in die andere Richtung gezählt (Merker: UpDown)
If Command = 8 And Pwm_wert < 250 And Updown = 0 Then
Pwm_wert = Pwm_wert + 5
End If
If Command = 0 And Pwm_wert > 4 And Updown = 0 Then
Pwm_wert = Pwm_wert - 5
End If
'---
If Command = 0 And Pwm_wert < 250 And Updown = 1 Then
Pwm_wert = Pwm_wert + 5
End If
If Command = 8 And Pwm_wert > 4 And Updown = 1 Then
Pwm_wert = Pwm_wert - 5
End If
'--------Umschaltung Updown 0/1 (Hilfsmerker: UpDownM)
If Pwm_wert = 0 And Updownm = 0 Then
Toggle Updown
Updownm = 1
End If
If Pwm_wert = 5 Then
Updownm = 0
End If
'--------LED-PAAR auswählen
'Auswahl 1 über FB LED Rot und Grün
If Command = 1 Then
Auswahl = 1
End If
'Auswahl 2 über FB LED Grün und Blau
If Command = 2 Then
Auswahl = 2
End If
'Auswahl 3 über FB LED Blau und Rot
If Command = 3 Then
Auswahl = 3
End If
'-------------------------------------------------------------------------------
'nicht benötigte 3. LED-Farbe bei Auswahl ausschalten
If Auswahl = 1 Then 'Rot und Grün -> Blau aus
Portb.3 = 0
End If
If Auswahl = 2 Then 'Grün und Blau -> Rot aus
Portb.1 = 0
End If
If Auswahl = 3 Then 'Blau und Rot -> Grün aus
Portb.2 = 0
End If
'-------------------------------------------------------------------------------
'Farbübergänge: zwischen den LED Paaren wechseln
If Command = 8 And Pwm_wert > 251 Then
If Auswahl = 3 Then
Auswahl = 1
Else
Auswahl = Auswahl + 1
End If
End If
If Command = 0 And Pwm_wert < 4 Then
If Auswahl = 1 Then
Auswahl = 3
Else
Auswahl = Auswahl - 1
End If
End If
Loop
End
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'TIMER SPRUNGMARKEN:
Timer1_irq:
Timer1 = Timervorgabe
'Print "Command: " ; Command ; " RC5 von FB"
'Print "PWM_Wert: " ; Pwm_wert ; " Sollwert"
'Print "Auswahl: " ; Auswahl ; " Wert 1-3 um die PWM auf die LED´s aufzuteilen"
'Print "UpDown: " ; Updown ; " Merker für automatisch hoch und runter dimmen"
'Print "UpDownM: " ; Updownm
'Print " "
Return
Pwm_prog:
'Funktion:
'Wenn der Zähler (z) =0 ist, dann beginnt ein neuer PWM Zyklus:
'Der Zähler (z) wird auf 255 gesetzt weil ein PWM Zyklus 255 Takte hat!
'In das Hilfsregister (Ri) wird der Sollwert (PWM_Wert) geladen
'der Zähler wird -1 gezählt
'wenn Ri z.B. = 50 dann ist Ri größer 0 und der Ausgang wird eingeschaltet Ri wird -1 gerechnet
'beim nächsten Durchlauf wird der Zähler wieder um 1 runtergezählt. Ri ist 50-1 also 49. 49ist größer als 0 und der Ausgang wird eingeschaltet
'wenn irgendwann Ri = 0 ist wird der Ausgang ausgeschaltet. Und das passiert solange (soviele Takte)bis der Zähler (Z) auf 0 heruntegezählt wurde
'wenn der Zähler (Z) = 0 ist ist ein PWM Zyklus zuende, der Zähler wird wieder auf 255 gesetzt und alles beginnt von vorne
'bei einem Sollwert von 50 (Ri=50) wird der Ausgang also 50 Takte EIN geschaltet und 205 Takte AUS geschaltet;
'das entspricht bei 5V im Mittel ca. 1V
If Z = 0 Then 'Z = Zähler für Verhältnisstakte
Z = 255 'Zähler (Z) auf 255 setzen
Ri = Pwm_wert 'Sollwert (PWM_Wert) in Hilfregister (Ri) schreiben
End If
'Zähler runterzählen
Z = Z - 1
'PWM UMSETZUNG ANFANG
If Ri > 0 Then 'wenn Hilfsregister (Ri) größer 0, dann
'PWM auf die LED-Paare übertragen
If Auswahl = 1 Then 'Auswahl der LED Farben
Portb.1 = 1 'ROT PWM-Ausgang einschalten
Portb.2 = 0 'GRÜN PWM-Ausgang ausschalten
End If
If Auswahl = 2 Then 'Auswahl der LED Farben
Portb.3 = 1 'BLAU PWM-Ausgang einschalten
Portb.2 = 0 'GRÜN
End If
If Auswahl = 3 Then 'Auswahl der LED Farben
Portb.1 = 1 'ROT PWM-Ausgang einschalten
Portb.3 = 0 'BLAU
End If
Else 'sonst
If Auswahl = 1 Then
Portb.1 = 0 'ROT PWM-Ausgang ausschalten
Portb.2 = 1 'GRÜN PWM-Ausgang einschalten
End If
If Auswahl = 2 Then
Portb.3 = 0 'BLAU
Portb.2 = 1 'GRÜN
End If
If Auswahl = 3 Then
Portb.1 = 0 'ROT
Portb.3 = 1 'BLAU
End If
End If
'PWM UMSETZUNG ENDE
Ri = Ri - 1
If Ri = 255 Then Ri = 0
Return