Introduce a multi-purpose status register for TLC and allow the use of unused registe...
authorMalte S. Stretz <mss@apache.org>
Tue, 17 Mar 2009 12:51:46 +0000 (12:51 +0000)
committerMalte S. Stretz <mss@apache.org>
Tue, 17 Mar 2009 12:51:46 +0000 (12:51 +0000)
src/config.h
src/dmx.c
src/mcu.h
src/tlc.c

index d892588..b40c38a 100644 (file)
@@ -4,6 +4,9 @@
 #define N_PAINTER 8
 
 #define TLC_DC_ONCE 1
+#define TLC_USE_REG 1
+
+#define DMX_USE_REG 1
 
 
 // MCU setup
@@ -20,6 +23,8 @@
 
 #define PIN_LED_ON    PIN_3
 
+#define PIN_DEBUG     PIN_14
+
 #define INT_TIMER1_COMPA tlc_int_timer1_ocma
 #define INT_TIMER2_COMP  tlc_int_timer2_ocm
 
@@ -27,8 +32,9 @@
 #define INT_INT0         dmx_int_ext_edge
 #define INT_USART_RXC    dmx_int_usart_rxc
 
-#define PIN_DEBUG     PIN_14
-#define REG_DEBUG     EEARH
+#define REG_DEBUG_FLAG EEARH
+#define REG_TLC_STATUS EEARL
+#define REG_DMX_STATE  EEDR
 
 
 // Defaults
 #if TLC_DC_ONCE == 0
   #undef TLC_DC_ONCE
 #endif
+#if TLC_USE_REG == 0
+  #undef REG_TLC_STATUS
+#endif
+
+#if DMX_USE_REG == 0
+  #undef REG_DMX_STATUS
+#endif
 
 #ifdef NDEBUG
+  #undef DEBUG
   #undef PIN_DEBUG
 #else
-  #ifndef DEBUG
-    #define DEBUG
-  #endif
+  #define DEBUG
 #endif
index 4d5c191..977422d 100644 (file)
--- a/src/dmx.c
+++ b/src/dmx.c
@@ -20,7 +20,12 @@ enum state {
 /**
  * The current state of the DMX state machine.
  */
-static volatile enum state state_;
+#ifndef REG_DMX_STATE
+  static volatile enum state state_;
+#else
+  #define state_ REG_DMX_STATE
+#endif
+
 /**
  * Index of current DMX frame (between 0 and 512).
  */
@@ -201,6 +206,10 @@ end: {
 
 void dmx_init(void)
 {
+  // Initialize state (register), might be needed (p20) and 
+  // doesn't hurt.
+  state_ = STATE_IDLE;
+
   // Configure both pins as input.
   pin_in(PIN_DMX_INT);
   pin_in(PIN_DMX_RXD);
index 34c0a27..3851942 100644 (file)
--- a/src/mcu.h
+++ b/src/mcu.h
@@ -33,9 +33,9 @@
 
 
 #ifdef PIN_DEBUG
-#define mcu_init() pin_out(PIN_DEBUG)
-#ifdef REG_DEBUG
-#define mcu_debug__ REG_DEBUG
+#define mcu_init() do { pin_out(PIN_DEBUG); mcu_debug__ = 0; } while (0)
+#ifdef REG_DEBUG_FLAG
+#define mcu_debug__ REG_DEBUG_FLAG
 #else
 volatile uint8_t mcu_debug__;
 #endif
index 2d2dc35..2fe7ee2 100644 (file)
--- a/src/tlc.c
+++ b/src/tlc.c
 /*********************************************************************/
 /* Declaration of private global variables.                          */
 
+enum status_bits {
+  STATUS_SHIFTING_BIT = 0,
+  STATUS_BUFFERD_BIT  = 1
+};
+
 /**
- * Flag to indicate that data is currently shifted out.
+ * Global TLC status.
  */
-static volatile uint8_t shifting_;
+#ifndef REG_TLC_STATUS
+  static volatile uint8_t status_;
+#else
+  #define status_ REG_TLC_STATUS
+#endif
+
 
 
 /*********************************************************************/
@@ -40,6 +50,9 @@ static void set_blnk_off(void);
 static void set_vprg_gs_mode(void);
 static void set_vprg_dc_mode(void);
 
+static void set_status_shifting_on(void);
+static void set_status_shifting_off(void);
+static int  get_status_shifting(void);
 
 /*********************************************************************/
 /* Implementation of public interrupts.                              */
@@ -70,7 +83,7 @@ void tlc_int_timer2_ocm(void)
   mcu_int_timer2_ocm_disable();
 
   // Wait for next DMX packet.
-  shifting_ = 0;
+  set_status_shifting_off();
 }
 
 
@@ -79,6 +92,10 @@ void tlc_int_timer2_ocm(void)
 
 void tlc_init(void)
 {
+  // Initialize status (register), might be needed (p20) and 
+  // doesn't hurt.
+  status_ = 0x00;
+
   // We have to use the 16-bit timer for the GSCLK and the 8-bit
   // timer for the timeout even though it would be better the other
   // way round:  We need the OC2 pin for SPI and thus can generate 
@@ -156,8 +173,8 @@ void tlc_update(void)
   //       XLAT when cycle is done?
 
   // Don't send anything if PWM is still active.
-  if (shifting_) return;
-  shifting_ = 1;
+  if (get_status_shifting()) return;
+  set_status_shifting_on();
 
   // Restart and enable 100 Hz-timeout timer now so
   // it includes the time we need to shift out data.
@@ -336,3 +353,20 @@ static void set_vprg_dc_mode(void)
 }
 
 /*********************************************************************/
+
+static void set_status_shifting_on(void)
+{
+  bits_on(status_, STATUS_SHIFTING_BIT);
+}
+
+static void set_status_shifting_off(void)
+{
+  bits_off(status_, STATUS_SHIFTING_BIT);
+}
+
+static int get_status_shifting(void)
+{
+  return bits_get(status_, STATUS_SHIFTING_BIT);
+}
+
+/*********************************************************************/