Hallo Freunde.
Ich arbeite derzeit an einer RGB-LED-Steuerung und bin für meine Verhältnisse schon sehr weit gekommen.Nachdem ich zunächst versucht hatte, das Programm aus Schnipseln und/oder ganzen Programmen aus dem Internet aufzubauen, was jedoch gar nicht funktionierte, schrieb ich es von grundauf komplett neu, mit eigenen Ideen und eigener Programm-Struktur. So hab ich da wenigstens den Durchblick ^^.
Das Programm umfasst dabei ein Hauptmenü, in welchem 8 Farben, erzeugt durch Hardware-PWM, anwählbar sind. Bleibt man in diesem Menü, so ist die Farbe dauerhaft leuchtend. Per Tastendruck wird dann in ein Untermenü geschaltet, welches diese Farbe nun pulsieren lässt (Auf- und Abdimmen). Als letzte Option kann vom Hauptmenü noch ein dauerhaft rotierender Farbwechsel angewählt werden.
Jedes Unterprogramm umfasst eine eigene DO...LOOP-Schleife, weil ich das Problem hatte, dass die ausgewählten GOSUB-Unterprozeduren nur einmal durchliefen und dann das gesamte Programm einfach wieder im Menü bei Null anhielt. Selbst der Zähler war gelöscht.
Mit den DO...Loop funktionierte es nun, jedoch ist mir das Programm viel zu groß geworden.
Da ich keine einzelnen Farben als Variablen in die Schleife setzen kann:
Gibt es eine Möglichkeit, das Programm auszudünnen und wenn ja - welche? Ich muss dazu sagen, dass ich nicht so klug und schnell-verstehend bin. Ich muss die Befehle auch verstehen können, und es ist echt schwer, das für mich in Worte zu fassen.
Das Programm ist 4KB groß und passte gerade noch so per BASCOM-Freeware auf den Controller. Nun habe ich die Vollversion gekauft, jedoch habe ich noch weitaus mehr mit dem Programm vor, weshalb es zwingend schlanker werden muss.
Wenn jemand von euch eine gute Idee hat, vielleicht einen Befehl kennt, der mir helfen könnte (Gedankenanstöße mit Erläuterung, wie der Befehl vielleicht korrekt einzusetzen ist), dann her damit.
Bei Fragen, komme ich dann auf die Empfehlungen zurück und hoffe, dass ihr dann wieder für mich da seid.
Hier das Programm:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 60
Config Pinc.0 = Input
Config Pinc.1 = Input
Taster1 Alias Pinc.0
Taster2 Alias Pinc.1
Dim Zaehler As Word ' Zaehler für Rot oder/und Grün
Dim Zaehler2 As Word 'Zaehler, wenn eine Farbe nur teilweise dimmen soll
Dim Zaehler_blau As Word ' Zaehler ausschließlich für Blau, da Blau vorgeteilt werden muss (Zaehler läuft 4mal schneller)
Dim V As Byte ' Zählvariable zum Steuern durch das Farbauswahlmenü
Dim V2 As Byte ' Zählvariable zum Überspringen der Aufdimmung beim Color-Fading (Fading durch alle Farben)
Dim P As Bit ' Zählvariable zum Anwählen der Pulsor-Programme
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64 ' Timer für Rot und Grün
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 1 , Pwm = On , Prescale = 1 'Timer für Blau
Enable Timer0
Start Timer1
Start Timer2
Enable Interrupts 'Ein Überbleibsel, als ich noch einen zusätzlichen Wartetimer nutzte, wird demnächst aber rausgenommen
Pwm1a = 0
Pwm1b = 0
Rot Alias Pwm1a
Gruen Alias Pwm1b
Blau Alias Ocr2
Declare Sub Rot_fading
Declare Sub Orange_fading
Declare Sub Gelb_fading
Declare Sub Gruen_fading
Declare Sub Azur_fading
Declare Sub Blau_fading
Declare Sub Violet_fading
Declare Sub Weiss_fading
Declare Sub Color_fading
'**************************************
' ***** Hauptprogramm Teil I *****
'**************************************
Do
Debounce Taster1 , 0 , Subtaster1 , Sub
Debounce Taster2 , 0 , Subtaster2 , Sub
Loop
End
' ***** Hauptprogramm Teil II *****
Subtaster1:
V = V + 1
If V = 1 Then
Rot = 1023 ' ROT
Elseif V = 2 Then
Rot = 1023 : Gruen = 341 ' ORANGE
Elseif V = 3 Then
Rot = 1023 : Gruen = 1023 ' GELB
Elseif V = 4 Then
Rot = 0 ' GRÜN
Elseif V = 5 Then
Gruen = 1023 : Blau = 1023 ' AZUR
Elseif V = 6 Then
Gruen = 0 ' BLAU
Elseif V = 7 Then
Rot = 1023 ' VIOLET
Elseif V = 8 Then
Gruen = 1023 : Blau = 1023 ' WEISS
Elseif V = 9 Then
Rot = 0 : Gruen = 0 : Blau = 0
Do
Rot = 1023 : Gruen = 1023 : Blau = 1023 ' Das schnelle Aufblinken soll zeigen, dass sich hier ein Farbwechselmodus verbirgt.
Waitms 100 'Da ich erst seit ein paar Tagen die BASCOM-Vollversion habe, musste ich die 4K einhalten. So war es am schlankesten ^^
Rot = 0 : Gruen = 0 : Blau = 0
Waitms 100
If Taster1 = 0 Then Exit Do
If Taster2 = 0 Then Call Color_fading
Loop
Elseif V = 10 Then
Rot = 0 : Gruen = 0 : Blau = 0 : V = 0 ' ALLE LED AUS
End If
Return
Subtaster2:
P = 0
If Taster2 = 0 Then Toggle P 'Ab hier können die Unterprogramme angewählt werden. Sie lassen die gewählte Farbe pulsieren.
If V = 1 And P = 1 Then Call Rot_fading
If V = 2 And P = 1 Then Call Orange_fading
If V = 3 And P = 1 Then Call Gelb_fading
If V = 4 And P = 1 Then Call Gruen_fading
If V = 5 And P = 1 Then Call Azur_fading
If V = 6 And P = 1 Then Call Blau_fading
If V = 7 And P = 1 Then Call Violet_fading
If V = 8 And P = 1 Then Call Weiss_fading
Return
' (**** ACHTUNG **** Die FOR...Next-Schleife kann durch Zwischensetzen einer
' Bedingung direkt zwischen FOR...TO und der Schrittzeit (Waitms) abgebrochen
' werden!!! UNBEDINGT MERKEN!)
' Die 3 Zeilen hierrüber sind ein Merkzettel für mich wo und wie ich die FOR-NEXT zu jedem Zeitpunkt unterbrechen kann. Für mich ein echter Durchbruch!
Sub Rot_fading:
Do
For Zaehler = 1023 To 0 Step -2 '
If Taster1 = 0 Then Exit Sub ' **** ACHTUNG **** (Zählen noch zu der Anmerkung hierüber, sonst keine Bedeutung)
Waitms 10
Rot = Zaehler
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
If Taster1 = 0 Then Exit Sub ' **** ACHTUNG ****
Waitms 10
Rot = Zaehler
Next Zaehler
Wait 1
Loop
End Sub
Sub Orange_fading:
Do
For Zaehler = 1023 To 0 Step -2
Zaehler2 = Zaehler / 3
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Gruen = Zaehler2
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
Zaehler2 = Zaehler / 3
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Gruen = Zaehler2
Next Zaehler
Wait 1
Loop
End Sub
Sub Gelb_fading:
Do
For Zaehler = 1023 To 0 Step -2
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Gruen = Zaehler
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Gruen = Zaehler
Next Zaehler
Wait 1
Loop
End Sub
Sub Gruen_fading:
Do
For Zaehler = 1023 To 0 Step -2
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler
Next Zaehler
Wait 1
Loop
End Sub
Sub Azur_fading:
Do
For Zaehler = 1023 To 0 Step -2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
Loop
End Sub
Sub Blau_fading:
Do
For Zaehler = 1023 To 0 Step -2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Blau = Zaehler_blau
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Blau = Zaehler_blau
Next Zaehler
Wait 1
Loop
End Sub
Sub Violet_fading:
Do
For Zaehler = 1023 To 0 Step -2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
Zaehler_blau = Zaehler / 4
Waitms 10
Rot = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
Loop
End Sub
Sub Weiss_fading:
Do
For Zaehler = 1023 To 0 Step -2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Gruen = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
For Zaehler = 0 To 1023 Step 2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Gruen = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
Loop
End Sub
' ***** Das Farbwechsel-Unterprogramm *****
Sub Color_fading:
Do
'--- Rot ---
Rot = 0 : Gruen = 0 : Blau = 0
For Zaehler = 0 To 1023 Step 2
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler
Next Zaehler
Wait 1
V2 = 2
Gosub Rot_aufgedimmt
Rot_aufgedimmt:
'--- Orange ---
For Zaehler = 0 To 1023 Step 2
Zaehler2 = Zaehler / 3
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler2
Next Zaehler
Wait 1
'--- Gelb ---
For Zaehler = 323 To 1023 Step 2
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler
Next Zaehler
Wait 1
'--- Grün ---
For Zaehler = 1023 To 0 Step -2
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler
Next Zaehler
Wait 1
'--- Weiß ---
For Zaehler = 0 To 1023 Step 2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler : Blau = Zaehler_blau
Next Zaehler
Wait 1
'--- Azur ---
For Zaehler = 1023 To 0 Step -2
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler
Next Zaehler
Wait 1
'--- Blau ---
For Zaehler = 1023 To 0 Step -2
If Taster1 = 0 Then Exit Sub
Waitms 10
Gruen = Zaehler
Next Zaehler
Wait 1
'--- Violet ---
For Zaehler = 0 To 1023 Step 2
If Taster1 = 0 Then Exit Sub
Waitms 10
Rot = Zaehler
Next Zaehler
Wait 1
'--- Übergang violet zu Rot ---
For Zaehler = 1023 To 0 Step -2
Zaehler_blau = Zaehler / 4
If Taster1 = 0 Then Exit Sub
Waitms 10
Blau = Zaehler_blau
Next Zaehler
Wait 1
Gosub Rot_aufgedimmt
Loop
End Sub
Lesezeichen