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