summaryrefslogtreecommitdiff
path: root/dali2.c
diff options
context:
space:
mode:
Diffstat (limited to 'dali2.c')
-rw-r--r--dali2.c54
1 files changed, 36 insertions, 18 deletions
diff --git a/dali2.c b/dali2.c
index e8c89de..b0fbcc0 100644
--- a/dali2.c
+++ b/dali2.c
@@ -22,14 +22,22 @@ static volatile bool dali_rx_avail;
static volatile uint16_t dali_tx;
static volatile bool dali_tx_rq;
-#define XBUF 48
-static uint8_t dbuf[XBUF], sbuf[XBUF], dbufpos;
+static uint16_t dalistat_falsestart, dalistat_noise, dalistat_manchester, dalistat_rxok;
+
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define XBUF 36
+static uint8_t dbuf[XBUF], sbuf[XBUF], fbuf[XBUF];
+static int8_t dbufpos;
+#define F_MAJ 0x01
+#define F_MCH 0x10
+#endif
#define dali_s_listening() (dali_state <= DALI_SPACE)
#define dali_s_cdr() (dali_state == DALI_RX_DATA)
-#define DEBUG 0
-
ISR(TIMER0_COMPA_vect)
{
static uint8_t history = 0;
@@ -45,6 +53,7 @@ ISR(TIMER0_COMPA_vect)
uint8_t bit = 0;
static uint8_t subsamp = 0;
+ uint8_t flags = 0;
subsamp++;
subsamp &= 7;
@@ -61,10 +70,8 @@ ISR(TIMER0_COMPA_vect)
* /edge/ <----------- stable / sample ---------->
*/
if (dali_s_cdr()) {
- if (subsamp >= 3 && subsamp <= 5 && ((history & 0x0f) == 0x03 || (history & 0x0f) == 0x0c)) {
-// uart_puts("<CDR>");
+ if (subsamp >= 2 && subsamp <= 6 && ((history & 0x0f) == 0x03 || (history & 0x0f) == 0x0c))
subsamp = 4;
- }
}
if (dali_s_listening() && hist_majority_1()) {
rx_prevstate_errs = dali_state;
@@ -75,10 +82,15 @@ ISR(TIMER0_COMPA_vect)
if (subsamp)
return;
+#ifdef DEBUG
if (dali_state != DALI_IDLE && dbufpos < XBUF) {
- sbuf[dbufpos] = dali_state;
- dbuf[dbufpos++] = history;
+ if (dbufpos >= 0) {
+ sbuf[dbufpos] = dali_state;
+ dbuf[dbufpos] = history;
+ }
+ dbufpos++;
}
+#endif
switch (dali_state) {
case DALI_SPACE:
@@ -93,7 +105,7 @@ ISR(TIMER0_COMPA_vect)
case DALI_RX_SBIT:
if (!hist_majority_0()) {
- uart_puts("<FSE>");
+ dalistat_falsestart++;
dali_state = rx_prevstate_errs;
return;
}
@@ -106,7 +118,7 @@ ISR(TIMER0_COMPA_vect)
case DALI_RX_DATA:
if (!(hist_majority_1() || hist_majority_0())) {
rx_prevstate_errs++;
- uart_puts("<MJE>");
+ dalistat_noise++;
bit = 0;
} else
bit = hist_majority_1();
@@ -114,7 +126,7 @@ ISR(TIMER0_COMPA_vect)
if (bitpos & 1) {
if (bit == (rx_data & 1)) {
rx_prevstate_errs++;
- uart_puts("<MAF>");
+ dalistat_manchester++;
}
} else {
rx_data <<= 1;
@@ -127,6 +139,7 @@ ISR(TIMER0_COMPA_vect)
if (!rx_prevstate_errs) {
dali_rx = rx_data;
dali_rx_avail = 1;
+ dalistat_rxok++;
}
}
break;
@@ -172,10 +185,6 @@ ISR(TIMER0_COMPA_vect)
PORTD |= (1 << D_DALIO);
}
}
-#if DEBUG
- if (dali_state != DALI_IDLE || bitpos != 0)
- uart_puts("\n");
-#endif
if (dali_state == DALI_IDLE && dali_tx_rq) {
tx_data = dali_tx;
@@ -189,13 +198,15 @@ ISR(TIMER0_COMPA_vect)
static void dali_send(uint16_t word)
{
+#if 0
uart_wait();
uart_puts("\n\n\ndali_send ");
uart_puthex(word >> 8);
uart_puthex(word & 0xff);
uart_puts("\n");
uart_wait();
- dbufpos = 0;
+ dbufpos = -35;
+#endif
dali_rx_avail = 0;
dali_tx = word;
@@ -205,6 +216,7 @@ static void dali_send(uint16_t word)
asm volatile ("" ::: "memory");
}
+#if 0
uart_wait();
uart_puts("dali_sent ");
uart_puthex(word >> 8);
@@ -224,7 +236,11 @@ static void dali_send(uint16_t word)
uart_puthex(dbuf[x]);
uart_puts("\n");
uart_wait();
-
+ for (uint8_t x = 0; x < dbufpos; x++)
+ uart_puthex(fbuf[x]);
+ uart_puts("\n");
+ uart_wait();
+#endif
}
static void dali_twice(uint16_t word)
@@ -241,6 +257,8 @@ static void dali_init(void)
dali_tx_rq = 0;
dali_rx_avail = 0;
+ dalistat_falsestart = dalistat_noise = dalistat_manchester = dalistat_rxok = 0;
+
TIFR0 = (1 << OCF0A);
TCNT0 = 0;
OCR0A = 52; // 8 MHz / 8 / 52 = 19230.