- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 15

Thema: Programm "ausdünnen"

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    46
    Beiträge
    1.369
    Moin Maik,

    ich freue mich das es bei dir schon Fortschritte gibt.

    Mit "wait Waitms 10" (ohne Leerzeichen: Waitms10) meine ich eine Variable die sich "Waitms10" nennt Sie ist sprechend und wird dann mit 10ms als Wartezeit inizialisiert. Du hast sie jetzt "Schrittpause" genannt, ist auch okay. Denk daran du hattest oben zwei verschiedene Pausenzeiten drin.

    Ein "wait" gefolgt von einfachem "waitms" geht halt nicht, weil es beides Schlüsselwörter in Bascom sind. Deshalb kann man den Wert für wait in eine Variable packen, dann geht's

    Du hast in der Config vom Zähler Blau übrigens den Prescaler doppelt gesetzt - ob's was negatives oder garnichst weiter bewirkt kann ich nicht sagen, dazu bin ich bei dem Prescaler so auf Anhieb nicht sicher genug.

    Ich denke mal das sich die Werte nicht von alleine auf den Basiswert zurückstellen/verändern. Sie müssen natürlich manuell programmtechnisch getauscht werden. Und es ist ja der "Zähler" der dann den neuen Wert aufnimmt, nicht x und y - die bleiben so wie sie sind wenn daran nichts geändert wird.

    Es gibt aber grundsätzlich mehrere Möglichkeiten das zu lösen, also kann es sich auch lohnen an dieser Art Schleife dran zu bleiben muss aber nicht.

    Jetzt fehlt eigentlich nur noch Dein aktuelles Programm

    Weiterhin viel Erfolg und Grüße aus dem Norden
    Jörg

  2. #2
    Hallo Jörg.

    Ach das meintest du... ^^

    Variablen zum Ersetzen der Zeitangabe hatte ich bereits versucht und es funktionierte eben nur außerhalb der For-Schleife. Allerdings war ich mit meinen Experimenten noch nicht vollständig durch. Ich möchte meinen, dass ich versuchte, die Dimmzeit On-The-Fly zu verändern, als während das entsprechende Programm lief, aber das ist ja nicht das, was ich erreichen möchte.
    Denke, dass es ausreicht, wenn ich jeder Dimmphase eine eigene Zeitvariable zuweise - also fest zuweise. Diese wird dann vor dem Dimmprozess bereits aufgerufen. Allerdings kann dann nur während dem Konstant-Leuchtmodus gedimmt werden und nicht während des Pulsmodus, da im Pulsing die Zeit offensichtlich nicht verändert werden kann oder darf, sonst stoppt das Fading an der Stelle (Led bleibt halb leuchtend "stehen").

    Hm - ich muss mir das Programm noch mal anschauen. Wenn der Prescaler dort doppelt gesetzt ist, dann wird einer entfernt. Schädlich sollte es wohl nur sein, wenn dieser 2te einen anderen Wert hat als der erste ^^.

    Eine andere Art Schleife, um das Fading zu realisieren, hatte ich bereits einmal versucht (Ebenfalls eine Zählschleife mit Incr und Decr), jedoch konnte ich hier keine Zeiten ändern. Die zählten also so schnell, dass ich das nicht mal wirklich sehen konnte. Wäre natürlich super, wenn es eine "flexiblere" Variante zum Auf- und Abdimmen geben würde, bei der ich auch die Farben vor dem Aufruf des Unterprogramms tauschen kann, aber solange das nicht geht, bin ich an FOR-NEXT gebunden.

    Werde die Tage mal alles zusammenstellen, was ich habe und brauche. Die Dimmfunktion mit den sazugehörigen Zeiten in das Testprogramm einbinden.
    Später müsste ich noch alles auf den "Anwendungsfall" umschreiben, also alle Variablen ändern. Aus X = 1023 wird dann X = 0, aus Y = 0 wird Y = 1023 - und so auch mit allen Zwischenwerten, sonst leuchten die falschen Farben auf, und das Problem hatte ich beim ersten Versuch mit einer Prototypen-Platine.


    LG - Maik

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo Maik,

    Habe gerade nachgesehen, Bascom kennt Funktionen, diese werden mit Call aufgerufen.
    Aufruf wäre dann z.B.

    Call Fading(Rot, Gruen, Blau)

    Die Fading-Funktion kann dann alle Farben und wird nur einmal benötigt.
    Mit den Werten für die 3 Farben wird festgelegt, welche Farben angesteuert werden müssen.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Hallo Peter.

    Danke erst einmal für deine Antwort. Leider funktioniert der Schritt jedoch nicht, jedenfalls nicht so, wie ich es mir wünschen würde. Sprich: Trotz Einbinden von Call-aufgerufenen Funktionen/Unterprogrammen kann nur die direkt in der FOR-Bedingung mit dem Zaehler in Verbindung gebrachte Farbe auch direkt angesteuert werden. Das siehst du oben in dem Programmablauf. Dort sind bereits die Call(ings) hinterlegt und rufen auch die Unterprozeduren auf.
    Das Ganze hat allerdings auch einen Nachteil: Das Unterprogramm läuft dann nur EINMAL durch und stoppt anschließend. Selbst mit "While" hält das Programm dort an. Es bringt also nicht den gewünschten Effekt und ich müsste dennoch mit separaten DO-LOOP-Schleifen arbeiten, welche jedoch nur bedingt fremde Variablen annehmen.


    LG - Maik

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Code? Edit:

    Durch den gosub aufruf am Ende von Color_fading sollte Dein Stack irgendwann überlaufen:

    Ich habe es auf 22% bekommen. Keine Ahnung, ob es noch läuft

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 80
    $swstack = 64
    $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
       select case V
          case 1
             gosub r1023
    '         Rot = 1023       '                                    ROT
          case 2
             gosub r1023
             gruen=341
    '         Rot = 1023 : Gruen = 341       '                      ORANGE
          case 3
             gosub r1023
             gosub g1023
    '         Rot = 1023 : Gruen = 1023       '                     GELB
          case 4
             Rot = 0       '                                       GRÜN
          case 5
             gosub  G1023
             gosub b1023
    '         Gruen = 1023 : Blau = 1023       '                    AZUR
          case 6
             Gruen = 0       '                                     BLAU
          case 7
             gosub r1023
    
          '         Rot = 1023       '                                    VIOLET
          case 8
             gosub G1023
             gosub b1023
    '         Gruen = 1023 : Blau = 1023       '                    WEISS
          case 9
             gosub allenull
             Do
                gosub r1023
                gosub g1023
                gosub b1023
    '            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 ^^
                gosub allenull
                waitms 100
             If Taster1 = 0 Then Exit Do
             If Taster2 = 0 Then Call Color_fading
             Loop
          case 10
             gosub allenull
             V = 0       '        ALLE LED AUS
       end select
    Return
    
    r1023:
       rot = 1023
    return
    g1023:
       gruen = 1023
    return
    b1023:
       blau = 1023
    return
    
    
    allenull:
       Rot = 0 : Gruen = 0 : Blau = 0
    return
    
    pause:
       waitms 10
    return
    
    pausel:
       waitms 1000
    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 p=1 then
          gosub fadings
       end if
    
    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!
    fadings:
       For Zaehler = 1023 To 0 Step -2       '
          If Taster1 = 0 Then return      ' **** ACHTUNG ****  (Zählen noch zu der Anmerkung hierüber, sonst keine Bedeutung)
          gosub fadecase
       Next Zaehler
       gosub pausel
       For Zaehler = 0 To 1023 Step 2
          If Taster1 = 0 Then return       ' **** ACHTUNG ****
          gosub fadecase
       Next Zaehler
       gosub pausel
    return
    
    fadecase:
       gosub pause
       select case v
          case 1
             gosub rz
          case 2
             gosub rgz
          case 3
             gosub grz
          case 4
             gosub gz
          case 5
             gosub bzbgz
          case 6
             gosub bzb
          case 7
             gosub rz
             gosub bzb
          case 8
             gosub grz
             gosub BZB
       end select
    return
    
    
    ' ***** 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
          gosub pause
          gosub rz
       Next Zaehler
       gosub pausel
       V2 = 2
       'Gosub Rot_aufgedimmt 'wozu?
    
    Rot_aufgedimmt:
    '--- Orange ---
       For Zaehler = 0 To 1023 Step 2
          gosub z2z3
          If Taster1 = 0 Then Exit Sub
          gosub pause
          Gruen = Zaehler2
       Next Zaehler
       gosub pausel
    '--- Gelb ---
       For Zaehler = 323 To 1023 Step 2
          If Taster1 = 0 Then Exit Sub
          gosub pause
          Gruen = Zaehler
       Next Zaehler
       gosub pausel
    '--- Grün ---
       For Zaehler = 1023 To 0 Step -2
          If Taster1 = 0 Then Exit Sub
          gosub pause
          gosub rz
       Next Zaehler
       gosub pausel
    '--- Weiß ---
       For Zaehler = 0 To 1023 Step 2
          gosub zbz4
          If Taster1 = 0 Then Exit Sub
          gosub pause
          gosub rz
          gosub  BZB
       Next Zaehler
       gosub pausel
    '--- Azur ---
       For Zaehler = 1023 To 0 Step -2
          If Taster1 = 0 Then Exit Sub
          gosub pause
          gosub rz
       Next Zaehler
       gosub pausel
    '--- Blau ---
       For Zaehler = 1023 To 0 Step -2
          If Taster1 = 0 Then Exit Sub
          gosub pause
          gosub gz
       Next Zaehler
       gosub pausel
    '--- Violet ---
       For Zaehler = 0 To 1023 Step 2
          If Taster1 = 0 Then Exit Sub
          gosub pause
          gosub rz
       Next Zaehler
       gosub pausel
    '--- Übergang violet zu Rot ---
       For Zaehler = 1023 To 0 Step -2
          gosub zbz4
          If Taster1 = 0 Then Exit Sub
          gosub pause
          gosub bzb
       Next Zaehler
       gosub pausel
       goto Rot_aufgedimmt
    Loop
    End Sub
    
    z2z3:
       Zaehler2 = Zaehler / 3
    return
    
    zbz4:
       Zaehler_blau = Zaehler / 4
    return
    
    grz:
       gosub gz
    rz:
       Rot = Zaehler
    return
    
    bzbgz:
       gosub bzb
    gz:
       Gruen = Zaehler
    return
    
    bzb:
       Blau = Zaehler_blau
    return
    
    rgz:
       gosub  RZ
       Gruen = Zaehler2
    return
    Man kann viel sparen, indem man gleichen Code in Subs auslagert.
    Geändert von peterfido (16.11.2014 um 08:57 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  6. #6
    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

  7. #7
    Hallo Freunde.


    Das Einsetzen von Gosub-Befehlen statt immer wieder dasselbe zu Schreiben, scheint den Code tatsächlich zu verkleinern. Bei dem Restlichen blick ich ehrlich gesagt noch nicht ganz durch (die Farbendeklaration).
    Ob das Programm mit den neuen Ansprungbefehlen für die Schrittpause als auch den Programmabbruch funktioniert, kann ich jedoch erst am Wochenende, frühestens jedoch am Freitag sagen.

    Bei dem ganzen Gedusel ist mir doch tatsächlich noch neben der Dimmfunktion eine Funktion zur Beschleunigung oder Verzögerung ALLER Puls-Modi, also auch inklusive dem Color-Fading, eingefallen. Das Ganze wird wieder über einen Select_Case aufgebaut und verlängert die Wartezeit. Im Select_Case für die Dimmfunktion war ja nun bereits die Schrittpause als Waitms-Zeitvariable eingebaut. Diese habe ich nun in eine kleine Rechenaufgabe umgewandelt, damit das Produkt trotzdem auf dasselbe hinaus läuft.

    Code:
       Select Case Brightness
             Case 0 : X = 1023 : X_orange = 341 : X_blau = 255 : Schrittpause = Wartezeit
             Case 1 : X = 682 : X_orange = 277 : X_blau = 170 : Schrittpause = Wartezeit * 1.5
             Case 2 : X = 455 : X_orange = 152 : X_blau = 113 : Schrittpause = Wartezeit * 2.17
             Case 3 : X = 303 : X_orange = 101 : X_blau = 76 : Schrittpause = Wartezeit * 3.33
             Case 4 : X = 202 : X_orange = 67 : X_blau = 50 : Schrittpause = Wartezeit * 5
             Case 5 : X = 134 : X_orange = 45 : X_blau = 34 : Schrittpause = Wartezeit * 7.5
       End Select
    
    
       Select Case Speed
             Case 0 : Wartezeit = 6
             Case 1 : Wartezeit = 8
             Case 2 : Wartezeit = 10
             Case 3 : Wartezeit = 12
             Case 4 : Wartezeit = 14
             Case 5 : Wartezeit = 16
       End Select

    Im Programmablauf selbst wird dann später nur noch der Schrittpausen-Wert eingetragen.


    LG - Maik

Ähnliche Themen

  1. [ERLEDIGT] Erstes C Programm UART - Warum wird zweimal "Hallo World" gesendet?
    Von dl9hda im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 17.01.2014, 14:56
  2. Frage zum Digital-Simulations-Programm "ATANUA"
    Von Elu im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 3
    Letzter Beitrag: 02.03.2009, 18:13
  3. CMUCAM3 - Programm funktioniert "über Nacht" nicht
    Von heli im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 20.01.2009, 20:58
  4. GP1A030 Drehgeber - Auswertung mit "C-Programm"
    Von Phoenix2k im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 06.06.2008, 15:26
  5. Problem mit "PCDEMO Programm " für ASURO
    Von HiGhDe im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 08.02.2006, 08:08

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress