It works... almost.
authorMalte S. Stretz <mss@apache.org>
Mon, 12 Jan 2009 17:16:57 +0000 (17:16 +0000)
committerMalte S. Stretz <mss@apache.org>
Mon, 12 Jan 2009 17:16:57 +0000 (17:16 +0000)
src/Makefile
src/buffer.c
src/main.c
src/mcu.h
src/tlc.c

index 10126fb..be97b4a 100644 (file)
@@ -98,7 +98,7 @@ EXTRAINCDIRS =
 #     gnu89 = c89 plus GCC extensions
 #     c99   = ISO C99 standard (not yet fully implemented)
 #     gnu99 = c99 plus GCC extensions
-CSTANDARD = -std=c99
+CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here
index da71aa6..cad55a5 100644 (file)
@@ -2,8 +2,11 @@
 \r
 char gg_buffer_gs[512] = {\r
   /* R     G     B */\r
-   0xFF, 0xFF, 0xFF,\r
-   0xEE, 0xEE, 0xEE,\r
+   0x01, 0x01, 0x01,\r
+   0x00, 0x00, 0xFF,\r
+\r
+\r
+   0x00, 0x00, 0x00,\r
    0xDD, 0xDD, 0xDD,\r
    0xCC, 0xCC, 0xCC,\r
    0xBB, 0xBB, 0xBB,\r
@@ -16,8 +19,15 @@ char gg_buffer_gs[512] = {
    0x44, 0x44, 0x44,\r
    0x33, 0x33, 0x33,\r
    0x22, 0x22, 0x22,\r
-   0x11, 0x11, 0x11,\r
-   0x01, 0x02, 0x03,\r
+   0x11, 0x11, 0x00,\r
+\r
+   0xFF, 0x00, 0xFF,\r
+\r
+\r
+\r
+\r
+\r
+\r
 \r
    0xFF, 0xFF, 0xFF,\r
    0xEE, 0xEE, 0xEE,\r
@@ -38,20 +48,20 @@ char gg_buffer_gs[512] = {
 };\r
 \r
 char gg_buffer_dc[3]   = {\r
-  0xAB, // R\r
-  0xCD, // G\r
-  0xEF  // B\r
+  0x0B, // R\r
+  0x09, // G\r
+  0x0A  // B\r
 };\r
 \r
 \r
 #include "tlc.h"\r
-volatile uint8_t g_test_cnt = 0;\r
+volatile uint8_t g_test_cnt;\r
 sched_res_t buffer_test_next(void)\r
 {\r
 #if 0\r
   uint8_t rgb =  0;\r
   uint8_t cnt = -1;\r
-  if (g_test_cnt++ != 10) return SCHED_RE;\r
+  if (g_test_cnt++ != 100) return SCHED_RE;\r
   g_test_cnt = 0;\r
 \r
   gg_buffer_gs[rgb] += cnt;\r
index e578b2a..e0b385a 100644 (file)
@@ -7,6 +7,8 @@
 #include "tlc.h"\r
 #include "sd.h"\r
 \r
+#include "buffer.h"\r
+\r
 \r
 // http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html\r
 #if __GNUC__ < 4\r
@@ -41,6 +43,11 @@ int main(void)
   //dmx_init();\r
   tlc_init();\r
 \r
+  for (uint8_t i = 0; i < 15; i++)\r
+    for (uint8_t rgb = 0; rgb < 3; rgb++)\r
+      gg_buffer_gs[i * 3 + rgb] = 0x10 | (rgb + 1);\r
+\r
+\r
   sei();\r
   // Start DMX\r
   //dmx_start();\r
index 1b43bb2..4568f10 100644 (file)
--- a/src/mcu.h
+++ b/src/mcu.h
@@ -7,7 +7,9 @@
 
 #include "pins.h"
 
-#include "mcu_config.h"
+#include "mcu_config.h"\r
+\r
+#define nop() asm volatile ("nop")
 
 #define mcu_isr(name) ISR(name ## _vect) { INT_ ## name (); } int main(void)
 
index 6723c82..be377cf 100644 (file)
--- a/src/tlc.c
+++ b/src/tlc.c
@@ -61,10 +61,10 @@ void tlc_init(void)
   // Timer 1 is for our GSCLK:  We refresh with a GS cycle of\r
   // about 100 Hz (cf. Timer 2), for each full cycle we need to\r
   // clock the PWM 4096 times.\r
-  // Shortest duty cycle possible.\r
-  mcu_set_timer1_ocma(1);\r
   // We need about 38 clocks to get 4096 cycles at 100 Hz.\r
   mcu_set_timer1_ic(38);\r
+  // 50% duty cycle.\r
+  mcu_set_timer1_ocma(38 / 2);\r
   // * CS1 = 0001:  No prescaler. (p100)\r
   // * WGM1 = 1110: Fast PWM, TOP at ICR1\r
   // * COM1A = 10: Set at 0, clear at Output Compare Match)\r
@@ -136,7 +136,6 @@ void tlc_int_timer2_ocm(void)
 void shift8(uint8_t byte)\r
 {\r
   // Shift out all eight bits.\r
-  // TODO: The assembler code is a mess, why the 16-Bit counter?\r
   for (uint8_t bit = bits_uint8(1, 0, 0, 0, 0, 0, 0, 0); bit; bit >>= 1) {\r
     if (byte & bit) {\r
       pin_on(PIN_TLC_SIN);\r
@@ -163,6 +162,8 @@ void shift12(uint8_t byte)
 \r
 void send_gs_data(void)\r
 {\r
+  // Set VPRG to GS mode.\r
+  set_vprg_gs_mode();\r
   // Because the TLCs are daisy-chained, we have to shift out the RGB data\r
   // starting at the end.  Each painter has 3 TLCs (with 16 channels each), \r
   // for the colors red, green, blue.  So we've got to shift out the 16 blue\r
@@ -172,16 +173,16 @@ void send_gs_data(void)
   // This will always point to the start of the current painter data, \r
   // starting with the last one.\r
   char * painter_gs = gg_buffer_gs\r
-                    + (TLC_N_CHANNELS - 1)\r
-                    - (TLC_N_CHANNELS_PER_PAINTER - 1);\r
+                    + TLC_N_CHANNELS\r
+                    - TLC_N_CHANNELS_PER_PAINTER;\r
   // Find the current data byte to shift out, starting with the last one.\r
   // Its signed so we can determine when we reached the end/start, eight\r
   // bit are enough to index 48 channels per painter.\r
 #if TLC_N_CHANNELS_PER_PAINTER != 48\r
 #error What a weird painter...\r
 #endif\r
-  int8_t index = TLC_N_CHANNELS_PER_PAINTER - 1;\r
   while (1) {\r
+    int8_t index = TLC_N_CHANNELS_PER_PAINTER - 1;\r
     while (1) {\r
       // Shift out current channel.\r
       shift12(painter_gs[index]);\r
@@ -211,6 +212,9 @@ void send_gs_data(void)
 \r
 void send_dc_data(void)\r
 {\r
+  // Set VPRG to DC mode. \r
+  set_vprg_dc_mode();  \r
+\r
   // All TLCs on all the connected painters will get the same DC value.\r
   // That makes it easy to generate the 6-Bit format we need:  We just\r
   // create a constant buffer for the packed rgb values, containing four\r
@@ -218,36 +222,33 @@ void send_dc_data(void)
   uint8_t dc_out[3][3];\r
   for (int8_t rgb = 2; rgb >= 0; rgb--) {\r
     uint8_t dc_data = gg_buffer_dc[rgb] & bits_uint8(1, 1, 1, 1, 1, 1, 0, 0);\r
-    dc_out[rgb][0] = (dc_data << 0) | (dc_data >> 6);\r
+    dc_out[rgb][2] = (dc_data << 0) | (dc_data >> 6);\r
     dc_out[rgb][1] = (dc_data << 2) | (dc_data >> 4);\r
-    dc_out[rgb][2] = (dc_data << 4) | (dc_data >> 2);\r
+    dc_out[rgb][0] = (dc_data << 4) | (dc_data >> 2);\r
   }\r
 \r
   // Now, shift out the dc-data like we do it with the gs-data:  First the\r
   // last blue, then green and red of the last painter, until we reach the\r
   // first red.\r
   int8_t painter = N_PAINTER;\r
-  int8_t rgb     = 3 - 1;\r
-  int8_t channel = TLC_N_CHANNELS_PER_TLC - 1;\r
-  while (1) {\r
-    shift8(dc_out[rgb][channel & (4 - 1)]);\r
-\r
-    channel--;\r
-    if (channel == 0) {\r
-      channel = TLC_N_CHANNELS_PER_TLC - 1;\r
+  do {\r
+    int8_t rgb = 3 - 1;\r
+    do {\r
+      int8_t index = (TLC_N_CHANNELS_PER_TLC / 4) * 3 - 1;\r
+      do {\r
+        shift8(dc_out[rgb][index % 3]);\r
+        index--;\r
+      } while (index != -1);\r
       rgb--;\r
-      if (rgb < 0) {\r
-        rgb = 3 - 1;\r
-        painter--;\r
-        if (painter == 0)\r
-          break;\r
-      }\r
-    }\r
-  }\r
+    } while (rgb != -1);\r
+    painter--;\r
+  } while (painter != 0);\r
 }\r
 \r
 void send_data(void)\r
 {\r
+  pin_in(PIN_TLC_GSCK);\r
+\r
   // Always shift out DC first.\r
   send_dc_data();\r
   clock_xlat();\r
@@ -255,6 +256,8 @@ void send_data(void)
   // No extra SCLK needed, just shift out all GS data.\r
   send_gs_data();\r
   clock_xlat();\r
+\r
+  pin_out(PIN_TLC_GSCK);\r
 }\r
 \r
 \r