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.

Committer:
User_4574
Date:
Sat Jul 09 19:38:50 2011 +0000
Revision:
0:9f79770fc0a8
Child:
1:7daf1361d960
Initial revision, I havent put it through the logic probe yet, but timings look good on the CRO.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
User_4574 0:9f79770fc0a8 1 #include "mbed.h"
User_4574 0:9f79770fc0a8 2 #include "DMXPacket.h"
User_4574 0:9f79770fc0a8 3
User_4574 0:9f79770fc0a8 4 void init(DigitalOut* dmx) {
User_4574 0:9f79770fc0a8 5 /* initialise */
User_4574 0:9f79770fc0a8 6 *dmx = MARK;
User_4574 0:9f79770fc0a8 7 return;
User_4574 0:9f79770fc0a8 8 }
User_4574 0:9f79770fc0a8 9
User_4574 0:9f79770fc0a8 10 void sendBreak(DigitalOut* dmx) {
User_4574 0:9f79770fc0a8 11 /* BREAK */
User_4574 0:9f79770fc0a8 12 *dmx = BREAK;
User_4574 0:9f79770fc0a8 13 wait_us(120 * PW);
User_4574 0:9f79770fc0a8 14 return;
User_4574 0:9f79770fc0a8 15 }
User_4574 0:9f79770fc0a8 16
User_4574 0:9f79770fc0a8 17 void sendMarkAfterBreak(DigitalOut* dmx) {
User_4574 0:9f79770fc0a8 18 /* MARK AFTER BREAK */
User_4574 0:9f79770fc0a8 19 *dmx = MARK;
User_4574 0:9f79770fc0a8 20 wait_us(3 * PW);
User_4574 0:9f79770fc0a8 21 return;
User_4574 0:9f79770fc0a8 22 }
User_4574 0:9f79770fc0a8 23
User_4574 0:9f79770fc0a8 24 void sendStartCode(DigitalOut* dmx) {
User_4574 0:9f79770fc0a8 25 /* 1 START 8 DATA */
User_4574 0:9f79770fc0a8 26 *dmx = BREAK;
User_4574 0:9f79770fc0a8 27 wait_us(9 * PW);
User_4574 0:9f79770fc0a8 28
User_4574 0:9f79770fc0a8 29 /* 2 STOP */
User_4574 0:9f79770fc0a8 30 *dmx = MARK;
User_4574 0:9f79770fc0a8 31 wait_us(2 * PW);
User_4574 0:9f79770fc0a8 32 return;
User_4574 0:9f79770fc0a8 33 }
User_4574 0:9f79770fc0a8 34
User_4574 0:9f79770fc0a8 35 void sendChannelData(DigitalOut* dmx, char* channelData) {
User_4574 0:9f79770fc0a8 36 char i, data = *channelData;
User_4574 0:9f79770fc0a8 37 /* 1 START */
User_4574 0:9f79770fc0a8 38 *dmx = BREAK;
User_4574 0:9f79770fc0a8 39 wait_us(PW);
User_4574 0:9f79770fc0a8 40
User_4574 0:9f79770fc0a8 41 /* 8 DATA */
User_4574 0:9f79770fc0a8 42 for(i = 0xF0; i; i >>= 1) {
User_4574 0:9f79770fc0a8 43 *dmx = ((data & i) ? MARK : BREAK);
User_4574 0:9f79770fc0a8 44 wait_us(PW);
User_4574 0:9f79770fc0a8 45 }
User_4574 0:9f79770fc0a8 46
User_4574 0:9f79770fc0a8 47 /* 2 STOP */
User_4574 0:9f79770fc0a8 48 *dmx = MARK;
User_4574 0:9f79770fc0a8 49 wait_us(2 * PW);
User_4574 0:9f79770fc0a8 50 return;
User_4574 0:9f79770fc0a8 51 }
User_4574 0:9f79770fc0a8 52
User_4574 0:9f79770fc0a8 53 void writePacket(DigitalOut* dmx, char* channelData, int channelCount) {
User_4574 0:9f79770fc0a8 54 int i;
User_4574 0:9f79770fc0a8 55
User_4574 0:9f79770fc0a8 56 /* BREAK */
User_4574 0:9f79770fc0a8 57 sendBreak(dmx);
User_4574 0:9f79770fc0a8 58
User_4574 0:9f79770fc0a8 59 /* MARK AFTER BREAK */
User_4574 0:9f79770fc0a8 60 sendMarkAfterBreak(dmx);
User_4574 0:9f79770fc0a8 61
User_4574 0:9f79770fc0a8 62 /* START CODE */
User_4574 0:9f79770fc0a8 63 sendStartCode(dmx);
User_4574 0:9f79770fc0a8 64
User_4574 0:9f79770fc0a8 65 /* CHANNEL DATA */
User_4574 0:9f79770fc0a8 66 for(i=0; i<channelCount; i++) {
User_4574 0:9f79770fc0a8 67
User_4574 0:9f79770fc0a8 68 /* MARK TIME BETWEEN FRAMES */
User_4574 0:9f79770fc0a8 69 *dmx = MARK;
User_4574 0:9f79770fc0a8 70 wait_us(MTBF * PW);
User_4574 0:9f79770fc0a8 71
User_4574 0:9f79770fc0a8 72 /* CHANNEL DATA */
User_4574 0:9f79770fc0a8 73 sendChannelData(dmx, channelData + i);
User_4574 0:9f79770fc0a8 74 }
User_4574 0:9f79770fc0a8 75
User_4574 0:9f79770fc0a8 76 /* MARK TIME BETWEEN PACKETS */
User_4574 0:9f79770fc0a8 77 /* AND RETURN TO IDLE */
User_4574 0:9f79770fc0a8 78 *dmx = MARK;
User_4574 0:9f79770fc0a8 79 wait_us(MTBP * PW);
User_4574 0:9f79770fc0a8 80 return;
User_4574 0:9f79770fc0a8 81 }