It workx!
authorMalte S. Stretz <mss@apache.org>
Tue, 13 Jan 2009 16:51:51 +0000 (16:51 +0000)
committerMalte S. Stretz <mss@apache.org>
Tue, 13 Jan 2009 16:51:51 +0000 (16:51 +0000)
src/buffer.c
src/dmx.c
src/main.c
src/tlc.c

index a3cc6e5..7e49c80 100644 (file)
@@ -19,9 +19,8 @@ char gg_buffer_gs[512] = {
    0x44, 0x44, 0x44,\r
    0x33, 0x33, 0x33,\r
    0x22, 0x22, 0x22,\r
-   0x11, 0x11, 0x00,\r
 \r
-   0x00, 0x00, 0xFF,\r
+   0xFF, 0x00, 0x00,\r
 \r
 \r
 \r
@@ -63,9 +62,9 @@ char gg_buffer_gs[512] = {
 };\r
 \r
 char gg_buffer_dc[3]   = {\r
-  0x0B, // R\r
-  0x09, // G\r
-  0x0A  // B\r
+  0x08, // R\r
+  0x08, // G\r
+  0x08  // B\r
 };\r
 \r
 \r
@@ -79,40 +78,45 @@ char gg_buffer_dc[3]   = {
 \r
 sched_res_t buffer_test_next(void);\r
 \r
+volatile uint32_t g_delay;\r
+volatile uint8_t g_rgb = 0;\r
+void reset_counter(void)\r
+{\r
+  g_delay = 0;\r
+}\r
+\r
 void buffer_init(void)\r
 {\r
-  \r
-  #define BUFFER_INIT_KEEP 0\r
-  #if BUFFER_INIT_KEEP == 1\r
+  #define BUFFER_INIT_KEEP 1\r
+\r
+  #if BUFFER_INIT_KEEP == 0\r
   memset(gg_buffer_gs, 0x00, sizeof(gg_buffer_gs));\r
   #endif\r
   for (uint8_t i = 0; i < (TLC_N_CHANNELS / TLC_N_TLCS_PER_PAINTER - BUFFER_INIT_KEEP); i++)\r
     for (uint8_t rgb = 0; rgb < 3; rgb++)\r
-      gg_buffer_gs[i * 3 + rgb] = 0x10 | (rgb + 1);\r
+      gg_buffer_gs[i * 3 + rgb] = 0x00;// | (rgb + 1);\r
+   reset_counter();\r
 }\r
 \r
 void buffer_next(void)\r
 {\r
   //sched_put(&buffer_test_next);\r
+  //tlc_set_data_done();\r
   buffer_test_next();\r
 }\r
 \r
 \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++ != 100) return SCHED_RE;\r
-  g_test_cnt = 0;\r
-\r
-  gg_buffer_gs[rgb] += cnt;\r
-  if (gg_buffer_gs[rgb] == 0) {\r
-    rgb = (rgb + 1) % 3;\r
-    if (rgb == 0) cnt *= -1;\r
-  }\r
-#endif\r
+  char * foo = gg_buffer_gs + 15 * 3;\r
+\r
+  if (g_delay++ < 100000) return 0;\r
+  reset_counter();\r
+  foo[0] = (g_rgb % 3) == 0 ? 0xFF : 0x00;\r
+  foo[1] = (g_rgb % 3) == 1 ? 0xFF : 0x00;\r
+  foo[2] = (g_rgb % 3) == 2 ? 0xFF : 0x00;\r
+  g_rgb--;\r
+\r
   tlc_set_data_done();\r
   return SCHED_OK;\r
 }\r
index b44f951..dd21637 100644 (file)
--- a/src/dmx.c
+++ b/src/dmx.c
@@ -154,11 +154,11 @@ void int_dummy(void) { }
 void dmx_init(void)
 {
   // Configure as input.
-  pin_in(PIN_DMX);
+  //pin_in(PIN_DMX);
 
   // Trigger INT0 on any edge (p67)
-  bits_on(MCUCR, ISC01);
-  bits_on(MCUCR, ISC00);
+  //bits_on(MCUCR, ISC01);
+  //bits_on(MCUCR, ISC00);
 }
 
 void dmx_int_timer0_ovf(void)
index 4aa61fd..18fa1b0 100644 (file)
@@ -52,11 +52,13 @@ int main(void)
   // Start DMX\r
   //dmx_start();\r
   // not done yet, use dummy data\r
-  buffer_next();\r
+  //buffer_next();\r
 \r
   // Start scheduler.\r
   //sched_loop();\r
+\r
   while (1) {\r
+    buffer_next();\r
     tlc_wait_for_data();\r
   }\r
   return 0;\r
index 14f1f45..29cbbc1 100644 (file)
--- a/src/tlc.c
+++ b/src/tlc.c
@@ -16,16 +16,21 @@ volatile uint8_t g_data_available;
 \r
 /////////////////////////////////////////\r
 \r
-volatile uint8_t g_data_wait;\r
+volatile uint8_t g_data_shifting;\r
+void send_data(void);\r
+void start_gscycle(void);\r
 void tlc_wait_for_data()\r
 {\r
-  if (!g_data_wait) return;\r
-  g_data_wait = wait_for_data() != SCHED_OK;\r
+  if (g_data_shifting) return;\r
+  send_data();\r
+  start_gscycle();\r
+  // Continue in background...\r
 }\r
-void set_wait_for_data(void)\r
+void set_shifting_off(void)\r
 {\r
   //sched_put(&wait_for_data);\r
-  g_data_wait = 1;\r
+  g_data_shifting = 0;\r
+  mcu_debug_off();\r
 }\r
 \r
 /////////////////////////////////////////\r
@@ -78,7 +83,7 @@ void tlc_init(void)
   // 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
+  mcu_set_timer1_ocma(1);\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
@@ -102,7 +107,6 @@ void tlc_init(void)
   pin_out(PIN_TLC_SIN);\r
 \r
   // Wait for first DMX packet.\r
-  set_wait_for_data();\r
 }\r
 \r
 void tlc_set_data_done(void)\r
@@ -114,6 +118,7 @@ void tlc_set_data_done(void)
 \r
 void start_gscycle(void)\r
 {\r
+  g_data_shifting = 1;\r
   // Start counter with next GS pulse.\r
   mcu_int_timer1_ocma_enable();\r
 }\r
@@ -126,13 +131,18 @@ void tlc_int_timer1_ocma(void)
   // Restart and enable timeout timer.\r
   mcu_set_timer2_cnt(0);\r
   mcu_int_timer2_ocm_enable();\r
+  mcu_debug_on();\r
 \r
   // Switch off BLNK.\r
   set_blnk_off();\r
+  // Hack: Switch on GSCLK\r
+  pin_out(PIN_TLC_GSCK);\r
 }\r
 \r
 void tlc_int_timer2_ocm(void)\r
 {\r
+  // Hack: Switch off GSCLK\r
+  pin_in(PIN_TLC_GSCK);\r
   // Go into BLNK mode (switch off LEDs and reset GSCLK counter)\r
   set_blnk_on();\r
 \r
@@ -140,7 +150,7 @@ void tlc_int_timer2_ocm(void)
   mcu_int_timer2_ocm_disable();\r
 \r
   // Wait for next DMX packet.\r
-  set_wait_for_data();\r
+  set_shifting_off();\r
 }\r
 \r
 /////////////////////////////////////////\r
@@ -259,8 +269,6 @@ void send_dc_data(void)
 \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
@@ -269,7 +277,9 @@ void send_data(void)
   send_gs_data();\r
   clock_xlat();\r
 \r
-  pin_out(PIN_TLC_GSCK);\r
+  clock_sclk();\r
+\r
+  g_data_available = 0;\r
 }\r
 \r
 \r
@@ -281,9 +291,10 @@ sched_res_t wait_for_data(void)
 \r
   send_data();\r
   start_gscycle();\r
+  // Continue in background...\r
 \r
   // TODO: next data\r
-  buffer_next();\r
+  //buffer_next();\r
 \r
   return SCHED_OK;\r
 }\r