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.
Diff: DMXPacket.c
- 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