Forum: Mikrocontroller und Digitale Elektronik Hauptdimmer verrechnen


von Arnold (Gast)


Lesenswert?

Hallo, ich habe mich an eine ganz einfach Aufgabe gemacht. Drei LED's 
werden über eine PWM gedimmt, die Werte kommen von einem sog. DMX-Bus. 
Jetzt will ich einen weiteren Kanal als als Hauptdimmer hinzufügen.
Wie gehe ich am besten und effektivsten vor?
Meine Idee war, die Hauptdimmerwerte mit den Einzelkanlwerten zu 
Multiplizieren. Allerdings muss ich dann ja auch eine Division 
durchführen und ich weiß nicht, wie effektiv bzw. sinnvoll meine Idee 
ist.
Gedacht habe ich es mir so:

Byte 1 -> Maindimmer
Byte 2-4 ->Einzeldimmer

Wenn jetzt der Maindimmer auf Wert 128 steht und die Einzeldimmer auf 
255, dann ist die Gesamthelligkeit ja trotzdem nur 128.

Also würde meine Rechnung so aussehen:

Byte1 / 255 = x
Byte 2neu = x * Byte2
Byte 3neu = x * Byte3
Byte 4neu = x * Byte4

Ist das sinnvoll?  Division in Assembler ist ja meistens nicht so schön.

Gibt es andere Wege, dass ganze zu lösen?

von Karl H. (kbuchegg)


Lesenswert?

Arnold schrieb:
>
> Byte1 / 255 = x
> Byte 2neu = x * Byte2
> Byte 3neu = x * Byte3
> Byte 4neu = x * Byte4
>
> Ist das sinnvoll?  Division in Assembler ist ja meistens nicht so schön.

Division in Assembler ist ein Klacks, wenn du durch eine 2-er Potenz 
dividieren musst. Denn dann ist das einfach nur recht schieben. Bei 
einer Division durch 256 ist es noch einfacher. Das Low-Byte wird 
einfach weggelassen und das High-Byte zum neuen Low-Byte erklärt.
1
 Byte1 = Kanalwert * EinzelDimmer * GesamtDimer / 256 / 256;
musst du eben eine 24 Bit Multiplikation machen.
Dividieren willst du so spät wie möglich. Mathematisch gesehen also die 
Division so weit nach rechts schieben, wies geht. Daher ist es nicht 
besonders sinnvoll, wenn du dir den Wert GesammtDimmer/256 im Voraus 
berechnest. Allenfalls könnte man noch EinzelDimmer*GesamtDimmer/256 als 
Verstärkungsfaktor berechnen, mit dem dann der Kanalwert multipliziert 
wird um danach nochmal durch 256 zu dividieren. Mathematisch also
1
Byte1 = (Einzel * Gesamt) / 256 * Kanalwert / 256
Dann braucht man nur 16 Bit Multiplikationen

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.