src/hello-dmx.c
changeset 62 2d68a76322cb
child 65 625f34328820
equal deleted inserted replaced
61:a960cf5981f7 62:2d68a76322cb
       
     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 }