Additional routines to provide multiple LED strip port connections.

Dependencies:   mbed

Fork of WS2811_RY_A by ohararp@...

Files at this revision

API Documentation at this revision

Comitter:
rmsteele
Date:
Mon Apr 08 00:38:50 2013 +0000
Parent:
1:08d0b5e3b8e3
Commit message:
Finxed Timing issues and added additional routines for multiple ports for multiple strips.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Sun Mar 31 21:22:08 2013 +0000
+++ b/main.cpp	Mon Apr 08 00:38:50 2013 +0000
@@ -1,11 +1,11 @@
 #include "mbed.h"
 Serial pc(USBTX, USBRX);
-DigitalOut dat(p5);
+DigitalOut dat(p5), dat1(p6), dat2(p7), dat3(p8), dat4(p9), dat5(p10);
 
 
 //*******************************************************************************    
 // DEFINE WS2811 Strip Parameters
-#define numLEDs 30
+#define numLEDs 9
 uint8_t *pixels;
 Timer guardtime;
 uint32_t bogocal;
@@ -34,9 +34,10 @@
 void writebit(bool bit) {
     // first cell is always 1
     dat = 1;
-    celldelay();
+//    celldelay();
     if (bit) {
         celldelay();
+        celldelay();
     } else {
         dat=0;
         celldelay();
@@ -46,6 +47,86 @@
     celldelay();
 }
 //*******************************************************************************
+void writebit1(bool bit) {
+    // first cell is always 1
+    dat1 = 1;
+//    celldelay();
+    if (bit) {
+        celldelay();
+        celldelay();
+    } else {
+        dat1=0;
+        celldelay();
+    }
+    // last cell is always 0
+    dat1=0;
+    celldelay();
+}
+//*******************************************************************************
+void writebit2(bool bit) {
+    // first cell is always 1
+    dat2 = 1;
+//    celldelay();
+    if (bit) {
+        celldelay();
+        celldelay();
+    } else {
+        dat2=0;
+        celldelay();
+    }
+    // last cell is always 0
+    dat2=0;
+    celldelay();
+}
+//*******************************************************************************
+void writebit3(bool bit) {
+    // first cell is always 1
+    dat3 = 1;
+//    celldelay();
+    if (bit) {
+        celldelay();
+        celldelay();
+    } else {
+        dat3=0;
+        celldelay();
+    }
+    // last cell is always 0
+    dat3=0;
+    celldelay();
+}
+//*******************************************************************************
+void writebit4(bool bit) {
+    // first cell is always 1
+    dat4 = 1;
+//    celldelay();
+    if (bit) {
+        celldelay();
+        celldelay();
+    } else {
+        dat4=0;
+        celldelay();
+    }
+    // last cell is always 0
+    dat4=0;
+    celldelay();
+}
+//*******************************************************************************
+void writebit5(bool bit) {
+    // first cell is always 1
+    dat5 = 1;
+//    celldelay();
+    if (bit) {
+        celldelay();
+        celldelay();
+    } else {
+        dat5=0;
+        celldelay();
+    }
+    // last cell is always 0
+    dat5=0;
+    celldelay();
+}
+//*******************************************************************************
 void write(uint8_t byte) {
     __disable_irq();
     for (int i=0; i<8; i++) {
@@ -55,6 +136,72 @@
             writebit(0);
         byte <<= 1;
     }
+
+    __enable_irq();
+}
+
+void write1(uint8_t byte) {
+    __disable_irq();
+    for (int i=0; i<8; i++) {
+        if (byte & 0x80)
+            writebit1(1);
+        else
+            writebit1(0);
+        byte <<= 1;
+    }
+
+    __enable_irq();
+}
+
+void write2(uint8_t byte) {
+    __disable_irq();
+    for (int i=0; i<8; i++) {
+        if (byte & 0x80)
+            writebit2(1);
+        else
+            writebit2(0);
+        byte <<= 1;
+    }
+
+    __enable_irq();
+}
+
+void write3(uint8_t byte) {
+    __disable_irq();
+    for (int i=0; i<8; i++) {
+        if (byte & 0x80)
+            writebit3(1);
+        else
+            writebit3(0);
+        byte <<= 1;
+    }
+
+    __enable_irq();
+}
+
+void write4(uint8_t byte) {
+    __disable_irq();
+    for (int i=0; i<8; i++) {
+        if (byte & 0x80)
+            writebit4(1);
+        else
+            writebit4(0);
+        byte <<= 1;
+    }
+
+    __enable_irq();
+}
+
+void write5(uint8_t byte) {
+    __disable_irq();
+    for (int i=0; i<8; i++) {
+        if (byte & 0x80)
+            writebit5(1);
+        else
+            writebit5(0);
+        byte <<= 1;
+    }
+
     __enable_irq();
 }
 
@@ -65,12 +212,49 @@
 //*******************************************************************************
 void show(void) {
     uint16_t i, nl3 = numLEDs * 3; // 3 bytes per LED
-    while (guardtime.read_us() < 50)
+    while (guardtime.read_us() < 50)    // was 50
         /* spin */;
     for (i=0; i<nl3; i++ ) {
         write(pixels[i]);
+ //       write1(pixels[i]);
+    }
+    guardtime.reset();
+
+    while (guardtime.read_us() < 50)    // was 50
+        /* spin */;
+    for (i=0; i<nl3; i++ ) {
+       write1(pixels[i]);
+    }
+    guardtime.reset();
+
+    while (guardtime.read_us() < 50)    // was 50
+        /* spin */;
+    for (i=0; i<nl3; i++ ) {
+       write2(pixels[i]);
     }
     guardtime.reset();
+
+    while (guardtime.read_us() < 50)    // was 50
+        /* spin */;
+    for (i=0; i<nl3; i++ ) {
+       write3(pixels[i]);
+    }
+    guardtime.reset();
+
+    while (guardtime.read_us() < 50)    // was 50
+        /* spin */;
+    for (i=0; i<nl3; i++ ) {
+       write4(pixels[i]);
+    }
+    guardtime.reset();
+
+    while (guardtime.read_us() < 50)    // was 50
+        /* spin */;
+    for (i=0; i<nl3; i++ ) {
+       write5(pixels[i]);
+    }
+    guardtime.reset();
+
 }
 //*******************************************************************************
 void blank(void) {
@@ -141,6 +325,15 @@
   }
 }
 //*******************************************************************************
+// Fill the dots one after the other with a color
+void colorAll(uint32_t c, uint8_t rwait) {
+  for(uint16_t i=0; i<numPixels(); i++) {
+      setPixelColor(i, c);
+  }
+  show();
+  wait_ms(rwait);
+}
+//*******************************************************************************
 // Input a value 0 to 255 to get a color value.
 // The colours are a transition r - g - b - back to r.
 uint32_t Wheel(int WheelPos) {
@@ -185,16 +378,22 @@
     setup();
     while (1) {
         pc.printf("Top of the Loop\n");
-        colorWipe(Color(64, 0, 0), 50); // Red
+        colorWipe(Color(255, 0, 0), 40); // Red
+        blankDelay(250);
+        colorWipe(Color(0, 255, 0), 40); // Grn
         blankDelay(250);
-        colorWipe(Color(0, 64, 0), 50); // Grn
+        colorWipe(Color(0, 0, 255), 40); // Blu
+        blankDelay(250);
+        colorAll(Color(255, 0, 0), 250);
         blankDelay(250);
-        colorWipe(Color(0, 0, 64), 50); // Blu
+        colorAll(Color(0, 255, 0), 250);
+        blankDelay(250);
+        colorAll(Color(0, 0, 255), 250);
         blankDelay(250);
-        //rainbow(20);
-        //blankDelay(250);
-        //rainbowCycle(10);
-        //blankDelay(250);
+        rainbow(20);
+        blankDelay(250);
+        rainbowCycle(5);
+        blankDelay(250);
         
     }
 }