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)
Code:'------------------------------------------------------------------------------- '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







Zitieren

Lesezeichen