#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 count, byte *out)
{
dmx_break();
dmx_frame(0);
for (byte i = 0; i < count; i++) {
dmx_frame(out[i]);
}
}