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