Bascom atm128a RGB LED vorangewählte Farben gleichmäßig dimmen

RoTo

Mitglied
18. Juli 2010
51
0
6
In der nahe von Kassel
Sprachen
  1. BascomAVR
Hallo Leute,
vielleicht kann ja jemand mich aufklären?

Folgendes, ich habe so weit Programm und Hardware fertig, so das ich per Drehimpulsgeber (ALPS) und dem TIMER1 /Ocr1a,b,c (später dann auch für zweiten Kanal TIMER3) mir die Farben einstellen kann, so weit so gut.

Jetzt würde ich aber gerne RGB LED auch gleichmäßig auf und ab dimmen mit vorgewählter Farbe.

Led Helligkeit 0%=255 & 100%=0

Led1r Alias Ocr1a
Led1g Alias Ocr1b
Led1b Alias Ocr1c

Led1r = Rotb
Led1g = Gruenb
Led1b = Blaub

Rotb= 100
Gruenb=255
Blaub=160

mit Inkrementieren wahr ich schon einmal so weit, aber am ende bleibt immer noch eine Farbe an, oder ist es normal?:confused:

Kann mich jemand Aufklären?
 
Hallo Roto!

Ich weiß gerade nicht, was du meinst. :hmmmm:

Wenn du mit dem Encoder die Werte einzeln ändern kannst, dann kannst doch auch alle Werte "gleichzeitig" ändern.
OK, du kannst den "Zählwert" des Encoders dann nicht direkt übergeben sondern musst das für jeden "Farbwert" berechnen.
Sollte dann aber funktionieren.......

Oder habe ich das jetzt falsch verstanden?

Grüße,
Cassio
 
Hallo zusammen,

ich weiss nicht genau ob ich es richtig verstanden habe und ob es an folgendem liegt:

So wie ich die Sache sehe, ist der Timer mit 8Bit PWM konfiguriert. Wenn nun mit unterschiedlichen Startwerten inkrementiert wird, nicht von Null, dann erreicht man nie einen gleichen Endzustand, da der Wert in der Farbvariablen bzw. im Compare-Register überläuft und nicht bei 0 oder bei 255 stehen bleibt.

Dirk
 
Hallo !

Nun ja.... so wie ich es geschrieben habe. :wink:


Bei gemeinsamer Verstellung aller drei Farbwerte würde ich dem Drehencoder eine "vierte" Variable zählen lassen und diese dann entsprechend mit den eigentlichen Werten berechnen.

Beispiel:
Aktuelle Werte sind:
Rot = 128
Gruen = 101
Blau = 135

Nun wird über den Drehencoder eine "vierte" Variable (z.B. weiss) verändert....

Anschließend musst du nur noch:
Rot = Rot + weiss
Gruen = Gruen + weiss
Blau = Blau + weiss

Wenn "weiss" ein Integer ist, kannst du auch durch Addition die Werte minimieren.
Rot = Rot + weiss
118 = 128 + (-10)

So meinte ich das.
Ist zumindest eine Idee, die mir spontan dazu gekommen ist. :wink:


Grüße,
Cassio
 
Hallo Dirk,

schön von dir zu hören.

Die TIMER1/3 bei dem ATmega128a sind 16 Bit Timer nicht 8 Bit aber dennoch stehe ich im Wald:( k.a.
 
Hallo RoTo,
Die TIMER1/3 bei dem ATmega128a sind 16 Bit Timer nicht 8 Bit aber dennoch stehe ich im Wald:( k.a.

du hattest ja geschrieben
Led Helligkeit 0%=255 & 100%=0
das sieht nach 8Bit Auflösung aus. Es macht auch keinen Sinn volle 16bit PWM-Auflösung auszunutzen.

Vielleicht stelle auch einfach mal dein bisherigen Sourcecode rein.

Gruß,
Dirk
 
Aber Bitte nicht lachen

Code:
$regfile = "m128def.dat"
$crystal = 16000000

Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.3
Config Lcdbus = 4
'*******************************************************************************
Config Timer0 = Timer , Prescale = 64
Const Timervorgabe = 6
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down , Prescale = 8
'Config Timer3 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down , Prescale = 8


Cls
Dim Eramdummy As Eram Byte
Dim E_licht As Eram Byte , E_gruent As Eram Byte , E_rott As Eram Byte , E_blaut As Eram Byte , E_rotb As Eram Byte
Dim E_gruenb As Eram Byte , E_farbet As Eram Byte , E_farbeb As Eram Byte , E_blaub As Eram Byte
Dim Licht As Byte , Gruent As Byte , Rott As Byte , Blaut As Byte , Rotb As Byte , Blaub As Byte , Gruenb As Byte
Dim Farbet As Byte , Farbeb As Byte


Dim H As Byte , P As Byte , T As Byte , W As Word , Deca As Byte , Wtemp As Byte
Dim S As Bit



Initlcd
Wait 1
 Cls
Cursor Off                                                  'off Blink
Lcd "RS - RWM-RGB V0.1"                                     '
                                                     '
                                                              '
Config Debounce = 10                                        '
Config Int0 = Falling                                       'Rising Falling
Config Int2 = Falling

Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pinb.0 = Output
Config Pinb.5 = Output
Config Pinb.6 = Output
Config Pinb.7 = Output
Const Debouncetime = 3

On Int0 Decoder
On Int2 Dec_taste
On Timer0 T0isr



'Led2r Alias Ocr3a
'Led2g Alias Ocr3b
'Led2b Alias Ocr3c


Enable Interrupts
Enable Int0
Enable Int2
Enable Timer1
Enable Timer0
'Enable Timer3
'Start Timer3
Start Timer1

Portd.0 = 1
Portd.1 = 1
Portd.2 = 1


T = 1
H = 0
P = 0
Cls

Licht = E_licht
Rotb = E_rotb
Gruenb = E_gruenb
Blaub = E_blaub

Led1r Alias Ocr1a
Led1g Alias Ocr1b
Led1b Alias Ocr1c

Led1r = Rotb
Led1g = Gruenb
Led1b = Blaub

Locate 1 , 2 : Lcd "* * * Menue: * * *"
Locate 2 , 1 : Lcd "     Probe V1.0   "
Wait 2


Gosub Menue


'--------------------------------HAUPTPROGRAMM---------------------------------
Do
Led1r = Rotb
Led1g = Gruenb
Led1b = Blaub

Loop
End

'--------------------------------Decoder Auswertung Rechts/Links----------------
Decoder:

 If Pind.0 = 0 Then
   If Pind.1 = 1 Then Gosub Rechts Else Gosub Links
 End If
Return

'--------------------------------Decoder Auswertung Taste-----------------------
Dec_taste:
'If T = 2 And H = 0 Then
   ' Led1r = 255
    'Led1g = 255
    'Led1b = 255
 '  Incr T
'End If
  If T < 3 Then
    Incr T
  End If
     If T = 3 And H = 1 And P = 4 Then
        Incr T
        P = 1
     End If
        If T = 4 And H = 2 And P = 4 Then
           Incr T
           P = 1
           H = 0
        End If
           If T = 5 And H = 3 And P = 5 Then
              Incr T
              P = 2
              H = 0
           End If
              If T = 6 And H = 4 And P = 2 Then
                 T = 1
                 P = 0
                 H = 0
              End If
                 If T = 6 And H = 4 And P = 4 Then
                 T = 7
                 P = 0
                 H = 0
              End If

Gosub Menue
Gosub Punkt
Locate 4 , 1 : Lcd T
Locate 4 , 2 : Lcd H

Return

'--------------------------------Incrementiere----------------------------------
Rechts:

If Deca < 255 Then Incr Deca
   If H = 0 And T = 2 And Licht < 30 Then
      Incr Licht
      Locate 3 , 14 : Lcd "  "
      Locate 3 , 14 : Lcd Licht
   End If
    If H = 1 Or H = 2 And P < 4 And Pind.2 = 1 Then
       Incr P
    End If
     If H = 3 And P < 5 And Pind.2 = 1 Then
        Incr P
        If P = 3 Then P = 5
     End If
      If H = 4 And P < 4 And Pind.2 = 1 Then
         Incr P
         If P = 3 Then P = 4
      End If
       If H = 1 And Pind.2 = 0 Then
          Select Case P
          Case 1 And Rotb > 0
           Decr Rotb
           Locate 2 , 7 : Lcd "   "
           Locate 2 , 7 : Lcd Rotb
          Case 2 And Blaub > 0
           Decr Blaub
           Locate 3 , 7 : Lcd "   "
           Locate 3 , 7 : Lcd Blaub
          Case 3 And Gruenb > 0
           Decr Gruenb
           Locate 2 , 18 : Lcd "   "
           Locate 2 , 18 : Lcd Gruenb
          End Select
       End If



Locate 4 , 20 : Lcd P
Gosub Punkt
Return

'--------------------------------Decrementiere----------------------------------
Links:

If Deca > 0 Then Decr Deca
   If H = 0 And T = 2 And Licht > 0 Then
      Decr Licht
      Locate 3 , 14 : Lcd "   "
      Locate 3 , 14 : Lcd Licht
   End If
    If H = 1 Or H = 2 And P > 1 And Pind.2 = 1 Then
       Decr P
    End If
     If H = 3 And P > 1 And Pind.2 = 1 Then
        Decr P
       If P = 4 Then P = 2
     End If
      If H = 4 And P > 2 And Pind.2 = 1 Then
         Decr P
        If P = 3 Then P = 2
      End If
       If H = 1 And Pind.2 = 0 Then
          Select Case P
          Case 1 And Rotb < 255
           Incr Rotb
           Locate 2 , 7 : Lcd Rotb
          Case 2 And Blaub < 255
           Incr Blaub
           Locate 3 , 7 : Lcd Blaub
          Case 3 And Gruenb < 255
           Incr Gruenb
           Locate 2 , 18 : Lcd Gruenb
          End Select
       End If


Locate 4 , 20 : Lcd P
Gosub Punkt
Return

'----------------------------------LCD-Anzeige mit(*) Aktive Farbe--------------
Punkt:
 If H > 0 Then
 Select Case P
 Case 1
  Locate 2 , 1 : Lcd "*"
  Locate 2 , 11 : Lcd " "
  Locate 3 , 1 : Lcd " "
  Locate 3 , 11 : Lcd " "
 Case 2
  Locate 2 , 1 : Lcd " "
  Locate 2 , 11 : Lcd " "
  Locate 3 , 1 : Lcd "*"
  Locate 3 , 11 : Lcd " "
 Case 3
  Locate 2 , 1 : Lcd " "
  Locate 2 , 11 : Lcd "*"
  Locate 3 , 1 : Lcd " "
  Locate 3 , 11 : Lcd " "
 Case 4
  Locate 2 , 1 : Lcd " "
  Locate 2 , 11 : Lcd " "
  Locate 3 , 1 : Lcd " "
  Locate 3 , 11 : Lcd "*"
 Case 5
  Locate 2 , 1 : Lcd " "
  Locate 2 , 11 : Lcd " "
  Locate 3 , 1 : Lcd " "
  Locate 3 , 11 : Lcd " "
  Locate 4 , 1 : Lcd "*"
 End Select
End If
Return

'----------------------------------MENÜ-----------------------------------------
Menue:

Locate 4 , 1 : Lcd T
Select Case T
 Case 1
  Cls
  Locate 1 , 1 : Lcd "XXXXXXXXXXXXXXXXXXXX"
  Locate 2 , 1 : Lcd "X      V0.1        X"
  Locate 3 , 1 : Lcd "X      E           X"
  Locate 4 , 1 : Lcd "XXXXXXXXXXXXXXXXXXXX"
 Case 2
  Cls
  Locate 1 , 1 : Lcd "    NACHTLICHT"
  Locate 2 , 1 : Lcd " Dauermax = 30sec"
  Locate 3 , 1 : Lcd " Dauer/sec = " ; Licht
 Case 3
  H = 1
  Cls
  Locate 1 , 1 : Lcd "FARBE-BEDIENELEMENTE"
  Locate 2 , 2 : Lcd "ROT> " ; Rotb
  Locate 2 , 12 : Lcd "GRUEN>" ; Gruenb
  Locate 3 , 2 : Lcd "BLAU>" ; Blaub
  Locate 3 , 12 : Lcd "WEITER "
 Case 4
  H = 2
  Cls
  Locate 1 , 1 : Lcd "    FARBE-TACHO     "
  Locate 2 , 2 : Lcd "ROT> " ; Rott
  Locate 2 , 12 : Lcd "GRUEN>" ; Gruent
  Locate 3 , 2 : Lcd "BLAU> " ; Blaut
  Locate 3 , 12 : Lcd "WEITER"
 Case 5
  H = 3
  Cls
  Locate 1 , 1 : Lcd "  DEFENIERTE FARBEN"
  Locate 2 , 2 : Lcd "BEDIENELEMENTE " ; Farbeb
  Locate 3 , 2 : Lcd "TACHO " ; Farbet
  Locate 4 , 2 : Lcd "WEITER "
 Case 6
  H = 4
  Cls
  Locate 1 , 3 : Lcd "VOREISTELLUNGEN"
  Locate 2 , 6 : Lcd "   SPEICHERN"
  Locate 3 , 12 : Lcd "JA "
  Locate 3 , 2 : Lcd "NEIN"
 Case 7
  Cls
  Locate 1 , 1 : Lcd "**   EISTELLUNGEN **"
  Locate 2 , 1 : Lcd "****   WERDEN   ****"
  Locate 3 , 1 : Lcd "**   GESPEICHERT  **"
  Locate 4 , 1 : Lcd "********************"
  T = 1
 Gosub Eram_schreiben


 End Select
Return

'----------------------DATEN-IN-EEPROM------------------------------------------
Eram_schreiben:
 E_licht = Licht

Wait 2

Gosub Menue

Return
'-------------------------------------------------------------------------------------

Tacho_farbe:
 Led1r = 0
 Led1g = 0
 Led1b = 0
Return

'-------------------------------------------------------------------------------
Bedien_farbe:
Led1r = Rotb
Led1g = Gruenb
Led1b = Blaub
Return

'Start Timer0
'Set Portb.0

T0isr:
Timer0 = Timervorgabe
 Incr W
 If W = 1000 Then
    W = 0
    Incr Wtemp
  If Wtemp = Licht Then
     Stop Timer0
     Wtemp = 0
     Reset Portb.0
 End If
End If
Return
 
Hallo Roto!

Puh.... verzeih bitte, aber das ist natürlich eine ganz schöne Aufgabe, sich in den Code zu denken.
Aber Dirk hatte ja danach gefragt, der wird das schon machen. :D


Was mir beim Durchsehen auffiel....
Warum fragst du den Drehencoder denn in dieser Form ab?
Gibt es dafür einen speziellen Grund?

Kannst du nicht einfach die Anweisung ENCODER (siehe Link) verwenden?
Die Anweisung könntest du dann z.B. auch mit Timer2 regelmäßig aufrufen.

Klick mal auf den Link und schau dir die Anweisung mal an, dann verstehst du vielleicht auch wie ich das gemeint habe. :hmmmm:


Grüße,
Cassio
 
Hi Cassio,

nein eigentlich nicht, bis auf das das der Encoder Hardwaremäßig Entprellt ist da ich in der Vergangenheit keine saubere Zählung hin bekommen habe entschied ich mich da für.
Die Hilfe im Bascom kenne ich Cassio und glaube mir ich habe es probiert.
Jetzt kriege ich wirklich jeden Inkrement mit egal wie schnell ich drehe.

Ich weiß das Code unkommentiert ist es ist so das man löscht, fügt was wieder ein es muss erst ein mal funktionieren.

Du hast mir einen Spontanen Beispiel gemacht mit Addition
Anschließend musst du nur noch:
Rot = Rot + weiss
Gruen = Gruen + weiss
Blau = Blau + weiss

Wenn "weiss" ein Integer ist, kannst du auch durch Addition die Werte minimieren.
Rot = Rot + weiss
118 = 128 + (-10)

wo ist der unterschied wenn ein Vierte Variable Dimmen as Byte nehme mit sagen wir 30 Wert

Rotb= 100
Gruenb=255
Blaub=160

Rotb=Rotb+Dimmen
Rotb=130
und was ist mit Gruenb ? oder habe ich eine Denkblockade :)
 
Hallo !

Deine Probleme mit dem "sauberen" Zählen beim Drehen liegt vermutlich daran, dass du die Vorangestellte Variable beim Drehen nicht mehr ausgewertet hast.
Ist nun aber auch egal.....
Du hast es selber so gelöst, verstehst die Funktion und es funktioniert.
Problematischer bzw. schwieriger wird es aber dann, wenn du nun etwas ändern bzw. erweitern möchtest.
Das ist genau jetzt der Fall..... :wink:
Du hast eine eigene Lösung für den Encoder gefunden, darum musst du nun auch etwas anders vorgehen.


Eine Denkblokade hast du übrigens nicht. :)
Wenn du nun deine Variable "Dimmen" mit Encoder veränderst, musst du danach auch alle Farbwerte einzeln neu berechnen lassen.
Also....
Rotb = Rotb + Dimmen
Gruenb = Gruenb + Dimmen
Blaub = Blaub + Dimmen

Natürlich musst du noch eine Überprüfung einbauen, dass du keine "Überläufe" in den einzelnen Farben berechnest.


Eine ganz andere (und einfachere) Möglichkeit wäre natürlich, die gemeinsamen Anoden (oder Kathoden... je nach Typ) mit einem anderen Timer zu pulsen.....
also mit einem Hard- oder Software-PWM zu takten und damit gemeinsam zu dimmen.
Ich weiß jetzt aber nicht ob du das möchtest und ob du den Hardwareaufbau noch ändern kannst.

Grüße,
Cassio
 
Hallo Cassio,

nun so ist es nicht ich bin für vieles offen, Hardware nun die teile stecken alle noch auf den Steckbrett, da her ist es nicht so tragisch, 99% lässt sich noch ändern.

Zu meiner Ansteuerung der LED's, die werden über gemeinsamen Kathoden angesteuert und je Anode an OCR1A,B,C.

Aber vielleicht wahr die frage einfach unüberlegt und dumm, den egal ob ich mit Soft-Hardware PWM takte, die Tatsache ist doch das die unterschiedliche Werte bei den Farben bleiben nun mal, und eine oder zwei Farben werden schneller aus sein wie die dritte beim ab dimmen bis auf die Weise:)

Es sei dem man schaut welche von den drei Farben einen höchsten/zweit höchsten wert haben (z.b. im meinem Fall) und lässt die Werte jeden zweiten/dritten dazu Addieren.
Ich weiß auch nicht, wahr nur so ein Gedanke:stupido2:

Grüße

RoTo
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)