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