src/dmx.c
author Tero Marttila <terom@paivola.fi>
Fri, 11 Apr 2014 14:42:30 +0300
changeset 65 625f34328820
child 66 0cf14786b909
permissions -rw-r--r--
dmx: split out dmx.c module; implement console
#include <util/delay.h>

// DMX
#define DMX_DDR     DDRB
#define DMX_PORT    PORTB
#define DMX_DATA    3       // SPI MOSI

// baud rate: 250k = 4µs / bit
#define DMX_BAUD    (250 * 1000)
#define DMX_US      4

// CPU cycles / bit: 64 @ 16Mhz
#define DMX_CYCLES  (F_CPU / DMX_BAUD)

void dmx_init ()
{
    // dmx data out: idle (high)
    sbi(&DMX_PORT, DMX_DATA);
    sbi(&DMX_DDR, DMX_DATA);
}

static inline void dmx_high ()
{
    sbi(&DMX_PORT, DMX_DATA);
}

static inline void dmx_low ()
{
    cbi(&DMX_PORT, DMX_DATA);
}

#define dmx_pause(bits) _delay_us((DMX_US * bits))

static void dmx_break ()
{
    // break
    dmx_low();
    dmx_pause(22);

    // mark-after-break (MAB)
    dmx_high();
    dmx_pause(2);
}

#include "dmx_frame.c"

static void dmx_packet (byte r, byte g, byte b)
{
    dmx_break();
    dmx_frame(0);

    dmx_frame(0);       // control
    dmx_frame(r);
    dmx_frame(g);
    dmx_frame(b);
    dmx_frame(0);       // madness
}