Suga koubou
/
LEDTape_WS2812
see: http://mbed.org/users/okini3939/notebook/led_strip/
Revision 0:d067ddfe3df9, committed 2013-07-08
- Comitter:
- okini3939
- Date:
- Mon Jul 08 01:34:51 2013 +0000
- Commit message:
- 1st build;
Changed in this revision
diff -r 000000000000 -r d067ddfe3df9 LEDStrip.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LEDStrip.h Mon Jul 08 01:34:51 2013 +0000 @@ -0,0 +1,5 @@ + +void tape_write (int d); +void tapeInit (int speed, int n); +void tapeSet (int n, int dat); +void tapeSend ();
diff -r 000000000000 -r d067ddfe3df9 LEDStrip_WS2812.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LEDStrip_WS2812.cpp Mon Jul 08 01:34:51 2013 +0000 @@ -0,0 +1,121 @@ +/* + * WS2812 tape led IC + * + * 0.35us 0.8us (+-150ns) + * 0: |^^^^^|__________| + * + * 0.7us 0.6us (+-150ns) + * 1: |^^^^^^^^^^|_____| + * + * >50us + * RESET: |________________| + */ +#include "mbed.h" +#include "LEDStrip.h" + +SPI tape(p11, p12, p13); + +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_SSP_TypeDef *_ssp = LPC_SSP0; +#elif defined(TARGET_LPC11U24) + LPC_SSPx_Type *_ssp = LPC_SSP1; +#endif + +int num = 100; +int *data; +volatile int busy = 0, wakeup = 0; + + +extern "C" +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) +void SSP0_IRQHandler() { +#elif defined(TARGET_LPC11U24) +void SSP1_IRQHandler() { +#endif + static int addr = 0, bit = 0x800000; +repeat: + if (busy) { + // led data + while (_ssp->SR & (1<<1)) { // TNF + if (data[addr] & bit) { + // 1 + _ssp->DR = 0x01f; + } else { + // 0 + _ssp->DR = 0x07f; + } + bit = bit >> 1; + if (bit == 0) { + bit = 0x800000; + addr ++; + if (addr >= num) { + addr = 0; + busy = 0; + goto repeat; + } + } + } + } else { + // blank + while (_ssp->SR & (1<<1)) { // TNF + _ssp->DR = 0xfff; + if (addr < 50) { + addr ++; + } else { + addr = 0; + if (wakeup) { + busy = 1; + wakeup = 0; + goto repeat; + } + } + } + } +} + +void tapeInit (int freq, int n) { + + num = n; +// data = new int(num); + data = (int*)malloc(sizeof(int) * num); + for (int i = 0; i < num; i ++) { + data[i] = 0; + } + + tape.format(10, 1); + if (freq) { + tape.frequency(freq * 1000); + } else { + tape.frequency(8000000); + } +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler); + NVIC_SetPriority(SSP0_IRQn, 0); + NVIC_EnableIRQ(SSP0_IRQn); +#elif defined(TARGET_LPC11U24) + NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler); + NVIC_SetPriority(SSP1_IRQn, 0); + NVIC_EnableIRQ(SSP1_IRQn); +#endif + _ssp->IMSC |= (1<<3); // TXIM +} + +void tapeSet (int n, int dat) { + if (n >= 0 && n < num) { + // RGB -> GRB + data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff); + } +} + +void tapeSend () { + if (busy) { + while (busy); + wait_us(50); + } + wakeup = 1; + while (wakeup); +} + +int tapeGet (int n) { + return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff); +}
diff -r 000000000000 -r d067ddfe3df9 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jul 08 01:34:51 2013 +0000 @@ -0,0 +1,44 @@ +/* + * WS2812 tape led IC + */ +#include "mbed.h" +#include "LEDStrip.h" + +Serial pc(USBTX, USBRX); +DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); + +extern "C" +void HardFault_Handler() { + printf("Hard Fault!\r\n"); + exit(-1); +} + +int main() { + int i, j, k = 0; + + pc.baud(115200); + tapeInit(0, 16); + led1 = 1; + + pc.printf("led\r\n"); + + for (;;) { + for (i = 0; i < 256; i ++) { + led2 = 1; + tapeSet(0, (i << 16)); + tapeSet(2, (i << 8)); + tapeSet(4, i); + tapeSet(6, (i << 8)|i); + tapeSet(7, (i << 16)|i); + tapeSet(8, (i << 16)|(i << 8)); + tapeSet(9, (i << 16)|(i << 8)|i); + tapeSend(); + led2 = 0; + wait_ms(20); + } + for (i = 0; i < 160; i ++) { + tapeSet(i, 0); + } + tapeSend(); + } +}
diff -r 000000000000 -r d067ddfe3df9 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jul 08 01:34:51 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/b3110cd2dd17 \ No newline at end of file