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
65
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#include <util/delay.h>
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
// DMX
98
e743c905cbf5 dmx: move dmx out to PORTD2, and debug to PORTB5 (integrated LED); support \n for commands
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
     4
#define DMX_DDR     DDRD
e743c905cbf5 dmx: move dmx out to PORTD2, and debug to PORTB5 (integrated LED); support \n for commands
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
     5
#define DMX_PORT    PORTD
e743c905cbf5 dmx: move dmx out to PORTD2, and debug to PORTB5 (integrated LED); support \n for commands
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
     6
#define DMX_DATA    2
65
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
// baud rate: 250k = 4µs / bit
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
#define DMX_BAUD    (250 * 1000)
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
#define DMX_US      4
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
// CPU cycles / bit: 64 @ 16Mhz
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
#define DMX_CYCLES  (F_CPU / DMX_BAUD)
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
void dmx_init ()
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
{
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    // dmx data out: idle (high)
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    sbi(&DMX_PORT, DMX_DATA);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    sbi(&DMX_DDR, DMX_DATA);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
}
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
static inline void dmx_high ()
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
{
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    sbi(&DMX_PORT, DMX_DATA);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
}
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
static inline void dmx_low ()
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
{
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    cbi(&DMX_PORT, DMX_DATA);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
}
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
#define dmx_pause(bits) _delay_us((DMX_US * bits))
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
static void dmx_break ()
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
{
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    // break
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    dmx_low();
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    dmx_pause(22);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    // mark-after-break (MAB)
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    dmx_high();
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    dmx_pause(2);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
}
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
#include "dmx_frame.c"
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
66
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    47
static void dmx_packet (byte count, byte *out)
65
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
{
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
    dmx_break();
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    dmx_frame(0);
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
66
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    52
    for (byte i = 0; i < count; i++) {
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    53
        dmx_frame(out[i]);
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    54
    }
65
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
}