src/dmx.c
author Tero Marttila <terom@paivola.fi>
Sat, 08 Nov 2014 17:51:09 +0200
changeset 98 e743c905cbf5
parent 66 0cf14786b909
child 101 18c461237630
permissions -rw-r--r--
dmx: move dmx out to PORTD2, and debug to PORTB5 (integrated LED); support \n for commands
#include <util/delay.h>

// DMX
#define DMX_DDR     DDRD
#define DMX_PORT    PORTD
#define DMX_DATA    2

// 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 count, byte *out)
{
    dmx_break();
    dmx_frame(0);

    for (byte i = 0; i < count; i++) {
        dmx_frame(out[i]);
    }
}