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







Zitieren

Lesezeichen