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@1:7daf1361d960, 2011-07-09 (annotated)
- Committer:
- User_4574
- Date:
- Sat Jul 09 19:42:54 2011 +0000
- Revision:
- 1:7daf1361d960
- Parent:
- 0:9f79770fc0a8
Put some details at the top.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
User_4574 | 1:7daf1361d960 | 1 | /* DMX Packet Library |
User_4574 | 1:7daf1361d960 | 2 | * Nathan Lasseter (User_4574) 2011 |
User_4574 | 1:7daf1361d960 | 3 | * Released unlicenced |
User_4574 | 1:7daf1361d960 | 4 | * http://www.dmx512-online.com/packt.html |
User_4574 | 1:7daf1361d960 | 5 | */ |
User_4574 | 1:7daf1361d960 | 6 | |
User_4574 | 0:9f79770fc0a8 | 7 | #include "mbed.h" |
User_4574 | 0:9f79770fc0a8 | 8 | #include "DMXPacket.h" |
User_4574 | 0:9f79770fc0a8 | 9 | |
User_4574 | 0:9f79770fc0a8 | 10 | void init(DigitalOut* dmx) { |
User_4574 | 0:9f79770fc0a8 | 11 | /* initialise */ |
User_4574 | 0:9f79770fc0a8 | 12 | *dmx = MARK; |
User_4574 | 0:9f79770fc0a8 | 13 | return; |
User_4574 | 0:9f79770fc0a8 | 14 | } |
User_4574 | 0:9f79770fc0a8 | 15 | |
User_4574 | 0:9f79770fc0a8 | 16 | void sendBreak(DigitalOut* dmx) { |
User_4574 | 0:9f79770fc0a8 | 17 | /* BREAK */ |
User_4574 | 0:9f79770fc0a8 | 18 | *dmx = BREAK; |
User_4574 | 0:9f79770fc0a8 | 19 | wait_us(120 * PW); |
User_4574 | 0:9f79770fc0a8 | 20 | return; |
User_4574 | 0:9f79770fc0a8 | 21 | } |
User_4574 | 0:9f79770fc0a8 | 22 | |
User_4574 | 0:9f79770fc0a8 | 23 | void sendMarkAfterBreak(DigitalOut* dmx) { |
User_4574 | 0:9f79770fc0a8 | 24 | /* MARK AFTER BREAK */ |
User_4574 | 0:9f79770fc0a8 | 25 | *dmx = MARK; |
User_4574 | 0:9f79770fc0a8 | 26 | wait_us(3 * PW); |
User_4574 | 0:9f79770fc0a8 | 27 | return; |
User_4574 | 0:9f79770fc0a8 | 28 | } |
User_4574 | 0:9f79770fc0a8 | 29 | |
User_4574 | 0:9f79770fc0a8 | 30 | void sendStartCode(DigitalOut* dmx) { |
User_4574 | 0:9f79770fc0a8 | 31 | /* 1 START 8 DATA */ |
User_4574 | 0:9f79770fc0a8 | 32 | *dmx = BREAK; |
User_4574 | 0:9f79770fc0a8 | 33 | wait_us(9 * PW); |
User_4574 | 0:9f79770fc0a8 | 34 | |
User_4574 | 0:9f79770fc0a8 | 35 | /* 2 STOP */ |
User_4574 | 0:9f79770fc0a8 | 36 | *dmx = MARK; |
User_4574 | 0:9f79770fc0a8 | 37 | wait_us(2 * PW); |
User_4574 | 0:9f79770fc0a8 | 38 | return; |
User_4574 | 0:9f79770fc0a8 | 39 | } |
User_4574 | 0:9f79770fc0a8 | 40 | |
User_4574 | 0:9f79770fc0a8 | 41 | void sendChannelData(DigitalOut* dmx, char* channelData) { |
User_4574 | 0:9f79770fc0a8 | 42 | char i, data = *channelData; |
User_4574 | 0:9f79770fc0a8 | 43 | /* 1 START */ |
User_4574 | 0:9f79770fc0a8 | 44 | *dmx = BREAK; |
User_4574 | 0:9f79770fc0a8 | 45 | wait_us(PW); |
User_4574 | 0:9f79770fc0a8 | 46 | |
User_4574 | 0:9f79770fc0a8 | 47 | /* 8 DATA */ |
User_4574 | 0:9f79770fc0a8 | 48 | for(i = 0xF0; i; i >>= 1) { |
User_4574 | 0:9f79770fc0a8 | 49 | *dmx = ((data & i) ? MARK : BREAK); |
User_4574 | 0:9f79770fc0a8 | 50 | wait_us(PW); |
User_4574 | 0:9f79770fc0a8 | 51 | } |
User_4574 | 0:9f79770fc0a8 | 52 | |
User_4574 | 0:9f79770fc0a8 | 53 | /* 2 STOP */ |
User_4574 | 0:9f79770fc0a8 | 54 | *dmx = MARK; |
User_4574 | 0:9f79770fc0a8 | 55 | wait_us(2 * PW); |
User_4574 | 0:9f79770fc0a8 | 56 | return; |
User_4574 | 0:9f79770fc0a8 | 57 | } |
User_4574 | 0:9f79770fc0a8 | 58 | |
User_4574 | 0:9f79770fc0a8 | 59 | void writePacket(DigitalOut* dmx, char* channelData, int channelCount) { |
User_4574 | 0:9f79770fc0a8 | 60 | int i; |
User_4574 | 0:9f79770fc0a8 | 61 | |
User_4574 | 0:9f79770fc0a8 | 62 | /* BREAK */ |
User_4574 | 0:9f79770fc0a8 | 63 | sendBreak(dmx); |
User_4574 | 0:9f79770fc0a8 | 64 | |
User_4574 | 0:9f79770fc0a8 | 65 | /* MARK AFTER BREAK */ |
User_4574 | 0:9f79770fc0a8 | 66 | sendMarkAfterBreak(dmx); |
User_4574 | 0:9f79770fc0a8 | 67 | |
User_4574 | 0:9f79770fc0a8 | 68 | /* START CODE */ |
User_4574 | 0:9f79770fc0a8 | 69 | sendStartCode(dmx); |
User_4574 | 0:9f79770fc0a8 | 70 | |
User_4574 | 0:9f79770fc0a8 | 71 | /* CHANNEL DATA */ |
User_4574 | 0:9f79770fc0a8 | 72 | for(i=0; i<channelCount; i++) { |
User_4574 | 0:9f79770fc0a8 | 73 | |
User_4574 | 0:9f79770fc0a8 | 74 | /* MARK TIME BETWEEN FRAMES */ |
User_4574 | 0:9f79770fc0a8 | 75 | *dmx = MARK; |
User_4574 | 0:9f79770fc0a8 | 76 | wait_us(MTBF * PW); |
User_4574 | 0:9f79770fc0a8 | 77 | |
User_4574 | 0:9f79770fc0a8 | 78 | /* CHANNEL DATA */ |
User_4574 | 0:9f79770fc0a8 | 79 | sendChannelData(dmx, channelData + i); |
User_4574 | 0:9f79770fc0a8 | 80 | } |
User_4574 | 0:9f79770fc0a8 | 81 | |
User_4574 | 0:9f79770fc0a8 | 82 | /* MARK TIME BETWEEN PACKETS */ |
User_4574 | 0:9f79770fc0a8 | 83 | /* AND RETURN TO IDLE */ |
User_4574 | 0:9f79770fc0a8 | 84 | *dmx = MARK; |
User_4574 | 0:9f79770fc0a8 | 85 | wait_us(MTBP * PW); |
User_4574 | 0:9f79770fc0a8 | 86 | return; |
User_4574 | 0:9f79770fc0a8 | 87 | } |