Nochmal an dieser Stelle ....
DMX ist ein Protokoll das in der Bühnentechnik zur Steuerung von Scheinwerfern, Lasern, .... so genau weiß ich nicht was alles .... verwendet wird.
Schnittstellentechnisch ist es eine RS485 mit 250000 Bit/s und 2 StopBits. Übertragen werden immer 512 Byte Nutzdaten, dann ca. 17ms Pause usw. .... also rund 26 solcher Pakete/s. Am Anfang der 512 Byte wird ein, ich nenne es mal seltsamer, Header gesendet. Dieser erzeugt einen Frame-Error, auf den man triggern kann.
Ein DMX-Gerät hat eine einstellbare Start-Adresse im Bereich 1-512 und diese entspricht dem Byte der 512 übertragenen Byte. Im einfachsten Fall kann das Gerät ein Scheinwerfer sein, den man im Bereich seines Bytes 0-255 dimmen kann. Von so einem Scheinwerfer könnte man also viele mit verschiedenen, aber auch gleichen Adressen anschliessen. Ein RGBW-Scheinwerfer würde schon 4 Adressen belegen und aus sicherer Quelle habe ich erfahren, daß es auch Geräte gibt, die 190 Adressen und mehr belegen (Fokus, 2 Achsen schwenken (also auch Motorbewegungen), mehrere Lichtquellen, Dimm-Auflösung 16 oder 24 Bit=2 bzw.3 Byte/Farbe, .....).
[Edit] Ich muß ein paar Korrekturen machen, da ich inzwischen mehr darüber erfahren habe.
Richtig ist, es können bis zu 512 Byte Daten übertragen werden. Mein Testsender (Lichtmischpult) sendet auch nicht die vollen 512 Byte. Das heißt, es folgen auch nicht zwingend 17ms Pause und wie ich gelesen habe, können es somit bis zu 47 Pakete/s gesendet bzw. empfangen werden. Da mein Testsender das leider nicht macht, kann ich keine Aussage treffen, wieviel Zeit dem Controller noch bleibt, andere Dinge (z.B. mit den Daten was sinnvolles anfangen) zu tun.
Das einlesen des Datenpaketes ist einfach:
Var
DMXData : Array[1..512] of Byte; // DMX-Daten
DMXDummy : Byte;
Process ReadDMX($100,$100:iData);
Begin
Repeat
DMXDummy:=SerInpC0;
Until Bit(USARTC0Status,4)=true;
Lock(self);
SerInpBlock(USARTC0,DMXData);
UnLock(self);
End ReadDMX;
Gruss
Harry
DMX ist ein Protokoll das in der Bühnentechnik zur Steuerung von Scheinwerfern, Lasern, .... so genau weiß ich nicht was alles .... verwendet wird.
Schnittstellentechnisch ist es eine RS485 mit 250000 Bit/s und 2 StopBits. Übertragen werden immer 512 Byte Nutzdaten, dann ca. 17ms Pause usw. .... also rund 26 solcher Pakete/s. Am Anfang der 512 Byte wird ein, ich nenne es mal seltsamer, Header gesendet. Dieser erzeugt einen Frame-Error, auf den man triggern kann.
Ein DMX-Gerät hat eine einstellbare Start-Adresse im Bereich 1-512 und diese entspricht dem Byte der 512 übertragenen Byte. Im einfachsten Fall kann das Gerät ein Scheinwerfer sein, den man im Bereich seines Bytes 0-255 dimmen kann. Von so einem Scheinwerfer könnte man also viele mit verschiedenen, aber auch gleichen Adressen anschliessen. Ein RGBW-Scheinwerfer würde schon 4 Adressen belegen und aus sicherer Quelle habe ich erfahren, daß es auch Geräte gibt, die 190 Adressen und mehr belegen (Fokus, 2 Achsen schwenken (also auch Motorbewegungen), mehrere Lichtquellen, Dimm-Auflösung 16 oder 24 Bit=2 bzw.3 Byte/Farbe, .....).
[Edit] Ich muß ein paar Korrekturen machen, da ich inzwischen mehr darüber erfahren habe.
Richtig ist, es können bis zu 512 Byte Daten übertragen werden. Mein Testsender (Lichtmischpult) sendet auch nicht die vollen 512 Byte. Das heißt, es folgen auch nicht zwingend 17ms Pause und wie ich gelesen habe, können es somit bis zu 47 Pakete/s gesendet bzw. empfangen werden. Da mein Testsender das leider nicht macht, kann ich keine Aussage treffen, wieviel Zeit dem Controller noch bleibt, andere Dinge (z.B. mit den Daten was sinnvolles anfangen) zu tun.
Das einlesen des Datenpaketes ist einfach:
Code
Var
DMXData : Array[1..512] of Byte; // DMX-Daten
DMXDummy : Byte;
Process ReadDMX($100,$100:iData);
Begin
Repeat
DMXDummy:=SerInpC0;
Until Bit(USARTC0Status,4)=true;
Lock(self);
SerInpBlock(USARTC0,DMXData);
UnLock(self);
End ReadDMX;
Gruss
Harry