|
1 /* |
|
2 * DMX output. |
|
3 * |
|
4 * See doc/dmx.txt for the RX-485 bus protocol details... |
|
5 */ |
|
6 |
|
7 #include <avr/io.h> |
|
8 #include <util/delay.h> |
|
9 |
|
10 #include "stdlib.h" |
|
11 |
|
12 // debug |
|
13 #define DEBUG_DDR DDRB |
|
14 #define DEBUG_PORT PORTB |
|
15 #define DEBUG_LED 0 |
|
16 |
|
17 void led_init () |
|
18 { |
|
19 sbi(&DEBUG_DDR, DEBUG_LED); |
|
20 } |
|
21 |
|
22 void led_on () |
|
23 { |
|
24 sbi(&DEBUG_PORT, DEBUG_LED); |
|
25 } |
|
26 |
|
27 void led_off () |
|
28 { |
|
29 cbi(&DEBUG_PORT, DEBUG_LED); |
|
30 } |
|
31 |
|
32 void led_toggle () |
|
33 { |
|
34 xbi(&DEBUG_PORT, DEBUG_LED); |
|
35 } |
|
36 |
|
37 // DMX |
|
38 #define DMX_DDR DDRB |
|
39 #define DMX_PORT PORTB |
|
40 #define DMX_DATA 3 // SPI MOSI |
|
41 |
|
42 // baud rate: 250k = 4µs / bit |
|
43 #define DMX_BAUD (250 * 1000) |
|
44 #define DMX_US 4 |
|
45 |
|
46 // CPU cycles / bit: 64 @ 16Mhz |
|
47 #define DMX_CYCLES (F_CPU / DMX_BAUD) |
|
48 |
|
49 void dmx_init () |
|
50 { |
|
51 // dmx data out: idle (high) |
|
52 sbi(&DMX_PORT, DMX_DATA); |
|
53 sbi(&DMX_DDR, DMX_DATA); |
|
54 } |
|
55 |
|
56 static inline void dmx_high () |
|
57 { |
|
58 sbi(&DMX_PORT, DMX_DATA); |
|
59 } |
|
60 |
|
61 static inline void dmx_low () |
|
62 { |
|
63 cbi(&DMX_PORT, DMX_DATA); |
|
64 } |
|
65 |
|
66 #define dmx_pause(bits) _delay_us((DMX_US * bits)) |
|
67 |
|
68 static void dmx_break () |
|
69 { |
|
70 // break |
|
71 dmx_low(); |
|
72 dmx_pause(22); |
|
73 |
|
74 // mark-after-break (MAB) |
|
75 dmx_high(); |
|
76 dmx_pause(2); |
|
77 } |
|
78 |
|
79 #include "dmx_frame.c" |
|
80 |
|
81 static void dmx_packet (byte r, byte g, byte b) |
|
82 { |
|
83 dmx_break(); |
|
84 dmx_frame(0); |
|
85 |
|
86 dmx_frame(0); // control |
|
87 dmx_frame(r); |
|
88 dmx_frame(g); |
|
89 dmx_frame(b); |
|
90 dmx_frame(0); // madness |
|
91 } |
|
92 |
|
93 void main () |
|
94 { |
|
95 led_init(); |
|
96 dmx_init(); |
|
97 |
|
98 // dmx |
|
99 while (true) { |
|
100 dmx_packet(0x00, 0x00, 0xff); |
|
101 dmx_pause(100); |
|
102 |
|
103 led_toggle(); |
|
104 } |
|
105 } |