Difference between revisions of "U23 2005/Firmware-Makros"

From C4 Wiki
Jump to: navigation, search
(MACRO_SLEEP: Zeitgefühl)
 
(16 intermediate revisions by 4 users not shown)
Line 5: Line 5:
 
'''Argumente:''' (keine)  
 
'''Argumente:''' (keine)  
  
'''Funktion:''' Lässt die CPU idlen und spart dadurch Strom.
+
'''Funktion:''' Bricht die Ausführung des Scripts im aktuellen Zyklus ab.
  
 
== MACRO_FADE_CHANNEL ==
 
== MACRO_FADE_CHANNEL ==
  
'''Argumente:''' Channel TargetBrightness Delay AddBrightness
+
'''Argumente:''' Channel TargetBrightness LowByte HighByte
  
 
: Channel: Gibt den Farbkanal an. Mögliche Werte sind ChannelR (Rot), ChannelG (Grün) und ChannelB (Blau).
 
: Channel: Gibt den Farbkanal an. Mögliche Werte sind ChannelR (Rot), ChannelG (Grün) und ChannelB (Blau).
 
: TargetBrightness: Gibt die Helligkeit des Kanals an. Wertebereich 0 (aus) bis 255 (volle Helligkeit).
 
: TargetBrightness: Gibt die Helligkeit des Kanals an. Wertebereich 0 (aus) bis 255 (volle Helligkeit).
: Delay: Füge pro Timertakt diesen Wert (1 bis 255) zu einem Verzögerungszähler hinzu.  Sollte 255 überschritten werden, wird der Wert in AddBrightness zur aktuellen Helligkeit des Kanals addiert0 schaltet das Delay aus.
+
: HighByte, LowByte: Fixkommazahl (Achtung: Im Macro wird erst LowByte, dann HighByte angegeben), die zur aktuellen Helligkeit dazuaddiert wird. Von der Größe der Zahl hängt die Geschwindigkeit des Fadens abLowByte wird zwischengespeichert und erzeugt bei erreichen von 256 einen Überlauf, der 1 auf die aktuelle Helligkeit addiert.
: AddBrightness: Füge pro Timertakt diesen Wert (0 bis 255) zur aktuellen Helligkeit hinzu.
 
  
'''Funktion:''' Fadet einen gegebenen Farbkanal mit einer gegebenen Geschwindigkeit auf eine gegebene Helligkeit.  Die Werte sind immer positiv, es wird aber automatisch erkannt, ob addiert oder subtrahiert werden muss, um die TargetBrightness zu erreichen.
+
'''Funktion:''' Fadet einen gegebenen Farbkanal mit einer gegebenen Geschwindigkeit auf eine gegebene Helligkeit.  Die Werte sind immer positiv, es wird aber automatisch erkannt, ob addiert oder subtrahiert werden muss, um die TargetBrightness zu erreichen. Danach wird direkt mit der nächsten Instruktion weitergemacht. 
  
Beispiel:
+
''LowByte'' und ''HighByte'' nimmt man am besten als zusammenhängende Kommazahl an, wobei sowohl vor als auch nach dem Komma Werte zwischen 0 und 255 angenommen werden können.  Diese Zahl stellt das Verhältnis v 'Helligkeitsstufen' pro 'PWM-Zyklus' dar.  Für das Verhältnis v ergibt sich folgende Zusammenhänge:
 +
* v < 1 » nur LowByte ist gesetzt
 +
* v = 1 » HighByte ist genau 1; jede 1/120 Sekunde wird die Helligkeit um 1 verändert
 +
* 1 < v < 2 » Sowohl HighByte als auch LowByte sind gesetzt, wobei HighByte = 1 ist
 +
* v > 2 » Es ist unwahrscheinlich, dass LowByte noch verwendet wird
 +
 
 +
Das Verhältnis 0,5 in Macroschreibweise wäre 0,128 (H,L).  Das kleinste darstellbare Verhältnis ist somit 1/256=0,0039 Helligkeitsstufen pro PWM-Zyklus (also alle 256:120=2,13 Sekunden wird um eine Helligkeitsstufe verändert).  Das größte Verhältnis beträgt 256 Helligkeitsstufen pro PWM-Zyklus (also um die komplette darstellbare Helligkeit innerhalb eines PWM-Zyklus verändern).
 +
 
 +
'''Beispiele:'''
  
 
  MACRO_FADE_CHANNEL ChannelR, 120, 0, 1
 
  MACRO_FADE_CHANNEL ChannelR, 120, 0, 1
  
Die roten LEDs werden pro 1/120 Sekunde (Timertakt) um eine Helligkeitsstufe erhöht.  Bei Helligkeitsstufe 120 ist das Makro beendet.  Dieses ist nach genau einer Sekunde der Fall.
+
Die Helligkeit der roten LEDs wird pro PWM-Zyklus um eine Stufe erhöht (weil HighByte=1, LowByte=0 == 1,0).  Bei Helligkeitsstufe 120 ist das Faden beendet.  Dies ist nach genau einer Sekunde der Fall, wenn der Rotkanal vorher die Helligkeit 0 hatte.
  
 +
MACRO_SET_CHANNEL  ChannelG, 0
 
  MACRO_FADE_CHANNEL ChannelG, 160, 0, 4
 
  MACRO_FADE_CHANNEL ChannelG, 160, 0, 4
  
Die grünen LEDs werden pro Timertakt um vier Helligkeitsstufen erhöht.  Bei Helligkeitsstufe 160 ist das Makro beendet.  Das ist der Fall nach 160÷4=40 Takten, also 40×1/120=1/3 Sekunde der Fall.
+
Die Helligkeit der grünen LEDs wird pro PWM-Zyklus um vier Stufen erhöht.  Bei Helligkeitsstufe 160 ist das Faden beendet.  Bei diesem Verhältnis von 4 werden 160:4=40 PWM-Zyklen benötigt, also 40×1/120=1/3 Sekunden.
  
  MACRO_FADE_CHANNEL ChannelB, 16, 8, 4
+
MACRO_SET_CHANNEL  ChannelB, 0
 +
  MACRO_FADE_CHANNEL ChannelB, 32, 4, 0
  
Die blauen LEDs werden pro überlaufendem Delay um vier Helligkeitsstufen erhöht.  Bei Helligkeitsstufe 16 ist das Makro beendet.  Das ist der Fall nach 16÷4=4 Schritten, jedoch mit einer Verzögerung von 255÷8=32 Takten pro Schritt, also 4×32=128 Takten.  Das wären 128×1/120=1.066 Sekunden.
 
  
'''Tipp:''' Linksschieben von AddBrightness lässt die TargetBrightness doppelt so schnell erreichen ­&ndash; Rechtsschieben verlangsamt die Geschwindigkeit um die Hälfte.
+
Ein Überlauf findet immer statt, wenn das LowByte 256 erreicht wird.  Das Verhältnis lautet 4 Helligkeitsstufen pro 256 PWM-Zyklen = 0,016.  Um die Endhelligkeit zu erreichen werden somit 32:[4:256]=2048 PWM-Zyklen benötigt. Dies dauert genau 2048*1/120=17,1 Sekunden.
 +
 
 +
 
 +
Jetzt mal anders herum: Der grüne Kanal soll von Helligkeitsstufe 180 auf Helligkeitsstufe 40 innerhalb von 10 Sekunden gefadet werden.  Das wären 140 Helligkeitsstufen; 10 Sekunden entsprechen 10×120=1200 PWM-Zyklen.  Das Verhältnis Helligkeitsstufen pro PWM-Zyklus ergibt 140:1200=0,11.  In der Macro-Notation sind das [0],[0,11*256]=[0],[29,9]==0,30 (H,L).
 +
 
 +
MACRO_SET_CHANNEL  ChannelG, 180
 +
MACRO_FADE_CHANNEL ChannelG, 40, 30, 0
 +
 
 +
Noch ein Beispiel anders rum: Der rote Kanal soll von 20 auf 240 innerhalb von 1,5 Sekunden gefadet werden.  Das sind 220 Helligkeitsstufen und 1,5 Sekunden entsprechen 180 PWM-Zyklen.  Das Verhältnis Helligkeitsstufen pro PWM-Zyklus ergibt 220:180=1,22. Ergibt also in etwa [1],[0,22*256]=[1],[56,3]=1,56 (H,L) in der Macro-Notation.
 +
 
 +
MACRO_SET_CHANNEL  ChannelR, 20
 +
MACRO_FADE_CHANNEL ChannelR, 240, 56, 1
 +
 
 +
Zugegeben, das letzte Beispiel ist ein wenig hart, da wir einen der wenigen Fälle haben, wo wir sowohl High- als auch LowByte setzen.  Von daher, noch ein Beispiel:
 +
 
 +
Der blaue Kanal soll von 0 auf 192 innerhalb von 400ms (0,4s) gefadet werden.  Das sind 192 Helligkeitsstufen bei 0,4s==48 PWM-Zyklen, also 4,0 Helligkeitsstufen pro PWM-Zyklus.
 +
 
 +
MACRO_SET_CHANNEL  ChannelB, 0
 +
MACRO_FADE_CHANNEL ChannelB, 192, 0, 4
 +
 
 +
'''Tipp:''' Linksshiften von Highbyte,LowByte verdoppelt, Rechtsshiften halbiert die Fade-Geschwindigkeit.
  
 
== MACRO_FADE_CHANNELS ==
 
== MACRO_FADE_CHANNELS ==
Line 48: Line 76:
 
: RelativeInstructionCount: Anzahl der Instruktionen.
 
: RelativeInstructionCount: Anzahl der Instruktionen.
  
'''Funktion:''' Springt um eine gewisse Anzahl an Instruktionen zurück. Zu beachten: Die JUMP-Instruktion muss auch übersprungen werden! Beispiel:
+
'''Funktion:''' Springt um eine gewisse Anzahl an Instruktionen zurück. Zu beachten: Die JUMP-Instruktion muss auch übersprungen werden!
 +
 
 +
'''Beispiel:'''
 
  1: MACRO_NOP
 
  1: MACRO_NOP
 
  2: MACRO_JUMP -2  ; springt zu Zeile 1
 
  2: MACRO_JUMP -2  ; springt zu Zeile 1
Line 59: Line 89:
 
: TargetBrightness: Die Helligkeit (0-255).
 
: TargetBrightness: Die Helligkeit (0-255).
  
'''Funktion:''' Setzt den angegebenen Channel auf die angegebene Helligkeit.
+
'''Funktion:''' Setzt den angegebenen Channel auf die angegebene Helligkeit und macht direkt mit der nächsten Instruktion weiter.
 +
 
 +
'''Beispiel:'''
 +
MACRO_SET_CHANNEL ChannelR, 5
  
 
== MACRO_SLEEP ==
 
== MACRO_SLEEP ==
Line 69: Line 102:
 
'''Funktion:''' Wartet die angegebene Zeit.
 
'''Funktion:''' Wartet die angegebene Zeit.
  
Kleines Rechenbeispiel zum Zeitgefühl: Die maximal mögliche Verzögerung beträgt 65535 (Takt) × 1/120 (Sekunde/Takt) = 546.125 (Sekunden) == 9 Minuten und 6 Sekunden.
+
Kleines Rechen'''beispiel''' zum Zeitgefühl: Die maximal mögliche Verzögerung beträgt 65535 (PWM-Zyklen) × 1/120 (Sekunde/PWM-Zyklus) = 546.125 (Sekunden) == 9 Minuten und 6 Sekunden.
  
 
== MACRO_WAIT ==
 
== MACRO_WAIT ==
Line 81: Line 114:
  
 
'''Funktion:''' Wartet, bis ein Kanal die gewünschte Helligkeit erreicht hat.
 
'''Funktion:''' Wartet, bis ein Kanal die gewünschte Helligkeit erreicht hat.
 +
 +
'''Beispiel:'''
 
  1: MACRO_FADE_CHANNEL ChannelR, 255, 35, 0
 
  1: MACRO_FADE_CHANNEL ChannelR, 255, 35, 0
 
  2: MACRO_WAIT (1<<ChannelR)
 
  2: MACRO_WAIT (1<<ChannelR)
 +
 +
 +
Man kann auch auf mehrere Kanäle warten.
 +
 +
'''Beispiel:'''
 +
1: MACRO_WAIT (1<<ChannelR)|(1<<ChannelG)|(1<<ChannelB)
 +
''--[[User:RaffiX|raffiX]]''
  
 
== MACRO_CLEAR ==
 
== MACRO_CLEAR ==
Line 93: Line 135:
 
''-- manuke & Diozaka''
 
''-- manuke & Diozaka''
  
[[Category:U23]]
+
[[Category:U23 2005]]

Latest revision as of 17:22, 2 October 2007

Die Datei script_macros.inc enthält einige Makros mit denen sehr schnell statische Skripts für die Firmware erstellt werden können.

MACRO_NOP

Argumente: (keine)

Funktion: Bricht die Ausführung des Scripts im aktuellen Zyklus ab.

MACRO_FADE_CHANNEL

Argumente: Channel TargetBrightness LowByte HighByte

Channel: Gibt den Farbkanal an. Mögliche Werte sind ChannelR (Rot), ChannelG (Grün) und ChannelB (Blau).
TargetBrightness: Gibt die Helligkeit des Kanals an. Wertebereich 0 (aus) bis 255 (volle Helligkeit).
HighByte, LowByte: Fixkommazahl (Achtung: Im Macro wird erst LowByte, dann HighByte angegeben), die zur aktuellen Helligkeit dazuaddiert wird. Von der Größe der Zahl hängt die Geschwindigkeit des Fadens ab. LowByte wird zwischengespeichert und erzeugt bei erreichen von 256 einen Überlauf, der 1 auf die aktuelle Helligkeit addiert.

Funktion: Fadet einen gegebenen Farbkanal mit einer gegebenen Geschwindigkeit auf eine gegebene Helligkeit. Die Werte sind immer positiv, es wird aber automatisch erkannt, ob addiert oder subtrahiert werden muss, um die TargetBrightness zu erreichen. Danach wird direkt mit der nächsten Instruktion weitergemacht.

LowByte und HighByte nimmt man am besten als zusammenhängende Kommazahl an, wobei sowohl vor als auch nach dem Komma Werte zwischen 0 und 255 angenommen werden können. Diese Zahl stellt das Verhältnis v 'Helligkeitsstufen' pro 'PWM-Zyklus' dar. Für das Verhältnis v ergibt sich folgende Zusammenhänge:

  • v < 1 » nur LowByte ist gesetzt
  • v = 1 » HighByte ist genau 1; jede 1/120 Sekunde wird die Helligkeit um 1 verändert
  • 1 < v < 2 » Sowohl HighByte als auch LowByte sind gesetzt, wobei HighByte = 1 ist
  • v > 2 » Es ist unwahrscheinlich, dass LowByte noch verwendet wird

Das Verhältnis 0,5 in Macroschreibweise wäre 0,128 (H,L). Das kleinste darstellbare Verhältnis ist somit 1/256=0,0039 Helligkeitsstufen pro PWM-Zyklus (also alle 256:120=2,13 Sekunden wird um eine Helligkeitsstufe verändert). Das größte Verhältnis beträgt 256 Helligkeitsstufen pro PWM-Zyklus (also um die komplette darstellbare Helligkeit innerhalb eines PWM-Zyklus verändern).

Beispiele:

MACRO_FADE_CHANNEL ChannelR, 120, 0, 1

Die Helligkeit der roten LEDs wird pro PWM-Zyklus um eine Stufe erhöht (weil HighByte=1, LowByte=0 == 1,0). Bei Helligkeitsstufe 120 ist das Faden beendet. Dies ist nach genau einer Sekunde der Fall, wenn der Rotkanal vorher die Helligkeit 0 hatte.

MACRO_SET_CHANNEL  ChannelG, 0
MACRO_FADE_CHANNEL ChannelG, 160, 0, 4

Die Helligkeit der grünen LEDs wird pro PWM-Zyklus um vier Stufen erhöht. Bei Helligkeitsstufe 160 ist das Faden beendet. Bei diesem Verhältnis von 4 werden 160:4=40 PWM-Zyklen benötigt, also 40×1/120=1/3 Sekunden.

MACRO_SET_CHANNEL  ChannelB, 0
MACRO_FADE_CHANNEL ChannelB, 32, 4, 0


Ein Überlauf findet immer statt, wenn das LowByte 256 erreicht wird. Das Verhältnis lautet 4 Helligkeitsstufen pro 256 PWM-Zyklen = 0,016. Um die Endhelligkeit zu erreichen werden somit 32:[4:256]=2048 PWM-Zyklen benötigt. Dies dauert genau 2048*1/120=17,1 Sekunden.


Jetzt mal anders herum: Der grüne Kanal soll von Helligkeitsstufe 180 auf Helligkeitsstufe 40 innerhalb von 10 Sekunden gefadet werden. Das wären 140 Helligkeitsstufen; 10 Sekunden entsprechen 10×120=1200 PWM-Zyklen. Das Verhältnis Helligkeitsstufen pro PWM-Zyklus ergibt 140:1200=0,11. In der Macro-Notation sind das [0],[0,11*256]=[0],[29,9]==0,30 (H,L).

MACRO_SET_CHANNEL  ChannelG, 180
MACRO_FADE_CHANNEL ChannelG, 40, 30, 0

Noch ein Beispiel anders rum: Der rote Kanal soll von 20 auf 240 innerhalb von 1,5 Sekunden gefadet werden. Das sind 220 Helligkeitsstufen und 1,5 Sekunden entsprechen 180 PWM-Zyklen. Das Verhältnis Helligkeitsstufen pro PWM-Zyklus ergibt 220:180=1,22. Ergibt also in etwa [1],[0,22*256]=[1],[56,3]=1,56 (H,L) in der Macro-Notation.

MACRO_SET_CHANNEL  ChannelR, 20
MACRO_FADE_CHANNEL ChannelR, 240, 56, 1

Zugegeben, das letzte Beispiel ist ein wenig hart, da wir einen der wenigen Fälle haben, wo wir sowohl High- als auch LowByte setzen. Von daher, noch ein Beispiel:

Der blaue Kanal soll von 0 auf 192 innerhalb von 400ms (0,4s) gefadet werden. Das sind 192 Helligkeitsstufen bei 0,4s==48 PWM-Zyklen, also 4,0 Helligkeitsstufen pro PWM-Zyklus.

MACRO_SET_CHANNEL  ChannelB, 0
MACRO_FADE_CHANNEL ChannelB, 192, 0, 4

Tipp: Linksshiften von Highbyte,LowByte verdoppelt, Rechtsshiften halbiert die Fade-Geschwindigkeit.

MACRO_FADE_CHANNELS

Argumente: BrightnessR BrightnessG BrightnessB

Brightness{R,G,B}: Die Helligkeit des {roten, grünen, blauen} Channels (0-255).

Funktion: Fadet alle Farbkanäle auf die jeweils angegebenen Helligkeitswerte. Die Geschwindigkeit wird dabei von einer vorherigen MACRO_FADE_CHANNEL-Routine übernommen.

MACRO_JUMP

Argumente: RelativeInstructionCount

RelativeInstructionCount: Anzahl der Instruktionen.

Funktion: Springt um eine gewisse Anzahl an Instruktionen zurück. Zu beachten: Die JUMP-Instruktion muss auch übersprungen werden!

Beispiel:

1: MACRO_NOP
2: MACRO_JUMP -2  ; springt zu Zeile 1

MACRO_SET_CHANNEL

Argumente: Channel TargetBrightness

Channel: Gibt den Farbkanal an. Mögliche Werte sind ChannelR (Rot), ChannelG (Grün) und ChannelB (Blau).
TargetBrightness: Die Helligkeit (0-255).

Funktion: Setzt den angegebenen Channel auf die angegebene Helligkeit und macht direkt mit der nächsten Instruktion weiter.

Beispiel:

MACRO_SET_CHANNEL ChannelR, 5

MACRO_SLEEP

Argumente: Delay

Delay: Verzögerung in 1/120 sec als 16bit-Zahl (also max. 65535).

Funktion: Wartet die angegebene Zeit.

Kleines Rechenbeispiel zum Zeitgefühl: Die maximal mögliche Verzögerung beträgt 65535 (PWM-Zyklen) × 1/120 (Sekunde/PWM-Zyklus) = 546.125 (Sekunden) == 9 Minuten und 6 Sekunden.

MACRO_WAIT

Argumente: Bitmask

Bitmask: Bitmaske des Kanals.
Rot: (1<<ChannelR)
Grün: (1<<ChannelG)
Blau: (1<<ChannelB)

Funktion: Wartet, bis ein Kanal die gewünschte Helligkeit erreicht hat.

Beispiel:

1: MACRO_FADE_CHANNEL ChannelR, 255, 35, 0
2: MACRO_WAIT (1<<ChannelR)


Man kann auch auf mehrere Kanäle warten.

Beispiel:

1: MACRO_WAIT (1<<ChannelR)|(1<<ChannelG)|(1<<ChannelB)

--raffiX

MACRO_CLEAR

Argumente: (keine)

Funktion: Setzt alle Kanäle auf Helligkeit 0 zurück.


-- manuke & Diozaka