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
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 }
Generated on Mon Jul 18 2022 15:17:06 by 1.7.2