Hallo Peterfido

und lieben vielen Dank für deine Mühen. Habe deine Mühen erst jetzt gesehen und konnte sie deshalb noch nicht ausprobieren. Es sind auch Befehle dabei, die ich erst einmal genauer unter die Lupe nehmen muss.
Gestern war ich fast den ganzen Tag mit der Funktions-Perfektionierung meines Programms beschäftigt. Es schien gegen 22h dann soweit zu sein - alles lief. Ich muss dazu sagen, dass ich einen Großteil neu schreiben musste, zudem musste ich ALLE Werte invertieren, eben wegen der negativen Kennlinie der LED.
Auf meinem Testboard bedeutet die Ziffer NULL, dass die LED aus ist, bei 1023 leuchtet sie hell auf. Auf dem Testboard hingegen ist es genau umgekehrt: NULL - die LED leuchtet voll, 1023 - die LED ist aus.
Und hier begann das Debakel, denn das Programm lief nur im Modus mit voller Helligkeit - beim Dimmen ging alles schief:

In exakt einem Teilabschnitt, nämlich dem Fading des ORANGE, leuchtete beim Start des Fadings Grün voll auf und dimmte nur ganz leicht herunter, während Rot brav der Anweisung des Programms folgte.
Was also machen?
Ich probierte wirklich sehr viel, schob die Variablen hin und her, invertierte den Zähler und hätte auf diesem Pfad bleiben sollen - doch kam aufgrund neuer, ins Leben zu rufender Hilfsvariablen immer wieder vom Weg ab.

Erst gegen halb 2h morgens hatte ich dann die Lösung und es funktionierte astrein:

Zunächst invertierte ich den Zählwert des Hauptzählers, denn die Farbe Orange wird aus Rot und Grün zusammengesetzt - und grün folgt dabei nur Orange. Grün darf dabei nur ein Drittel so hell leuchten als rot.
Das Programm zählte dabei von 0 (LED_AN) nach 1023 (LED_AUS). In einem ersten Versuch teilte ich diesen Wert sofort durch 3, was jedoch IMMER zu dem selben Produkt führte: 341. Es sollte aber erst von einem bestimmten Wert (z.B. 800) nach oben zählen.
Also invertierte ich den ersten Zählwert. 1023 - 0 = 1023, 1023 - 1023 = 0. Also wurde aus Null 1023 und aus 1023 wurde Null. Diesen Wert teilte ich nun durch 3 und somit konnte dieser nun beim Dimmen jeglichen Wert zwischen Null und 341 annehmen, jedoch fadete Grün nun exakt entgegengesetzt zu Rot: Wenn Rot 1023 erreichte, erreichte Grün Null. Da der Wert nun aber zwischen Null und 341 zählte, ich ihn aber zwischen 682 und 1023 brauchte, musste ich den neuen Wert erneut invertieren: 1023 - neuer Zählwert = Ergebniss für Orange.


Mit ein wenig Hilfe von Jörg, der mich in die richtige Richtung lenkte, konnte ich nun auch die Auf- und Abdimmzeiten entsprechend anpassen, denn beim Dimmen wird der Zählwert verkleinert, wodurch die LED schneller pulsiert, soll sie aber nicht.

Hier der komplette Codesatz:

Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 60
$baud = 9600


' Konfigurieren der Eingänge

Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input


' Umbenennen der Eingängen

Taster1 Alias Pinc.0       '     Farbwauswahl und Cancel aus Pulsing
Taster2 Alias Pinc.1       '     Pulsing-Anwahl
Taster3 Alias Pinc.2       '     Dunkler dimmen
Taster4 Alias Pinc.3       '     Heller dimmen



'Festlegen der Variablen

Dim Farbwahl As Byte
Dim Color As Byte
Dim Zaehler As Word
Dim Zaehler2 As Word
Dim Zaehler3 As Word
Dim Zaehler4 As Word
Dim Zaehler_blau As Word
Dim Schrittpause As Byte
Dim Brightness As Byte
Dim P As Bit
Dim X As Word
Dim X_orange As Word
Dim X_blau As Word
Dim Y As Word
Dim V2 As Byte



'Konfigurieren der Timer zu PWM-Ausgängen

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 1 , Pwm = On , Prescale = 1
Enable Timer0
Start Timer1
Start Timer2
Enable Interrupts

Pwm1a = 0
Pwm1b = 0


'Festlegen der festen Zählvariable Y (Orange und Blau werden als Zählvariable flexibel definiert)

'X_orange = 682      Divisor für Helligkeitswerte = 1,5:  1 = 746, 2 = 871, 3 = 922, 4 = 956, 5 = 978
'X_blau = 768        Divisor für Helligkietswerte = 1,5:  1 = 853, 2 = 910, 3 = 947,  4 = 973, 5 = 989
Y = 1023


'Konfigurieren der Ausgangsvariablen

Rot Alias Pwm1a
Gruen Alias Pwm1b
Blau Alias Ocr2

Declare Sub Fading



'-------------------------------------------------------------------------------
'                       *******************************
'                          ***** Hauptprogramm *****
'                       *******************************
'-------------------------------------------------------------------------------

Do

   Debounce Taster1 , 0 , Subtaster1 , Sub       ' Startet Farbauswahl und Rückkehr in Farbauswahl
   Debounce Taster2 , 0 , Subtaster2 , Sub       ' Startet Fading-Modus
   Debounce Taster3 , 0 , Subtaster3 , Sub       ' Abdimmen der LED VOR dem Fading
   Debounce Taster4 , 0 , Subtaster4 , Sub       ' Aufdimmen der LED VOR dem Fading


'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Hauptprogramm: Farbauswahlmenü

   Select Case Farbwahl
         Case 0 : Rot = Y : Gruen = Y : Blau = Y : Color = 0       '             ALLE LED AUS
         Case 1 : Rot = X : Gruen = Y : Blau = Y : Color = 1       '             ROT
         Case 2 : Rot = X : Gruen = X_orange : Blau = Y : Color = 2       '      ORANGE
         Case 3 : Rot = X : Gruen = X : Blau = Y : Color = 3       '             GELB
         Case 4 : Rot = Y : Gruen = X : Blau = Y : Color = 4       '             GRÜN
         Case 5 : Rot = X : Gruen = X : Blau = X_blau : Color = 5       '        WEISS
         Case 6 : Rot = Y : Gruen = X : Blau = X_blau : Color = 6       '        AZUR
         Case 7 : Rot = Y : Gruen = Y : Blau = X_blau : Color = 7       '        BLAU
         Case 8 : Rot = X : Gruen = Y : Blau = X_blau : Color = 8       '        VIOLET
         Case 9 : Rot = X : Gruen = X : Blau = X_blau : Color = 9       '        COLOR-FADING
                  Waitms 150
                  Rot = Y : Gruen = Y : Blau = Y : Color = 9       ' Das schnelle Blinken soll die Bereitschaft zum Farbwechsel signalisieren (spart Speicherplatz)
                  Waitms 150
   End Select


'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Hauptprogramm: Dimm-Stufen (Variable Brightness wird ins Unterprogramm übergeben)

   Select Case Brightness
         Case 0 : X = 0 : X_orange = 682 : X_blau = 768 : Schrittpause = 6
         Case 1 : X = 341 : X_orange = 746 : X_blau = 853 : Schrittpause = 9
         Case 2 : X = 568 : X_orange = 871 : X_blau = 910 : Schrittpause = 13
         Case 3 : X = 720 : X_orange = 922 : X_blau = 947 : Schrittpause = 20
         Case 4 : X = 821 : X_orange = 956 : X_blau = 973 : Schrittpause = 30
         Case 5 : X = 889 : X_orange = 978 : X_blau = 989 : Schrittpause = 45
   End Select


Loop
End




'-------------------------------------------------------------------------------
'                          ***** Unterprogramme *****
'-------------------------------------------------------------------------------

Subtaster1:       ' #### Farbauswahl ####

   Incr Farbwahl
   If Farbwahl = 10 Then Farbwahl = 0

Return

'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


Subtaster2:       ' #### Aktivieren des Puls-Modus ####

   If Taster2 = 0 Then Toggle P
   If Color > 0 And P = 1 Then Call Fading
   Waitms 100       '   Nach Start des Puls-Modus bleibt Variable "P" auf 1 stehen. Dadurch musste bei einem Abbruch des Pulsing-Mode und neuer Farbauswahl...
   Toggle P       '     ...immer einmal leer der Zähler P auf Null gesetzt werden. Nach dem Aktivieren des Fading wird "P" nun automatisch auf Null gesetzt.

Return

'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


Subtaster3:       ' #### Test-Taster langsamer/dunkler ####

   If Taster3 = 0 Then Brightness = Brightness + 1
   If Brightness = 6 Then Brightness = 5       ' Wenn der Zähler den Wert 6 erreicht hat, wird dieser auf 5 zurück gestellt.

Return

'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


Subtaster4:       ' #### Test-Taster schneller/heller ####

   If Taster4 = 0 Then Brightness = Brightness - 1
   If Brightness = -1 Then Brightness = 0       ' Trotz "Byte-Deklarierung" zählt der Zähler bei Tasten bis -1 und wird anschließend auf Null zurück gesetzt.

Return



'-------------------------------------------------------------------------------
' **** ACHTUNG **** Die FOR...NEXT-Schleife kann durch Zwischensetzen einer
' Bedingung direkt zwischen FOR...TO und der Schrittzeit (Waitms) abgebrochen
' werden!!! UNBEDINGT MERKEN!




Sub Fading:

   If Taster3 = 0 Then Taster3 = 1       ' Setzt Taster3 während des Fadings außer Kraft
   If Taster4 = 0 Then Taster4 = 1       ' Setzt Taster4 während des Fadings außer Kraft


'ROT
   While Color = 1
      For Zaehler = X To Y
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler
      Next Zaehler
      Waitms 10
   Wend


'ORANGE
   While Color = 2
      For Zaehler = X To Y
         Zaehler4 = 1023 - Zaehler       ' Zählwert für Orange wird invertiert
         Zaehler3 = Zaehler4 / 3       ' Invertierter Zählwert wird durch 3 dividiert (Fading nun invertiert zu Rot)
         Zaehler2 = 1023 - Zaehler3       ' Neuer Zählwert wird erneut invertiert,    (Fading nun parallel zu Rot)
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Gruen = Zaehler2
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         Zaehler4 = 1023 - Zaehler
         Zaehler3 = Zaehler4 / 3
         Zaehler2 = 1023 - Zaehler3
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Gruen = Zaehler2
      Next Zaehler
      Waitms 10
   Wend


'GELB
   While Color = 3
      For Zaehler = X To Y
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Gruen = Zaehler
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Gruen = Zaehler
      Next Zaehler
      Waitms 10
   Wend


'GRÜN
   While Color = 4
      For Zaehler = X To Y
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Gruen = Zaehler
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Gruen = Zaehler
      Next Zaehler
      Waitms 10
   Wend


'WEISS
   While Color = 5
      For Zaehler = X To Y
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Gruen = Zaehler : Blau = Zaehler_blau
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms 10
         Rot = Zaehler : Gruen = Zaehler : Blau = Zaehler_blau
      Next Zaehler
      Waitms 10
   Wend


'AZUR
   While Color = 6
      For Zaehler = X To Y
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Gruen = Zaehler : Blau = Zaehler_blau
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Gruen = Zaehler : Blau = Zaehler_blau
      Next Zaehler
   Wend


'BLAU
   While Color = 7
      For Zaehler = X To Y
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Blau = Zaehler_blau
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Blau = Zaehler_blau
      Next Zaehler
   Wend


'VIOLET
   While Color = 8
      For Zaehler = X To Y
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Blau = Zaehler_blau
      Next Zaehler
      Waitms 100
      For Zaehler = Y To X Step -1
         Zaehler_blau = Zaehler / 4
         Waitms Schrittpause
         Rot = Zaehler : Blau = Zaehler_blau
      Next Zaehler
   Wend




'ALL COLOR FADING

' --- Rot ---
   While Color = 9
      Rot = Y : Gruen = Y : Blau = Y
      For Zaehler = Y To X Step -1
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler
      Next Zaehler
      Waitms 1000
      V2 = 2
         Gosub Rot_aufgedimmt       ' Der erste Abschnitt wird nur beim Start angesprungen, anschließend fährt das Programm im Unterprogramm fort

Rot_aufgedimmt:
'--- Orange ---
      For Zaehler = Y To X_orange Step -1
         Zaehler2 = Zaehler
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Gruen = Zaehler2
      Next Zaehler
      Waitms 1000
'--- Gelb ---
      For Zaehler = X_orange To X Step -1
         Zaehler2 = Zaehler
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Gruen = Zaehler2
      Next Zaehler
      Waitms 1000
'--- Grün ---
      For Zaehler = X To Y
         If Taster1 = 0 Then Exit Sub
         Waitms 10
         Rot = Zaehler
      Next Zaehler
      Waitms 1000
'--- Weiß ---
      For Zaehler = Y To X Step -1
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler : Blau = Zaehler_blau
      Next Zaehler
      Waitms 1000
'--- Azur ---
      For Zaehler = X To Y
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler
      Next Zaehler
      Waitms 1000
'--- Blau ---
      For Zaehler = X To Y
         If Taster1 = 0 Then Exit Sub
         Waitms 10
         Gruen = Zaehler
      Next Zaehler
      Waitms 1000
'--- Violet ---
      For Zaehler = Y To X Step -1
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Rot = Zaehler
      Next Zaehler
      Waitms 1000
'--- Übergang violet zu Rot ---
      For Zaehler = X To Y
         Zaehler_blau = Zaehler / 4
         If Taster1 = 0 Then Exit Sub
         Waitms Schrittpause
         Blau = Zaehler_blau
      Next Zaehler
      Waitms 1000
      Gosub Rot_aufgedimmt
   Wend

End Sub
Er ist exakt 4,5KB groß, kann also nur noch mit der Vollversion von Bascom übertragen werden. Dafür ist er bereits für die Hardware-Anwendung, mit den Transistoren BC548 als Lastschalter konfiguriert.

Ob ich es noch ausdünnen werde, weiß ich noch nicht. Es bleibt noch genügend Platz für weitere Farben, welche ich einfach nur zwischenschieben brauche. Alle notwendigen Befehlssätze und Rechnungen sind bereits enthalten.
Ich bin zwar bei Weitem nicht auf dem Level der eingefleischten BASCOM-Nutzer mit jahrzehntelanger Erfahrung, aber trotzdem ein wenig stolz auf das, was ich möglich machen konnte - und bis auf 4 Taster gibt es keinen weiteren Schnickschnack ^^.

Warum ich keine fertige Steuerung für 12€ kaufe? Weil diese keinen Pulsing-Modus für einzelne Farben bietet, dafür eine Menge Blödsinn, den man nie braucht, es sei denn, man will eine Disco betreiben ^^ (Strobe-Modi, Strobe-Modi mit Pause). Zudem kann man den Dauer-Farbwechselmodus bei diesen käuflichen Steuerungen nicht abdimmen, was ich hier möglich machen konnte. Die Fadings sind zwar nur VOR dem Fading dimmbar, aber was gibts schon ohne Handicap ^^

Richtig: Jörg - der doppelte Prescaler hat keine Auswirkungen. Habe ihn noch nicht rausgenommen, schadet aber auch nicht.

Danke euch - und ich schaue mir das Codebeispiel nächste Woche genauer an.


LG - Maik