![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Additional routines to provide multiple LED strip port connections.
Fork of WS2811_RY_A by
Revision 2:047d1e5230b8, committed 2013-04-08
- 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); } }