summaryrefslogtreecommitdiff
path: root/dali.c
diff options
context:
space:
mode:
Diffstat (limited to 'dali.c')
-rw-r--r--dali.c68
1 files changed, 39 insertions, 29 deletions
diff --git a/dali.c b/dali.c
index d53675b..5b9d25d 100644
--- a/dali.c
+++ b/dali.c
@@ -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;