-
        

Ergebnis 1 bis 4 von 4

Thema: RGB Lichtleiste ansteuern -> Problem mit LED-Reihenfolge

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    RGB Lichtleiste ansteuern -> Problem mit LED-Reihenfolge

    Anzeige

    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
    ...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Also ich denke das Problem liegt in dem Code für die Umschaltung für den Farbwechsel:
    Problem: es wird nur in einer Richtung umgeschaltet. Ich glaube ich muss bei PWM_Wert=0 und 255 umschalten?

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

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Problem mit dem Umschalten gelöst
    Leider klappt das Farbenmischen noch nicht.... sinnvoll wäre ja wenn eine Farbe gerade dunkler wird im dunkelsten zustand / im Auszustand die Farbe zu tauschen. Das passt in meinem Programm aber noch nicht immer... sieht komisch aus, wenn eine helle rote LED ausgeht und dafür eine helle blaue Led an geht... Hat da einer eine Idee?

    Farben sind ganz am ende im Programm bei der Software PWM.

    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
    
    '-------------------------------------------------------------------------------
    'Version 0.04
    '  -RS232 ok
    '  -RC5 ok
    '  -Farbe wechseln durch
    '  -jede Farbe doppelt!!!!!!!!!!!!!!!!
    
    'Version 0.05
    '  -
    '-------------------------------------------------------------------------------
    '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 = 1                                                  '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 < 251 And Updown = 1 Then
    Pwm_wert = Pwm_wert + 5
    End If
    
    If Command = 0 And Pwm_wert > 4 And Updown = 1 Then
    Pwm_wert = Pwm_wert - 5
    End If
    
    '---
    If Command = 0 And Pwm_wert < 251 And Updown = 0 Then
    Pwm_wert = Pwm_wert + 5
    End If
    
    If Command = 8 And Pwm_wert > 4 And Updown = 0 Then
    Pwm_wert = Pwm_wert - 5
    End If
    
    '--------Umschaltung Updown 0/1  (Hilfsmerker: UpDownM)
    If Pwm_wert = 0 And Updownm = 1 Then
    Toggle Updown
    Updownm = 0
    End If
    
    If Pwm_wert = 255 And Updownm = 1 Then
    toggle updown
    Updownm = 0
    End If
    
    
    If Pwm_wert = 200 And Updownm = 0 Then                      'Hilfsmerker bei 200 zurücksetzen
    Updownm = 1
    End If
    
    
    
    
    '--------LED-PAAR auswählen (Handbetrieb)
    '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.3 = 1                                             'BLAU PWM-Ausgang einschalten
        Portb.1 = 0                                             'ROT
          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.3 = 0                                             'BLAU
        Portb.1 = 1                                             'ROT
          End If
    
        End If
    'PWM UMSETZUNG ENDE
    
        Ri = Ri - 1
        If Ri = 255 Then Ri = 0
    
    Return
    ...

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    So - war wohl gestern Abend etwas zu müde....
    Jetzt läuft das Programm.

    Wenn die Tasten 8 oder 0 über IR-Fernbedienung (RC5 Code) gedrückt werden, können die Farben vor und zurück übergeblendet werden. Wenn man die Taste loslässt wird die aktuelle Farbe angehalten.

    Man könnte nun auch bestimmte Farbe speichern und auf eine feste Taste legen: Variable "Auswahl" (1-6) bestimmt die LED Gruppe(Rot&Grün, Rot&Blau, Blau&Grün) und Variable "PWM-Wert" (0-255) bestimmt das Mischverhältniss.

    wer´s braucht: viel Spaß damit.

    Tobias

    Code:
    'RGB - LED - Leiste über AT-Mega8
    'Tobias Blome - 12.01.2008
    '
    '-------------------------------------------------------------------------------
    'INFO´s
    
    
    'PWM_Wert = Sollwert für Software PWM
    
    'RC5 Eingang über Pin5 / PD3
    
    '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
    
    '-------------------------------------------------------------------------------
    'Version 0.04
    '  -RS232 ok
    '  -RC5 ok
    '  -Farbe wechseln durch
    '  -jede Farbe doppelt!!!!!!!!!!!!!!!!
    
    'Version 0.06
    '  - >251 und <4 wird die Auswahl umgeschaltet
    
    'Version 0.07
    '  -Auswahl von 3 auf 6 erhöht
    '  -Farben sortiert
    '
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    $regfile = "m8def.dat"                                      'AT-Mega32
    $crystal = 8000000                                          'Quarz: 8 MHz intern
    $baud = 9600                                                'Baudrate definieren
    
    '-------------------------------------------------------------------------------
    '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
    
    'Tasten
    Up Alias 8                                                  'Prog.Bezeichnung ALIAS Real Taste
    Down Alias 0
    
    '-------------------------------------------------------------------------------
    'Vor Programmstart:
    Flag = 1                                                    'Merker für PWM
    Pwm_wert = 100                                              'PWM-Wert
    Auswahl = 1                                                 'LED Auswahl
    Updown = 1                                                  '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 UP & DOWN 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 = Up And Pwm_wert < 251 And Updown = 1 Then
    Pwm_wert = Pwm_wert + 5
    End If
    
    If Command = Down And Pwm_wert > 4 And Updown = 1 Then
    Pwm_wert = Pwm_wert - 5
    End If
    
    '---
    If Command = Down And Pwm_wert < 251 And Updown = 0 Then
    Pwm_wert = Pwm_wert + 5
    End If
    
    If Command = Up And Pwm_wert > 4 And Updown = 0 Then
    Pwm_wert = Pwm_wert - 5
    End If
    
    '--------Umschaltung Updown 0/1  (Hilfsmerker: UpDownM)
    If Pwm_wert = 0 And Updownm = 1 Then
    Toggle Updown
    Updownm = 0
    End If
    
    If Pwm_wert = 255 And Updownm = 1 Then
    toggle updown
    Updownm = 0
    End If
    
    
    If Pwm_wert = 200 And Updownm = 0 Then                      'Hilfsmerker bei 200 zurücksetzen
    Updownm = 1
    End If
    
    
    
    
    '--------LED-PAAR auswählen (Handbetrieb)
    '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
    'wenn Taste für LED´s hochdimmen gedrückt -> muss bei 251 und bei 4 umgeschaltet werden
    If Command = Up And Pwm_wert > 251 Then
       If Auswahl = 6 Then
       Auswahl = 1
       Else
       Auswahl = Auswahl + 1
       End If
    End If
    
    If Command = Up And Pwm_wert < 4 Then
       If Auswahl = 6 Then
       Auswahl = 1
       Else
       Auswahl = Auswahl + 1
       End If
    End If
    
    '---
    'wenn Taste für LED´s runterdimmen gedrückt -> muss bei 251 und bei 4 umgeschaltet werden
    If Command = Down And Pwm_wert < 4 Then
       If Auswahl = 1 Then
       Auswahl = 6
       Else
       Auswahl = Auswahl - 1
       End If
    End If
    
    If Command = Down And Pwm_wert > 251 Then
       If Auswahl = 1 Then
       Auswahl = 6
       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.2 = 1                                             'GRÜN PWM-Ausgang einschalten
        Portb.1 = 0                                             'ROT PWM-Ausgang ausschalten
          End If
    
          If Auswahl = 2 Then                                   'Auswahl der LED Farben
        Portb.2 = 1                                             'GRÜN PWM-Ausgang einschalten
        Portb.3 = 0                                             'BLAU
          End If
    
          If Auswahl = 3 Then                                   'Auswahl der LED Farben
        Portb.1 = 1                                             'ROT PWM-Ausgang einschalten
        Portb.3 = 0                                             'BLAU
          End If
    
          If Auswahl = 4 Then                                   'Auswahl der LED Farben
        Portb.1 = 1                                             'ROT PWM-Ausgang einschalten
        Portb.2 = 0                                             'GRÜN PWM-Ausgang ausschalten
          End If
    
          If Auswahl = 5 Then                                   'Auswahl der LED Farben
        Portb.3 = 1                                             'BLAU PWM-Ausgang einschalten
        Portb.2 = 0                                             'GRÜN
          End If
    
          If Auswahl = 6 Then                                   'Auswahl der LED Farben
        Portb.3 = 1                                             'BLAU PWM-Ausgang einschalten
        Portb.1 = 0                                             'ROT
          End If
        Else                                                    'sonst
    '---
          If Auswahl = 1 Then
        Portb.2 = 0                                             'GRÜN  PWM-Ausgang ausschalten
        Portb.1 = 1                                             'ROT PWM-Ausgang einschalten
          End If
    
          If Auswahl = 2 Then
        Portb.2 = 0                                             'GRÜN
        Portb.3 = 1                                             'BLAU
          End If
    
          If Auswahl = 3 Then
        Portb.1 = 0                                             'ROT
        Portb.3 = 1                                             'BLAU
          End If
    
          If Auswahl = 4 Then
        Portb.1 = 0                                             'ROT  PWM-Ausgang ausschalten
        Portb.2 = 1                                             'GRÜN PWM-Ausgang einschalten
          End If
    
          If Auswahl = 5 Then
        Portb.3 = 0                                             'BLAU
        Portb.2 = 1                                             'GRÜN
          End If
    
          If Auswahl = 6 Then
        Portb.3 = 0                                             'BLAU
        Portb.1 = 1                                             'ROT
          End If
    
        End If
    'PWM UMSETZUNG ENDE
    
        Ri = Ri - 1
        If Ri = 255 Then Ri = 0
    
    Return
    ...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •