Simplistic code to test a couple WS2803 in series. WS2803 are 18 channel PWM constant current sources (sinks) normally used to drive 18 LEDs or 6 RGB LEDs.
Diff: main.cpp
- Revision:
- 0:0bf629429936
diff -r 000000000000 -r 0bf629429936 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Feb 14 04:59:29 2013 +0000 @@ -0,0 +1,79 @@ +// WS2803_Testing_MBED +// By Thomas Olson +// teo20130210.01 +// MBED LPC1768 +// WS2803 pin4 CKI -> ws2803_clockPin(p21) +// WS2803 pin5 SDI -> ws2803_dataPin(p22) + + +#include "mbed.h" + +DigitalOut ws2803_clockPin(p21); +DigitalOut ws2803_dataPin(p22); + +#define nLEDs 18 +#define nBARs 2 // Number of WS2803 chained together + +uint8_t ledBar[nBARs][nLEDs]; + +void shiftOut(uint8_t sodata) { + for(int i = 7; i >= 0; i--) { + ws2803_clockPin = 0; + if(sodata & (0x01 << i)){ + ws2803_dataPin = 1; + } else { + ws2803_dataPin = 0; + } + wait_us(1); + ws2803_clockPin = 1; + wait_us(1); + ws2803_clockPin = 0; + } +} + +void loadWS2803(){ + for(int wsBar = 0; wsBar < nBARs; wsBar++){ + for (int wsOut = 0; wsOut < nLEDs; wsOut++){ + shiftOut(ledBar[nBARs-(wsBar+1)][wsOut]); + } + } + ws2803_clockPin = 0; + wait_us(600); // 500us-600us needed to reset WS2803s +} + +void clearWS2803(){ + for(int wsOut = 0; wsOut < nLEDs; wsOut++){ + ledBar[0][wsOut] = ledBar[1][wsOut] = 0x00; + loadWS2803(); + } +} + +int main() { + // initialize WS2803s + ws2803_clockPin = 0; + wait_us(600); + + while(1) { + clearWS2803(); + wait(2.0); + // Chase mode + for(int iOut=7; iOut < 256; iOut*=2){ + for(int wsOut = 0; wsOut < nLEDs; wsOut++){ + ledBar[0][wsOut] = ledBar[1][wsOut] = (uint8_t)(0xFF & iOut); + loadWS2803(); + clearWS2803(); + } + } + + wait(2.0); + //parallel mode + for(int iOut = 7; iOut < 64; iOut*=4){ + for(int wsOut = 0; wsOut < nLEDs; wsOut++){ + ledBar[0][wsOut] = ledBar[1][wsOut] = (uint8_t)(0xFF & iOut); + loadWS2803(); + wait_us(1000000); + } + wait_us(10000); + } + }// while(1) +}