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.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DMXPacket.c Source File

DMXPacket.c

00001 /* DMX Packet Library
00002  * Nathan Lasseter (User_4574) 2011
00003  * Released unlicenced
00004  * http://www.dmx512-online.com/packt.html
00005  */
00006 
00007 #include "mbed.h"
00008 #include "DMXPacket.h"
00009 
00010 void init(DigitalOut* dmx) {
00011     /* initialise */
00012     *dmx = MARK;
00013     return;
00014 }
00015 
00016 void sendBreak(DigitalOut* dmx) {
00017     /* BREAK */
00018     *dmx = BREAK;
00019     wait_us(120 * PW);
00020     return;
00021 }
00022 
00023 void sendMarkAfterBreak(DigitalOut* dmx) {
00024     /* MARK AFTER BREAK */
00025     *dmx = MARK;
00026     wait_us(3 * PW);
00027     return;
00028 }
00029 
00030 void sendStartCode(DigitalOut* dmx) {
00031     /* 1 START 8 DATA */
00032     *dmx = BREAK;
00033     wait_us(9 * PW);
00034     
00035     /* 2 STOP */
00036     *dmx = MARK;
00037     wait_us(2 * PW);
00038     return;
00039 }
00040 
00041 void sendChannelData(DigitalOut* dmx, char* channelData) {
00042     char i, data = *channelData;
00043     /* 1 START */
00044     *dmx = BREAK;
00045     wait_us(PW);
00046     
00047     /* 8 DATA */
00048     for(i = 0xF0; i; i >>= 1) {
00049         *dmx = ((data & i) ? MARK : BREAK);
00050         wait_us(PW);
00051     }
00052     
00053     /* 2 STOP */
00054     *dmx = MARK;
00055     wait_us(2 * PW);
00056     return;
00057 }
00058 
00059 void writePacket(DigitalOut* dmx, char* channelData, int channelCount) {
00060     int i;
00061     
00062     /* BREAK */
00063     sendBreak(dmx);
00064     
00065     /* MARK AFTER BREAK */
00066     sendMarkAfterBreak(dmx);
00067     
00068     /* START CODE */
00069     sendStartCode(dmx);
00070     
00071     /* CHANNEL DATA */
00072     for(i=0; i<channelCount; i++) {
00073     
00074         /* MARK TIME BETWEEN FRAMES */
00075         *dmx = MARK;
00076         wait_us(MTBF * PW);
00077         
00078         /* CHANNEL DATA */
00079         sendChannelData(dmx, channelData + i);
00080     }
00081     
00082     /* MARK TIME BETWEEN PACKETS */
00083     /* AND RETURN TO IDLE */
00084     *dmx = MARK;
00085     wait_us(MTBP * PW);
00086     return;
00087 }