A library for mastering a DMX chain. You'll meed a max485 or equivalent to convert the digital output to the differential RS-485 protocol.

Revision:
0:9f79770fc0a8
Child:
1:7daf1361d960
diff -r 000000000000 -r 9f79770fc0a8 DMXPacket.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DMXPacket.c	Sat Jul 09 19:38:50 2011 +0000
@@ -0,0 +1,81 @@
+#include "mbed.h"
+#include "DMXPacket.h"
+
+void init(DigitalOut* dmx) {
+    /* initialise */
+    *dmx = MARK;
+    return;
+}
+
+void sendBreak(DigitalOut* dmx) {
+    /* BREAK */
+    *dmx = BREAK;
+    wait_us(120 * PW);
+    return;
+}
+
+void sendMarkAfterBreak(DigitalOut* dmx) {
+    /* MARK AFTER BREAK */
+    *dmx = MARK;
+    wait_us(3 * PW);
+    return;
+}
+
+void sendStartCode(DigitalOut* dmx) {
+    /* 1 START 8 DATA */
+    *dmx = BREAK;
+    wait_us(9 * PW);
+    
+    /* 2 STOP */
+    *dmx = MARK;
+    wait_us(2 * PW);
+    return;
+}
+
+void sendChannelData(DigitalOut* dmx, char* channelData) {
+    char i, data = *channelData;
+    /* 1 START */
+    *dmx = BREAK;
+    wait_us(PW);
+    
+    /* 8 DATA */
+    for(i = 0xF0; i; i >>= 1) {
+        *dmx = ((data & i) ? MARK : BREAK);
+        wait_us(PW);
+    }
+    
+    /* 2 STOP */
+    *dmx = MARK;
+    wait_us(2 * PW);
+    return;
+}
+
+void writePacket(DigitalOut* dmx, char* channelData, int channelCount) {
+    int i;
+    
+    /* BREAK */
+    sendBreak(dmx);
+    
+    /* MARK AFTER BREAK */
+    sendMarkAfterBreak(dmx);
+    
+    /* START CODE */
+    sendStartCode(dmx);
+    
+    /* CHANNEL DATA */
+    for(i=0; i<channelCount; i++) {
+    
+        /* MARK TIME BETWEEN FRAMES */
+        *dmx = MARK;
+        wait_us(MTBF * PW);
+        
+        /* CHANNEL DATA */
+        sendChannelData(dmx, channelData + i);
+    }
+    
+    /* MARK TIME BETWEEN PACKETS */
+    /* AND RETURN TO IDLE */
+    *dmx = MARK;
+    wait_us(MTBP * PW);
+    return;
+}
\ No newline at end of file