diff options
-rw-r--r-- | dali.c | 68 |
1 files changed, 39 insertions, 29 deletions
@@ -1,30 +1,36 @@ -static uint16_t dali_word; +static uint16_t dali_word, dali_sendq; static uint8_t dali_subctr, dali_state, dali_bit; static uint8_t dali_prevpin; +enum dali_state { + DALI_IDLE = 0, + DALI_TX_STARTBIT1, + DALI_TX_STARTBIT2, + + DALI_TX_LEFT = 4, + DALI_TX_RIGHT, + DALI_TX_STOP, + + DALI_RX_LEFT = 8, + DALI_RX_RIGHT, +}; + ISR(TIMER0_COMPA_vect) { uint8_t inv = 1, data; - TCNT0 = 0; - - if (PIND & D_DALII) { - PORTD |= (1 << D_LED2); - } else { - PORTD &= ~(1 << D_LED2); - } + TCNT0 = 0; /* CTC mode didn't work, CBA to debug */ data = (PIND >> D_DALII) & 1; - if (dali_state == 0 && data) { - uart_puts("dali rxbegin\n"); - dali_state = 17; + if (dali_state == DALI_IDLE && data) { + dali_state = DALI_RX_LEFT; dali_subctr = 4; dali_word = 1; } /* really simple CDR - resync clock on edge. * this is ABSOLUTELY neccessary. */ - if (dali_state >= 16 && (dali_prevpin ^ data)) { + if (dali_state >= DALI_RX_LEFT && (dali_prevpin ^ data)) { if (dali_subctr >= 2 && dali_subctr <= 5) dali_subctr = 4; } @@ -35,30 +41,34 @@ ISR(TIMER0_COMPA_vect) if (dali_subctr) return; + /* this code runs @ 2400 Hz */ + + /********** actual state processing *********/ + switch (dali_state) { /* idle */ - case 0: + case DALI_IDLE: return; /* write */ /* 1 + 2: start bit */ - case 1: + case DALI_TX_STARTBIT1: uart_puts("dali["); uart_puthex(dali_word >> 8); uart_puthex(dali_word & 0xff); uart_puts("]\n"); - + PORTD |= (1 << D_DALIO); - dali_state++; + dali_state = DALI_TX_STARTBIT2; return; - case 2: + case DALI_TX_STARTBIT2: PORTD &= ~(1 << D_DALIO); - dali_state = 4; + dali_state = DALI_TX_LEFT; dali_bit = 0; return; - case 4: + case DALI_TX_LEFT: inv = 0; - case 5: + case DALI_TX_RIGHT: dali_state ^= 1; data = (dali_word >> (15 - dali_bit)) & 1; @@ -71,21 +81,21 @@ ISR(TIMER0_COMPA_vect) if (inv) dali_bit++; if (dali_bit == 16) - dali_state = 6; + dali_state = DALI_TX_STOP; break; - case 6: + case DALI_TX_STOP: PORTD &= ~(1 << D_DALIO); - dali_state = 0; + dali_state = DALI_IDLE; uart_puts("dali sent\n"); return; /* read */ - case 16: + case DALI_RX_RIGHT: dali_word <<= 1; dali_word |= 1 - data; - dali_state = 17; + dali_state = DALI_RX_LEFT; if (dali_word & 0x1000) { - dali_state = 0; + dali_state = DALI_IDLE; dali_word >>= 3; uart_puts("dali_rx "); @@ -93,8 +103,8 @@ ISR(TIMER0_COMPA_vect) uart_puts("\n"); } break; - case 17: - dali_state = 16; + case DALI_RX_LEFT: + dali_state = DALI_RX_RIGHT; break; } } @@ -105,7 +115,7 @@ static void dali_init(void) PORTD &= ~(1 << D_DALIO); dali_subctr = 0; - dali_state = 0; + dali_state = DALI_IDLE; dali_prevpin = 0; TCNT0 = 0; |