Forum: Mikrocontroller und Digitale Elektronik Kerzenlicht oder Kaminfeuer in Bascom


von Thomas D. (thomasderbastler)


Angehängte Dateien:

Lesenswert?

Bin gerade dabei eine 30W RGB "Mood-Lampe" zu bauen.

Über einen Tastendruck kann ich jetzt zwischen Fading,Veriable Farbe und 
um weiter Modus gewählt werden. Der jetziger Code ist soweit OK

Nun hätte ich gerne ein paar Tipps wie ich am besten ein weiches 
Flackerlicht, bzw. Kaminfeuer erzeugen kann.
Wäre den im Code Modus 3

Habt Ihr ein konkretes Beispiel ?

von Karl H. (kbuchegg)


Lesenswert?

Na was ist denn 'flackern'. In zufälligen Zeitabständen verändert sich 
die Farbe und Helligkeit mehr oder weniger zufällig.

Wo bleibt denn da der Spass, wenn man nicht selber ein wenig probiert 
:-)
Gerade diese Kür Sachen sind doch das Salz in der Suppe, nachdem die 
langweilige Pflicht erledigt ist. Also tob dich aus.

von Teelicht (Gast)


Lesenswert?

Thomas der Bastler schrieb:
> Nun hätte ich gerne ein paar Tipps wie ich am besten ein weiches
> Flackerlicht, bzw. Kaminfeuer erzeugen kann.


Ich kann zwar nicht mit Bascom dienen aber in PIC Assembler habe ich es 
wie folgt gelöst:

Den "weichen" Effekt erziele ich durch eine PWM Ansteuerung, deren 
Dutycyclewert über eine Schleife "langsam" verstellt wird.

Eine Kerze ist ja längere Zeit hell und beginnt dann zu flackern, also 
mehr oder weniger Schnell dunkler zu werden, ohne aber dabei ganz 
auszugehen. Sie soll auch nicht permanent flackern sondern dazwischen 
länger Hellphasen haben.

Hierzu wird in der Schleife eine Zufallszahl für die Einschaltdauer 
gezogen und eine Pause von 1ms abgewartet. Falls die Zufallszahl über 
95% liegt wird eine zusätzliche 100ms Pause eingefügt.

Ist die Zufallszahl kleiner, dann wird dieser neue Sollwert für die 
Helligkeit durch die Schleife in kleinen Schritten angefahren. Ist er 
erreicht, wird eine neue Zufallszahl für den nächsten Helligkeitswert 
gezogen.
Damit die "Kerze" beim Flackern nicht ganz ausgeht habe ich die 
Zufallswerte nach unten hin auf ca, 30% begrenzt.

Durch die zusätzliche längere Pause bei hohen Zufallszahlen entstehen 
die Hellphasen und durch die kurzen Pausen bei niedrigeren Werten das 
kerzentypische Flackern.

von Thomas D. (thomasderbastler)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Also tob dich aus.

Habe zwar schon herum probiert, aber sieht eher aus wie in einer 
Technoschuppen....

Teelicht: ja der Ansatz hört sich mal gut an, mal sehen..)))
Welche Farben spielen hier eine wichtige Rolle, und vorallem welche 
Werte, damit es realistisch aussieht ?

von Teelicht (Gast)


Lesenswert?

Thomas der Bastler schrieb:
> Welche Farben spielen hier eine wichtige Rolle, und vorallem welche
> Werte, damit es realistisch aussieht ?

z.B. für ein Fensterbild habe ich eine 1W Berstein LED benutzt und ihr 
einen kerzenflammenförmigen Lampenschirm verpasst. Dazu habe ich dünne 
weiße Schaumstoffolie mit Tesafilm zu einem Kegel zusammengeklebt und 
dann die LED von untern hineinstrahlen lassen. Das Ganze mit einem 
Kabelbinder unter der LED zusammengeschnürt ergibt die Form einer 
Kerzenflamme.

Die Zeiten damit es realistisch aussieht habe ich ja schon genannt.
Die Mainloop, die die Helligkeit moduliert läuft mit etwa 1kHz und falls 
die Helligkeit über dem Grenzwert von 95% liegt wird sie mit einer 
zusätzlichen Wartezeit von 100ms beaufschlagt. D.h. die Änderung des 
Dutycycles erfolgt mit 1% pro Millisekunde.


Aber wie kbuchegg bereits erwähnt hat, musst du mit den Werten einfach 
rumprobieren bis es dir gefällt.

Die billigen LED Teelichter die man kaufen kann erzeugen den 
Flackereffekt oft durch simple zufallszahlengesteuerte Puls Pausen 
Ansteuerung. Oder durch abgelegte Tabellenwerte, die in der Loop 
abgespielt werden. Das "Weiche" fehlt dann aber und es sieht wie du 
festgestellt hast eher wie ein Dicoblitzer aus.

von Thomas D. (thomasderbastler)


Lesenswert?

Ja....aber ich habe eine RGB LED...deshalb die Frage wegen Farben...
mit einer Farbe ist es wesentlich einfacher...

von Thomas D. (thomasderbastler)


Lesenswert?

Ich kann 3 Zufallszahlen nehmen

also irgendwie so :

DIM I-Rot as World
DIM I-Gruen as Word
DIM I-Blau as World

I-Rot=RND(255)
I-Gruen=RND(200)
I-Blau=RND (100)

If Modus=3 then
 If I-Rot< 200 then  ' sollte nicht zu dunkel sein...
  I-Rot=240
 End If
 Rot=I-Rot
 Gruen=I-Grün
 Blau=I-Blau

End If

RND ( Max Wert) und als PWM Wert nehmen. Es ist ader noch meilenweit 
davon entfernt was ich mir vorstelle...Ein Kaminfeuer zieht irgendwie 
ganz anders aus..

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:

> I-Rot=RND(255)
> I-Gruen=RND(200)
> I-Blau=RND (100)

Nur mal so als Gedankengang.
Es wird in vielen Fällen nicht sinnvoll sein, den vollen Umfang an 
Zufallszahlen zu benutzen. Das Flackern einer Kerze geht nun mal nicht 
von Helligkeit 0 bis Helligkeit 255, sondern sie wird in einem gewissen 
Helligkeitsbereich flackern. Ich nehm jetzt einfach mal an von 75% 
Helligkeit bis 100% Helligkeit. D.h. du brauchst auch Zufallszahlen, die 
sich in diesem Bereich abspielen.
Deine am meisten gebrauchte Formel wird  so aussehen

    irgendwas = Minimum + RND( Maximum - Minimum )

um also zb Zufallszahlen zu erhalten, die sich im Bereich 75% von 255 
bis 100% von 255 bewegen, nimmst du dann

   75% * 255 = 191
  100% * 255 = 255


   Helligkeit = 191 + RND(64)

und kriegst damit Zufallszahlen, die dann nur mehr in diesem Bereich von 
191 bis 255 dir eine neue Helligkeit geben. Die so simulierte Kerze kann 
dann eben nicht mehr alle Helligkeiten von komplett aus, knapp vorm 
verlöschen bis strahlend Hell haben, sondern nimmt nur mehr Werte an, 
die eben hell und ab und zu etwas weniger hell ausmachen.

Und genau da musst du eben ein wenig experimentieren.
Genauso mit den Farben. Lass halt erst mal alles auf einem schönen 
warmen Braun/Orangeton.
Mittels Zufallszahlen bestimmst du dir die Helligkeit und die rechnest 
du in RGB um, indem du

   rot   = Grundfarbe_Rot * Helligkeit / 255
   gruen = Grundfarbe_Grün * Helligkeit / 255
   blau  = Grundfarbe_Blau * Helligkeit / 255

rechnest. Das du keine vernünftigen Werte kriegst, wenn du dir einfach 
für Rot, Grün und Blau Zufallszahlen bestimmen lässt, ist ja wohl klar. 
Das hat dann tatsächlich mehr von einer Disco als von einer Kerze.

Genau dasselbe mit den Zeiten. Kerzen flackern nicht beliebig schnell. 
Also wirst du dir eben mit Zufallszahlen nicht Wartezeiten von 0 bis 
(hausnummer) 8 Sekunden erzeugen, sondern eben nur von (hausnummer) 2 
Sekunden bis 8 Sekunden und vielleicht ab und zu mal einen schnellen, 
intensiveren Flackerer einstreuen.

von Thomas D. (thomasderbastler)


Lesenswert?

Karl-Heinz..super danke..

Diese Möglichkeit hatte ich schon vergessen...

Helligkeit = 191 + RND(64)

jetzt geht es in die Eingemachte..LoL

von Karl H. (kbuchegg)


Lesenswert?

Wenn du es noch weicher im Übergang machen willst, dann darf sich eben 
die Helligkeit nicht schlagartig von zb 248 auf 196 ändern.

Ist die Helligkeit auf 248 und hast du errechnet, dass die nächste 
Helligkeitsstufe 196 sein muss, dann wird die eben nicht sofort auf 196 
gesetzt, sondern man kann bei jedem Schleifendurchlauf zb einen Soll/Ist 
Vergleich machen und den Istwert langsamer nachführen
1
do
2
3
  if IstWert > Sollwert
4
    Istwert = Istwert - 1
5
 
6
  if Istwert < Sollwert
7
    Istwert = Istwert + 1
8
9
10
  ... berechne neue RGB Werte aus dem Istwert
11
12
loop


wie überhaupt das ganze Zeitmanagement mittels Wait Mist ist. Aber das 
sag ich hier in diesem Forum nicht zu ersten mal. Zeitsteuerungen 
bedeuten praktisch immer einen Timer samt ISR und eventuell noch 
zusätzliche Variablen die rauf oder runter zählen um so aus dem 
regelmässigen 'Ticken' der ISR eine kontrolliert längere Zeitdauer zu 
machen.

Die Möglichkeiten sind endlos. Erlaubt ist was dir gefällt und was dich 
deinem Ziel näherbringt. Und ja. Manchmal denkt man sich dann eben 
Formeln aus, von denen man annimmt dass sie gut aussehen oder die man 
sich aus der Beobachtung der Realität zusammengereimt hat.

von Wusel D. (stefanfrings_de)


Lesenswert?

Wir brauchen drei Faktoren:

- Nächste Farbe
- Nächste Helligkeit
- Zeitdauer in der der Wechsel stattfinden soll

Diese drei Zufallszahlen werden erzeugt. Danach muss der Wechsel 
durchgeführt werden (in einer Unter-Schleife) und erst danach werden 
drei neue Zufallszahlen erzeugt. So in etwa stelle ich mir das 
jedenfalls vor.

von Karl H. (kbuchegg)


Lesenswert?

Um mal ein anderes Beispiel zu bringen.
Ich hatte mir mal ein Paneel gebaut mit 64 (weißen) LED, die einzeln in 
der Helligkeit einstellbar waren.

Einen kompletten Leuchtzyklus einer LED hab ich unterteilt in eine 
Hell-Phase und eine Dunkel-Phase. Für jede Phase wurde bestimmt
* wie lange soll sie dauern (Zufallszahl mit Minimum und Variation)
* Helligkeit der LED (ebenfalls Zufallszahl mit Minimum und Variation)
Jede LED durchläuft (natürlich gleichzeitig, Timer-interrupt gesteuert) 
ihren Lichtzyklus und wenn der vorbei ist, dann werden neue WErte für 
den nächsten Zyklus für diese LED bestimmt.


mit Dunkelzeiten von ein paar Sekunden und 0 Helligkeit (Minimum = 0 und 
Variation = 0) und kurzen Hellzeiten (0.5 Sekunden, Variation = 0) und 
100% Helligkeit (Minimum = 100, Variation = 0) hat das ausgesehen wie 
ein Bild aus dem Olympiastadion, wenn die Hobbyfotografen auf den 
Tribünen fotografieren wenn Ursain Bolt zum Weltrekord ansetzt. Ein 
Blitzlicht-Gewitter

Mit kurzen Dunkelphasen (minimum = 1, Variation = 0.5) und 80% 
Helligkeit (minimum = 70, Variation = 20) und etwas längeren Hellphasen 
(2, Var=1) mit mehr Helligkeit (90, Variation=10) sieht das ganze dann 
wieder mehr aus wie ein sternklarer Himmel in einer dunklen, kalten 
Winternacht.

Mit wieder anderen Werten lassen sich ganz andere Effekte erzielen. D.h. 
ich hab mir einen Formalismus ausgedacht, den ich allein mit den 
einzusetzenden Werten für jede LED parametrieren kann um verschiedene 
Ergebnisse zu erhalten.

von Thomas D. (thomasderbastler)


Lesenswert?

smile..nun ein bisschen langsam....LoL

Muss mal Step by Step probieren...

von Thomas D. (thomasderbastler)


Angehängte Dateien:

Lesenswert?

Nun bin ich schon etwas weitergekommen, soweit alles OK.

Nun meine Frage wäre folgendes:

Mit einem Poti ( eins von den 3 ) möchte ich für die 
Helligkeitssteuerung verwenden. Also mit einem Poti die gesamte 
Helligkeit in allen Modus.

Wie mache ich am besten, ohne , daß ich hunderte If - Then Abfragen 
einbaue ?
Die Helligkeit sollte also "im laufenden Betrieb" verändertwerden 
können.

Anbei mein Code

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:

> Mit einem Poti ( eins von den 3 ) möchte ich für die
> Helligkeitssteuerung verwenden. Also mit einem Poti die gesamte
> Helligkeit in allen Modus.
>
> Wie mache ich am besten, ohne , daß ich hunderte If - Then Abfragen
> einbaue ?


So wie das auch ein Mischpult macht.
Dein 'Masterregler' ist nichts anderes als ein einstellbarer Faktor von 
0 bis 1 mit dem alle Werte ganz zum Schluss multipliziert werden.

Jetzt rächt es sich natürlich, dass du keine zentrale Stelle hast, an 
der die in allen Modi bestimmten RGB Werte in die Timer Register 
verteilt werden, sondern die Zuweisungen überall direkt gemacht hast.

von Ralf G. (ralg)


Lesenswert?

Thomas der Bastler schrieb:
> Die Helligkeit sollte also "im laufenden Betrieb" verändertwerden
> können.

Entsprechend des Wertes vom ADC einfach mit einem Faktor multiplizieren.
Ich hab' mir deinen Code nicht so genau angesehen, deshalb nur mal ein 
Beispiel:
"Einstellungen":
PWM von 0..255 möglich, 8-Bit-ADC
"Berechnung":
PWM_Wert = (PWM_Wert + 1) * (ADC_Wert + 1) / 256 - 1
oder
PWM_Wert = PWM_Wert * ADC_Wert / 255

(Die Variante mit "/256" gefällt mir besser. Ergibt möglicherweise trotz 
der Additionen kürzeren Code, weil in Wirklichkeit keine Division 
ausgeführt werden muss. - Falls der Basic-Compiler das erkennt.)

von Thomas D. (thomasderbastler)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Jetzt rächt es sich natürlich, dass du keine zentrale Stelle hast, an
> der die in allen Modi bestimmten RGB Werte in die Timer Register
> verteilt werden, sondern die Zuweisungen überall direkt gemacht hast.

Genau das habe ich festgestellt...

von Ralf G. (ralg)


Lesenswert?

Ralf G. schrieb:
> "Berechnung":

fehlt noch: Wertebereiche beachten!

von Karl H. (kbuchegg)


Lesenswert?

PS Zum Beispiel zu deinen MOdus Abfragen
1
  if Modus = 1 then
2
    ...
3
  endif
4
5
  if Modus = 2 then
6
    ...
7
  endif
8
9
  ....


if - then - else
ist schon erfunden. Auch in Bascom. Wenn Modus gleich 1 ist, dann muss 
man nicht mehr abfragen, ob es gleich 2 ist. Modus kann nicht 2 sein, 
oder 3, oder 4 - eben weil es 1 ist und das feststeht, wenn die Abfrage 
in den zugehörigen then Zweig genommen wird.
1
  if Modus = 1 then
2
     ....
3
4
  elseif Modus = 2 then
5
     ....
6
7
  elseif Modus = 3 then
8
     ....
9
10
  ...
11
  endif

und sieh dir in BASCOM auch mal die Anweisung LOOKUP an. Du kannst 
diesen ganzen Teil hier
1
If Modus = 4 Then
2
   Rot = 255
3
   Gruen = 0
4
   Blau = 0
5
End If
6
7
If Modus = 5 Then
8
   Rot = 0
9
   Gruen = 255
10
   Blau = 0
11
End If
12
13
If Modus = 6 Then
14
   Rot = 0
15
   Gruen = 0
16
   Blau = 255
17
End If
18
19
If Modus = 7 Then
20
   Rot = 0
21
   Gruen = 255
22
   Blau = 255
23
End If
24
25
If Modus = 8 Then
26
   Rot = 255
27
   Gruen = 0
28
   Blau = 255
29
End If
30
31
If Modus = 9 Then
32
   Rot = 0
33
   Gruen = 255
34
   Blau = 255
35
End If
mit Lookup in 4 oder 5 Zeilen Code eindampfen. Selbiges hier in der 
Modus INkrementierung innerhalb der Sub die für die Tastenauswertung und 
Modus-Weiterschaltung zuständig ist.

Übersichtlichen Programmcode zu haben ist nicht einfach nur reiner 
Luxus. Das hat auch was mit Codequalität und Fehlerhäufigkeit zu tun. 
Code der sich seitenweise dahinzieht ist nicht nur unübersichtlich 
sondern auch fehleranfällig - weil man nichts mehr sieht.

von Thomas D. (thomasderbastler)


Lesenswert?

Ralf G. schrieb:
> PWM_Wert = PWM_Wert * ADC_Wert / 255

Multiplikation und Division geht nicht in einer Zeile..

von Thomas D. (thomasderbastler)


Lesenswert?

Ups wieder haufen Futter...muss nacher schauen, super Danke .

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:
> Ralf G. schrieb:
>> PWM_Wert = PWM_Wert * ADC_Wert / 255
>
> Multiplikation und Division geht nicht in einer Zeile..

Dann trenn es halt auf in 2 Zeilen.
Die wenigsten hier programmieren in BASCOM sondern in einer 
Programmiersprache in der man auch kompliziertere arithmetische 
Ausdrücke in einem Aufwasch schreiben kann.
Du darfst hier präsentierten Code nicht 100% buchstabengetreu wörtlich 
nehmen, sondern mehr als Anregungen. Dein BASCOM und wie man dann die 
Anregung ganz konkret buchstabengetreu in BASCOM umsetzt, das musst du 
schon selber kennen und können.

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:
> Karl Heinz Buchegger schrieb:
>> Jetzt rächt es sich natürlich, dass du keine zentrale Stelle hast, an
>> der die in allen Modi bestimmten RGB Werte in die Timer Register
>> verteilt werden, sondern die Zuweisungen überall direkt gemacht hast.
>
> Genau das habe ich festgestellt...

Du wirst jetzt aber hoffentlich draus lernen und NICHT überall im ganzen 
Programm die Multiplikation mit dem Masterfader nachtragen.

Sondern:
Du machst dir eine Sub SetRGB, der du die neuen Werte für Rot, Grün und 
Blau übergibst und tauscht erst mal in deinem Programm alle direkten 
Zuweisungen an Rot, Gruen und Blau gegen Aufrufe dieser Sub aus mit den 
jeweilgen Werten.

Zum Beispiel
1
...
2
3
Declare Sub SetRGB( red as byte, green as byte, blue as byte )
4
5
6
7
....
8
9
   If Rgb = 0 Then
10
      Incr Rot_0
11
      Decr Blau_0
12
      Call SetRGB( Rot_0, Gruen_0, Blau_0 )
13
      Waitms Color_delay
14
15
   ElseIf Rgb = 1 Then
16
      Decr Rot_0
17
      Incr Gruen_0
18
      Call SetRGB( Rot_0, Gruen_0, Blau_0 )
19
      Waitms Color_delay
20
21
   ElseIf Rgb = 2 Then
22
      Decr Gruen_0
23
      Incr Blau_0
24
      Call SetRGB( Rot_0, Gruen_0, Blau_0 )
25
      Waitms Color_delay
26
27
   End If
28
....
29
30
31
32
Sub SetRGB( red as byte, green as byte, blue as byte )
33
  Rot = red
34
  Gruen = green
35
  Blau = blue
36
End Sub
37
38
...
Dann testest du, ob sich nichts verändert hat und du dir keine Fehler 
eingehandelt hast.

Und dann baust du deinen Masterfader in dieser Sub mit dazu. An ÉINER 
Stelle!


Wenn man schon ändern muss, dann macht man es gleich richtig. Es ist 
nicht schlimm, wenn man drauf kommt, dass man eine etwas andere Struktur 
im Programm brauchen würde. Schlimm ist es allerdings, wenn man auf 
diese Erkenntnis nicht reagiert und so weiterwurschtelt wie bisher.


Und im benutzen Beispiel sieht man dann auch sofort wieder, dass sich 
hier gleich die nächste Möglichkeit eröffnet, den Code zu straffen. In 
allen 3 Abfragen lauten die letzten beiden Zeilen gleich. Die können 
also auch heruasgezogen werden, weil sie sowieso immer, egal welche 
Bedingung zutrifft, ausgeführt werden
1
....
2
  If Rgb = 0 Then
3
      Incr Rot_0
4
      Decr Blau_0
5
6
   ElseIf Rgb = 1 Then
7
      Decr Rot_0
8
      Incr Gruen_0
9
10
   ElseIf Rgb = 2 Then
11
      Decr Gruen_0
12
      Incr Blau_0
13
14
   End If
15
16
   Call SetRGB( Rot_0, Gruen_0, Blau_0 )
17
   Waitms Color_delay
18
...
und so führt dann eben eines zum anderen. Nur machen muss man es! 
Programmieren ist nicht nur Codezeilen schreiben, sondern auch sich mal 
kritisch zurücklehnen und sich fragen: Wie kann ich den Code verbessern, 
wartbarer machen, straffen? Aber dazu muss man eben seine 
Programmiersprache kennen, damit man weiß welche Möglichkeiten man 
überhaupt hat. Codeblöcke kopieren und ein paar Zahlenwerte austauschen 
hat nichts mit "Programmiersprache kennen" zu tun.

von Thomas D. (thomasderbastler)


Lesenswert?

Ups...langsam Jungs..muss noch verdauen...

Das erste Problemchen mit lookup Tabelle. Compiler meckert.
------------------------------
If Modus = 4 Then
   Rot = Lookup(0 , Farben)                                 'sollte 255 
sein
   Gruen = Lookup(1 , Farben)                               'sollte 0 
sein
   Blau = Lookup(2 , Farben)                                'sollte auch 
0 sein
End If

----------------------------

Farben:

Data 0 , 0 , 0
Data 255 , 0 , 0
Data 0 , 255 , 0
Data 0 , 0 , 255
Data 255 , 0 , 255
Data 0 , 255 , 255
Data 255 , 255 , 0
Data 255 , 255 , 200

von MWS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Programmieren ist nicht nur Codezeilen schreiben, sondern auch sich mal
> kritisch zurücklehnen und sich fragen: Wie kann ich den Code verbessern,
> wartbarer machen, straffen?

Vor dem Programmieren kommt das Nachdenken über den geeignetsten 
Algorithmus, sonst ist das alles verschwendete Arbeit.

Hier würde man sich eine Funktion bauen, der man Farbton, Sättigung und 
Helligkeit übergibt. Daraus errechnet diese RGB-Werte und setzt die PWM 
entsprechend, evtl. noch unter Berücksichtigung der Empfindlichkeit des 
Auges für die einzelnen Farben und deren Helligkeit.

Die bedienergerechte Einstellung des Farbtons nach HSL ist damit kein 
Problem mehr, 3 Drehregler und fertig. Genauso problemlos sind Fadings 
im Farbkreis, als auch Simulationen wie Flamme oder Feuer, die dann aus 
zufällig variierenden Rot- und Gelb-Tönen erzeugt werden und man sich 
dann keinen Kopf mehr darüber zerbrechen muss, wie viel Grün muss zum 
Rot, damit's das passende Gelb wird.

von feuerteufel (Gast)


Lesenswert?

http://www.truma.com/de/de/umfrage/umfrage-kaminfeuer.php
da sind zyklen auf einer sd karte abgelegt, die sich wiederholen. wenn 
der zyklus länger als 30 sekunden ist, merkt das kein schwein.

von Thomas D. (thomasderbastler)


Lesenswert?

Fehler gefunden mit Lookup.

So geht es nicht.

Rot Alias Compare1a


So geht es

If Modus = 4 Then
   Rot_led = Lookup(0 , Farben)
   Rot = Rot_led
   Gruen = 0
   Blau = 0
End If


Farben:

Data 0 , 0 , 0
Data 255 , 0 , 0
Data 0 , 255 , 0
Data 0 , 0 , 255
Data 255 , 0 , 255
Data 0 , 255 , 255
Data 255 , 255 , 0
Data 255 , 255 , 200

von Thomas D. (thomasderbastler)


Lesenswert?

In meinem Fall würde aber eine Farbenzeile auch reichen..oder ?

Dim Rot_led As Integer
Dim Gruen_led As Integer
Dim Blau_led As Integer

If Modus = 4 Then
   Rot_led = Lookup(0 , Farben)
   Rot = Rot_led
   Gruen_led = Lookup(1 , Farben)
   Gruen = Gruen_led
   Blau_led = Lookup(1 , Farben)
   Blau = Blau_led

End If

Farben:
Data 255 , 0

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:
> Ups...langsam Jungs..muss noch verdauen...
>
> Das erste Problemchen mit lookup Tabelle. Compiler meckert.

Denn Rest muss ich erst noch lesen.
Aber dazu gleich soviel:

Gewöhn dir den Scheiss ab. 'Compiler meckert' ist keine sinnvolle 
Aussage, mit der man was anfangen kann.
Dein Compiler schreibt nicht hin "Ich meckere", sondern der schreibt 
eine Fehlermeldung hin. UNd das tut er nicht ohne Grund, sondern in der 
Fehlermeldung ist (zumindest sollte es) ablesbar, was nach Meinung des 
COmpilers anhand der Sprachregeln ein Problem darstellt.
Ich gebe zu, dass manchmal Fehlermeldungen mehrdeutig sind und in die 
falsche Richtung deuten (sprich: das Problem ist eigentlich ganz 
anders), aber in den meisten Fällen ist die Fehlermeldung ein deutlicher 
Fingerzeig darauf, was das Problem ist.

Daher: Fehlermeldungen lesen und kommunizieren.
Mit 'Compiler meckert' hat niemand was angefangen.


Anruf bei der Hotline: Sie ich hab da so eine Fehlermeldung auf den 
Schirm gekriegt. Was kann das sein?
Mitarbeiter: Was steht denn in der Fehlermeldung?
Anrufer: Ja, gelesen hab ich die nicht!

von Thomas D. (thomasderbastler)


Lesenswert?

Fehler habe ich selber gefunden und bereits behoben.

Trotzdem Danke.

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:
> In meinem Fall würde aber eine Farbenzeile auch reichen..oder ?

Keine gute Idee.

Warum willst du dir da schon wieder Abhängigkeiten einhandeln?
IN einem halben Jahr kommt deine Frau und sagt: Alles schön und gut, 
aber das Rot im Modus 4, könnte man das ein bischen mehr ins Blaue 
verschieben?

In deiner ersten Programmversion gehst du her und änderst folgerichtig
1
data 255, 0, 0
ab zu
1
data 255, 0, 10

und alles ist gut.

In deinem jetzigen Vorschlag musst du dich nach einem halben Jahr wieder 
daran erinnern, dass es da eine Abhängigkeit gab, weil du 'damals' 
wusstest, dass grün und blau im Modus 4 denselben Wert (nämlich 0) haben 
und das du das ausgenutzt hast (obwohl ja eigentlich grün und blau ganz 
verschiedene Dinge sind).

von Karl H. (kbuchegg)


Lesenswert?

Ausserdem:

Wenn ich mir deine MOdi so ansehe, dann bietet es sich an, für den Teil 
'Auslesen aus Tabelle und Setzen der RGB WErte' gleich mal wieder eine 
Sub zu machen, die genau das tut: Eine bestimmte 'Farbe' aus der Tabelle 
auslesen und die Farbe als RGB-Wert zu setzen.

Deine Modusverzweigung sieht dann zb so aus
1
If Modus = 4 Then
2
  Call SetTableColor( 0 )
3
4
ElseIf Modus = 5 Then
5
  Call SetTableColor( 3 )
6
7
ElseIf Modus = 6 Then
8
  Call SetTableColor( 6 )
9
10
ElseIf Modus = 7 Then
11
  Call SetTableColor( 9 )
12
13
ElseIf Modus = 8 Then
14
  Call SetTableColor( 12 )
15
16
ElseIf Modus = 9 Then
17
  Call SetTableColor( 15 )
18
19
End If

mitsamt der Sub
1
Sub SetTableColor( AnfangWerte as Byte )
2
  Rot_led = Lookup(AnfangWerte + 0, Farben)
3
  Gruen_led = Lookup(AnfangWerte + 1 , Farben)
4
  Blau_led = Lookup(ANfangWerte + 2 , Farben)
5
6
  SetRGB( Rot_led, Gruen_led, Blau_led )
7
End Sub
(wenn die Addition von 0, 1 bzw. 2 wieder Probleme macht, dann musst du 
das eben vorziehen)

Aber:
WEnn du dir die Modus Abfrage jetzt mal genauer ansiehst, dann gibt es 
da einen mathematischen Zusammenhang zwischen der Modusnummer und dem 
Startwert der Farbe in den Daten!
1
   Modus    Begin der Farbe
2
     4           0
3
     5           3
4
     6           6
5
     7           9
6
     8          12
7
     9          15
Die Moduswerte steigen um jeweils 1, die 'Farbwerte' steigen um jeweils 
3.

Zieh mal vom Moduswert 4 ab. Aus 5 wird dann zb 1. Und multiplizier das 
mit 3 (weil immer 3 Werte eine Farbe beschreiben). Was kriegst du? Den 
jeweiligen Wert aus der 'Farbspalte'.

Der Begin der Farbbeschreibung ist immer bei
  (Modus - 4) * 3

Also kann man die ganze Modusaufteilung in die Farben so eindampfen
1
If Modus >= 3 AND Modus <= 9 Then
2
  FarbNr = Modus - 4
3
  FarbNr = FarbNr * 3
4
  Call SetTableColor( FarbNr )
5
End If

Fertig. Das behandelt die Modi 4 bis 9 korrekt (jetzt mal abgesehen von 
den BASCOM Syntaxfehlern, die ich gemacht haben könnte) in 5 Zeilen Code 
und einer zusätzlichen Sub. In dieser Sub setzt du dann auch nicht die 
RGB Werte direkt in den Register Rot, Gruen und Blau sondern du benutzt 
dazu wieder die bereits vorher eingeführte Sub SetRGB. Warum machst du 
das? WEil diese Sub dann auch noch den Masterfader mit in die Werte 
einrechnet! Und das willst du ja haben, dass das passiert. Oder ist es 
für dich einsichtig, warum ich bei manchen Modi die Helligkeit insgesamt 
einstellen kann, bei diesen fixen Modi aber nicht? Eben, seh ich auch 
nicht ein. Zumal es ja programmtechnisch überhaupt kein Problem ist.

von Thomas D. (thomasderbastler)


Lesenswert?

Karl Heinz Buchegger schrieb:

Hallole..ein bisschen verstehe ich, aber nicht ganz im Details..


> Call SetTableColor( 0 )
 Was ist hier die "(0)"

ich muss die eine Variante erst umsetzten, verstehen, probieren, danach 
erweitern, bzw. optimieren..

von Karl H. (kbuchegg)


Lesenswert?

Thomas der Bastler schrieb:
> Karl Heinz Buchegger schrieb:
>
> Hallole..ein bisschen verstehe ich, aber nicht ganz im Details..
>
>
>> Call SetTableColor( 0 )
>  Was ist hier die "(0)"

Schau dir die Sub an!
1
Sub SetTableColor( AnfangWerte as Byte )
2
  Rot_led = Lookup(AnfangWerte + 0, Farben)
3
  Gruen_led = Lookup(AnfangWerte + 1 , Farben)
4
  Blau_led = Lookup(ANfangWerte + 2 , Farben)
5
6
  SetRGB( Rot_led, Gruen_led, Blau_led )
7
End Sub

Diese 0 vom Aufruf steht innerhalb der Sub dann in der 'VAriablen' 
AnfangWert. D.h. innerhalb der Sub hat AnfangWerte den Wert 0, weil der 
Aufruf mittel
1
   call SetTableColor( 0 )
gemacht wurde.

Würde der Aufruf mit
1
   call SetTableColor( 3 )
gemacht werden, dann hätte innerhalb der Sub eben die Variable 
AnfangWerte für diese eine Ausführung der Sub den Wert 3. usw. usw.

Hier ist der Zusammenhang
1
   Sub SetTableColor( AnfangWerte as Byte )
2
                      ***********
1 Argument, welches der Aufrufer angeben muss und egal welchen Wert er 
angibt, hier drinn landet er. Und wenn er 99 beim Aufruf angibt, dann 
hat eben AnfangWert bei diesem Aufruf der Sub dann den Wert 99


Was wird innerhalb der Sub damit gemacht?
Na es wird hier benutzt
1
  Rot_led = Lookup(AnfangWerte, Farben)
2
                   ***********
Der AUfruf
1
  call SetTableColor( 0 )
führt also dazu, dass ein
1
   lookup( 0, Farben )
gemacht wird. Weil ja die 0 vom Aufrufer in AnfangWerte landet und 
dieses wiederrum in lookup eingesetzt dann eben die 0 beim lookup 
ergibt.
Und der nächste ist dann
1
  Gruen_led = Lookup(AnfangWerte + 1 , Farben)
für grün. Wenn AnfangWerte den Wert 0 hat, und noch 1 dazu gezählt wird, 
dann wird da daher ein
1
   Lookup( 1, Farben )
gemacht.

UNd genau dasselbe folgerichtig bei einem anderen Wert. Ein
1
   call SetTableColor( 3 )
würde also zu einem Lookup für Rot von
1
   Lookup( 3, Farben )
für Rot führen, und gleich der nächste danach zu einem
1
   Lookup( 4, Farben )
für Grün (weil ja 3 + 1 die 4 ergibt. Und
1
   Lookup( 5, Farben )
für Blau.

Lookup 3, 4, 5   das sind aber genau die Lookup Werte, die du im Modus 5 
brauchtest.
Passt also alles zusammen. Man muss nur ein bischen rechnen und die 
Zusammenhänge sehen. Und was bitte, kann ein Computer schon besser, als 
rechnen :-)

von Thomas D. (thomasderbastler)


Lesenswert?

Hmm...irgenwie stehe auf dem Schlauch...((((

ein wahnsinns gezappele und hin und her Springerei im Cod...

von Karl H. (kbuchegg)


Lesenswert?

Tja, dann kann ich dir auch nicht helfen.
Subroutinen zu machen, denen man die tatsächlichen Werte übergibt mit 
denen sie rechnen sollen, sind absolute Grundlagen.

Kopier weiter deinen Code durch die Gegend und tausch Zahlenwerte aus. 
Passt schon.
Aber nenn das bitte nicht programmieren.

: Wiederhergestellt durch User
von spess53 (Gast)


Lesenswert?

Hi

>UNd genau dasselbe folgerichtig bei einem anderen Wert. Ein
>   call SetTableColor( 3 )
>würde also zu einem Lookup für Rot von
>   Lookup( 3, Farben )
>für Rot führen, und gleich der nächste danach zu einem
>   Lookup( 4, Farben )
>für Grün (weil ja 3 + 1 die 4 ergibt. Und
>   Lookup( 5, Farben )
>für Blau.

Da wäre aber
1
Sub SetTableColor( AnfangWerte as Byte )
2
  Rot_led = Lookup(AnfangWerte*3 + 0, Farben)
3
  Gruen_led = Lookup(AnfangWerte*3 + 1 , Farben)
4
  Blau_led = Lookup(ANfangWerte*3 + 2 , Farben)

und ein Aufruf mit

   call SetTableColor( 1 )

sinvoller.

MfG Spess

von Thomas D. (thomasderbastler)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Subroutinen zu machen, denen man die tatsächlichen Werte übergibt mit
> denen sie rechnen sollen, sind absolute Grundlagen.

Das habe ich schon kapiert..

Karl Heinz Buchegger schrieb:
> Kopier weiter deinen Code durch die Gegend und tausch Zahlenwerte aus.

Stimmt nicht aber was solls...bin ja gewohnt...LoL

von Karl H. (kbuchegg)


Lesenswert?

> ein wahnsinns gezappele und hin und her Springerei im Cod...

Und?
Wen interessierts?

Jede Sub hat eine genau definierte Funktionalität.

Ich muss beim Aufruf von

   call SetRGB( Red, Green, Blue )

nicht exakt wissen, wie die Funktion das konkret macht.

Ich muss beim Aufruf von

  Call SetTableColor( 3 )

nicht exakt wissen, wie die Funktion das macht. Ok, man könnte die 
Farben auch einfach durchnummerieren und die Funktion macht selber die 
notwendige Multiplikation mit 3, aber ich dachte eigentlich so wäre das 
für dich verständlicher. Wie man sich irren kann. Aber: Hindert dich ja 
niemand das so zu ändern, dass SetTableColor eine Farbnummer bekommt, 
daraus ausrechnet, wo diese Farbe in seiner Tabelle anfängt und sich 
dann die zu dieser Farbe gehörenden RGB Werte holt.
1
...
2
If Modus >= 3 AND Modus <= 9 Then
3
  FarbNr = Modus - 4
4
  Call SetTableColor( FarbNr )
5
End If
6
7
8
....
9
10
Sub SetTableColor( FarbNr as Byte )
11
12
  FarbNr = FarbNr * 3
13
14
  Rot_led = FarbNr
15
  Rot_led = Lookup(Rot_led, Farben)
16
17
  Gruen_led = FarbNr + 1
18
  Gruen_led = Lookup(Gruen_led, Farben)
19
20
  Blau_led = FarbNr + 2
21
  Blau_led = Lookup(Blau_led, Farben)
22
23
  SetRGB( Rot_led, Gruen_led, Blau_led )
24
End Sub
25
26
Farben:
27
Data 0 , 0 , 0
28
Data 255 , 0 , 0
29
Data 0 , 255 , 0
30
Data 0 , 0 , 255
31
Data 255 , 0 , 255
32
Data 0 , 255 , 255
33
Data 255 , 255 , 0
34
Data 255 , 255 , 200

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:

> sinvoller.

Ja, das war eine Fehleinschätzung.
Ich dachte, so rum würde er es leichter verstehen, wenn ich die 
UMrechnung nicht in 2 Teile auseinanderreisse.

von Thomas D. (thomasderbastler)


Lesenswert?

Alle Programme die ich bisher geschrieben habe, sind mit Sicherheit 
suboptimal, aber ich verstehe es.

Versuche aber auf jedenfall die neue Sachen umzusetzten.
Für mich immer die Frage, wenn das Ding das tut was er soll, und es ist 
auch jedenfall für mich ein privates Produkt, wiviel Aufwand ich 
reinstecke, damit das Ergebinis "sichtbar" gleich ist.

Ganz klar mein aller erster Code war wesentlich schlimmer wie die 
heutige.

Habe programmieren in keinster Weiser gelernt, habe ich mir alles selber 
durch mehr oder weniger Probirerei beigebracht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.