diff options
Diffstat (limited to 'dali2.c')
-rw-r--r-- | dali2.c | 54 |
1 files changed, 36 insertions, 18 deletions
@@ -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. |