src/dmx.c
author Tero Marttila <terom@paivola.fi>
Tue, 02 Dec 2014 00:23:48 +0200
changeset 101 18c461237630
parent 98 e743c905cbf5
permissions -rw-r--r--
src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
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();
101
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    42
    dmx_pause(3); // min 2, recommended 3
65
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
101
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    47
/*
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    48
 * Send out a full DMX packet, including the start-code frame and a frame for each channel given.
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    49
 *
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    50
 * Uses 3-bit mark-times between frames, since some fixtures don't seem happy with 2-bit mark-times.
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    51
 */
66
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    52
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
    53
{
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    dmx_break();
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    dmx_frame(0);
101
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    56
    dmx_pause(1); // MTBF 2+1 = 3
65
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
66
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    58
    for (byte i = 0; i < count; i++) {
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    59
        dmx_frame(out[i]);
101
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    60
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    61
        // MTBF 2+1 = 3
18c461237630 src/dmx.c: bump mark-after-break and mark-between-frames to 3 bits
Tero Marttila <terom@paivola.fi>
parents: 98
diff changeset
    62
        dmx_pause(1);
66
0cf14786b909 dmx: implement output
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    63
    }
65
625f34328820 dmx: split out dmx.c module; implement console
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
}