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@0:9f79770fc0a8, 2011-07-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |