Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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); } }