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.
DMXPacket.c
- Committer:
- User_4574
- Date:
- 2011-07-09
- Revision:
- 0:9f79770fc0a8
- Child:
- 1:7daf1361d960
File content as of revision 0:9f79770fc0a8:
#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; }