Software PWM

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
Versuche gerade ne Software Pwm zu programmieren , hab hier 4polige Superflux RGB Leds liegen, welche ich mit pwm ansteuern möchte um die fraben zu mischen... funzt aber leider nicht so wie ich will,.
also mein programm sieht folgendermassen aus :
Code:
$regfile = "m1284pdef.Dat"
$hwstack = 250
$swstack = 250
$framesize = 200
$crystal = 16000000                                         '8mhz
$baud = 9600

'Ein/Ausgänge konfigurieren
Ddrd = &B11100000

Hoch Alias Pind.2
Runter Alias Pind.3
Red Alias Portd.5                                           ' Green1 - first green led
Green Alias Portd.6                                         ' Green1 - first green led
Blue Alias Portd.7                                          ' Blue1 - first blue led

'Timer konfigurieren
Config Timer0 = Timer , Prescale = 1024                     ' fading timer
On Ovf0 Pwm_timer                                           ' jump to fadingroutine when the timer0 overrun
Enable Ovf0
Enable Interrupts                                           ' enable interrupts and timer0
Start Timer0
'Variablen Konfigurieren
Dim Programm As Byte                                        'Programmzähler
Dim R_current As Byte                                       'Aktueller Wert Rot
Dim G_current As Byte                                       'Aktueller Wert Grün
Dim B_current As Byte                                       'Aktueller Wert Blau
Dim R_dim As Byte                                           'Zielwert Rot
Dim G_dim As Byte                                           'Zielwert Grün
Dim B_dim As Byte                                           'Zielwert Blau
Dim Erreicht As Byte
Dim Colourcounter As Byte                                   'welche farbe aus dem table gelsen werden soll
Dim Pwmctr As Word
'Programm = 0
R_dim = 100
G_dim = 100
B_dim = 100
Pwmctr = 0
Erreicht = 7
Colourcounter = 0                                           ' &b00000111
'Sonstige Konfigurationen
Config Debounce = 25

'Hauptprogramm
Do

   Debounce Hoch , 1 , Prog_hoch , Sub
   Debounce Runter , 1 , Prog_runter , Sub
   'Menu________________________________________________________________________
   Select Case Programm
      Case 0:                                               'rgb faden komplett
         'Red = 1
         'Green = 1
         'Blue = 1
         Goto Rgb_fading
      Case 1:                                               'rgb faden komplett
         'Goto Rgb_fading
         'Print "case prog1"
         'Red = 1
      Case 2:
         Blue = 1
         'Print "case prog2"
         'Goto Rgb_fading
      Case 3:
         'Goto Fading
         'Print "case prog3"
      Case 4:
         'Print "case prog4"
      Case 5:
         'Goto Fading
         'Print "case prog5"
      Case 6:
         'Print "case prog6"
      Case 7:                                               'dauerfarbe weiss
         'rnd()'Goto Fading
         'Print "Dauer weiss"
         Red = 0
         Green = 0
         Blue = 0
      Case 8:                                               'dauerfarbe rot
         'Print "Dauer Rot"
         Red = 0
         Green = 1
         Blue = 1
      Case 9:                                               'dauerfarbe gruen
         'Goto Fading
         'Print "Dauer orange"
         Red = 1
         Green = 0
         Blue = 1
      Case 10:                                              'dauerfarbe blau
         'Print "Dauer Blau"
         Red = 1
         Green = 1
         Blue = 0
  End Select
  '_____________________________________________________________________________
Loop
End
'--------------------------------- Menü funktionen -----------------------------
Prog_hoch:
      If Programm > 11 Then
         Programm = 0
      Else
         Incr Programm
      End If
      Print "programmzaehler: " ; Programm
Return
Prog_runter:
      If Programm > 0 Then
         Decr Programm
      End If
      Print "programmzaehler: " ; Programm
Return
'--------------------------------- PWM Funktionen ------------------------------
Pwm_timer:
          'If Pwmctr < 255 Then
      Incr Pwmctr
'ausgabe
      If R_current < Pwmctr Then
         Set Red
      Else
         Reset Red
      End If
      If G_current < Pwmctr Then
         Set Green
      Else
         Reset Green
      End If
      If B_current < Pwmctr Then
         Set Blue
      Else
         Reset Blue
      End If
      Pwmctr = 0
          '     Else
                  'Print "pwm zurückgesetzt"
           '       Pwmctr = 0
       '   End If

Return
'--------------------------------- Programm Funktionen -------------------------
Rgb_fading:

      'Rot
          If R_current < R_dim Then                         'aktueller rotwert kleiner als Roter Zielwert
             Incr R_current
          Elseif R_current > R_dim Then
             Decr R_current
          Else
             Erreicht.0 = 0                                 '&B00000110 rot zielwert erreicht
          End If
          'Print "Rotwert: " ; R_current ; " / " ; R_dim
      'Grün
          If G_current < G_dim Then
             Incr G_current
          Elseif G_current > G_dim Then
             Decr G_current
          Else
             Erreicht.1 = 0                                 '&B00000101 grün zielwert erreicht
          End If
          'Print "Grünwert: " ; G_current ; " / " ; G_dim
      'Blau
          If B_current < B_dim Then
             Incr B_current
          Elseif B_current > B_dim Then
             Decr B_current
          Else
             Erreicht.2 = 0                                 ' &B00000100 blau zielwert erreicht
          End If
          'Print "Blauwert: " ; B_current ; " / " ; B_dim
          'Print "___________________________________________"


      'colourmixing
      If Erreicht = 0 Then                                  'alle zielwerte erreicht
         Wait 1
         Erreicht = 7
         Incr Colourcounter                                 'colourcounter um 1 erhöhen
         If Colourcounter = 7 Then                          'colourcounter zurücksetzen
            Colourcounter = 0
         End If
         R_dim = Lookup(colourcounter , Redtable)           ' rot wert aus tabelle laden
         G_dim = Lookup(colourcounter , Greentable)         ' greenwert aus tabelle laden
         B_dim = Lookup(colourcounter , Bluetable)          ' blau

      End If

Return

        'red,  or,   ye ,  gr ,  hbl,  bl,  pu
Redtable:
   Data 255 , 255 , 255 , 000 , 135 , 000 , 155
Greentable:
   Data 000 , 144 , 255 , 255 , 206 , 000 , 048
Bluetable:
   Data 000 , 000 , 000 , 000 , 235 , 255 , 255

habs mir halt so gedacht :
timer zählt mit interrupt meine variable pwmctr hoch(bis 0-255),
dann vergleiche ich ob meine farbwerte kleiner dem zählerwert von pwmctr sind, und steuere dann meine Leds an ,
und nicht wundern das es so komisch aussieht, ich steuere sozusagen den masse pol der Leds, da sie eine gemeinsame anode haben,.
 
Pwm_timer:
'If Pwmctr < 255 Then
Incr Pwmctr
'ausgabe
If R_current < Pwmctr Then
Set Red
Else
Reset Red
End If
If G_current < Pwmctr Then
Set Green
Else
Reset Green
End If
If B_current < Pwmctr Then
Set Blue
Else
Reset Blue
End If
Pwmctr = 0
' Else
'Print "pwm zurückgesetzt"
' Pwmctr = 0
' End If

Return
Macht das wirklich Sinn?

HBA
 
ok dann würde ich oben
Code:
incr pwmctr
und unten
Code:
if pwmctr > 255 then
 pwmctr= 0 
endif

schreiben, passieren tut dadurch aber auch nichts wirklich

wenn ich mir per Uart werte ausgeben lasse, sehe ich das er mir die grün, rot und blau werte , obwohl ne differenz besteht nicht hochzählt
 
Hi,

ok dann würde ich oben
Code:
incr pwmctr
und unten
Code:
if pwmctr > 255 then
 pwmctr= 0 
endif
schreiben, passieren tut dadurch aber auch nichts wirklich
wenn du die Variable "pwmctr" (ich nehme an es ist dein Rampenzähler) als
Byte definierst brauchst du nicht auf >255 testen weil das nie auftreten wird.
Er wird von 255 überlaufen und dann automatisch wieder bei 0 anfangen.

Das sind die Tricks die man bei Assembler lernt ;)

Gruß
Dino
 
wenn du die Variable "pwmctr" (ich nehme an es ist dein Rampenzähler) als
Byte definierst brauchst du nicht auf >255 testen weil das nie auftreten wird.
Er wird von 255 überlaufen und dann automatisch wieder bei 0 anfangen.

Hi Dino,

da hatte ich auch schon dran gedacht, aber er hat den Zähler als WORD definiert. Bascom macht Vergleiche BYTE < WORD richtig? Ich gehe mal davon aus.

Gruß,
Dirk
 
Dann solltest du alle
Goto RGB_Fading
durch
Gosub RGB_Fading
ersetzen. Sonst kannst du nicht zurückspringen.

Und ändere pwmctr auf Typ Byte ab, dann kannst die Abfrage weglassen.
Ich verstehe die Logik der RGB_Fading Sub noch nicht. Die wird andauernd aufgerufen, wenn programm=0 ist. Ich würde mal tippen mehrere 1000 mal so oft wie der timer überläuft. Dort werden die Werte von r_current, b_current und g_current permanent geändert.
Die Werte dürfen sich im Verhältnis zum Timer doch nur ganz langsam ändern, sprich wenn der Timer die Variable pwmctr einmal durchgezählt hat (nach 256 Timer Überläufen) macht es doch überhaupt erst Sinn, die Current Werte abzuändern. Dies passiert erst nach etwa 4 Sekunden. Du solltest also auch noch den Prescaler deutlich runtersetzen.

HBA
 
ja, hatte den nur hochgeschraubt zu testzwecken,
steht jetzt erstmal auf 1,

also von wegen goto und gosub, das hätte mir früher einfallen können, wunderte mich warum es nicht zurückspringt,dachte aber nicht daran,

das pwmctr= 0 hab ich jetzt weggelassen, und ich muss sagen das ergebnis sieht schon ganz akzeptabel aus,.

was denkt ihr, wie groß die chance ist eine fernbedienung wie diese hier anzusteuern ?
http://cgi.ebay.de/S-LUCE-Fernbedie...neinrichtung_Leuchtmittel&hash=item2eb324764c
 
Was meinst du denn mit "anzusteuern"?
Auswerten? Sorich du willst die Fernsteuerung benutzen um die Werte in deiner Applikation zu ändern?

HBA
 

Ü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)