see: http://mbed.org/users/okini3939/notebook/led_strip/

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LEDTape_HL1606.cpp Source File

LEDTape_HL1606.cpp

00001 /*
00002  * HL1606 tape led IC
00003  */
00004 #include "mbed.h"
00005 #include "LEDTape.h"
00006 
00007 #define PWM_STEP 64
00008 
00009 SPI tape(p11, p12, p13);
00010 DigitalOut latch(p14);
00011 
00012 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00013     LPC_SSP_TypeDef *_ssp = LPC_SSP0;
00014 #elif defined(TARGET_LPC11U24)
00015     LPC_SSPx_Type *_ssp = LPC_SSP1;
00016 #endif
00017 
00018 int num = 160;
00019 int *data;
00020 
00021 
00022 //#define tape_write(d) tape.write(d)
00023 #ifndef tape_write
00024 void tape_write (int d) {
00025     while (! (_ssp->SR & (1<<1))); // TNF
00026     _ssp->DR = d;
00027 }
00028 #endif
00029 
00030 extern "C"
00031 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00032 void SSP0_IRQHandler() {
00033 #elif defined(TARGET_LPC11U24)
00034 void SSP1_IRQHandler() {
00035 #endif
00036     static int addr = num - 1;
00037     static int pwm = 0;
00038     int d, dr, r, g, b;
00039 repeat:
00040     // led data
00041     while (_ssp->SR & (1<<1)) { // TNF
00042         d = data[addr];
00043         r = (d >> 16) & 0xff;
00044         g = (d >> 8) & 0xff;
00045         b = d & 0xff;
00046 
00047         dr = 0x80;
00048 #ifdef PWM_STEP
00049         if (r > pwm || r == 0xff) {
00050             dr |= 0x04;
00051         }
00052         if (g > pwm || g == 0xff) {
00053             dr |= 0x10;
00054         }
00055         if (b > pwm || b == 0xff) {
00056             dr |= 0x01;
00057         }
00058 #else
00059         if (r) {
00060             dr |= 0x04;
00061         }
00062         if (g) {
00063             dr |= 0x10;
00064         }
00065         if (b) {
00066             dr |= 0x01;
00067         }
00068 #endif
00069         _ssp->DR = dr;
00070 
00071         addr --;
00072         if (addr < 0) {
00073             addr = num - 1;
00074 #ifdef PWM_STEP
00075             pwm += PWM_STEP;
00076             if (pwm > 255) {
00077                 pwm = 0;
00078             }
00079 #endif
00080             while ((_ssp->SR & ((1<<4)|(1<<0))) != (1<<0)); // BSY, TFE
00081             latch = 1;
00082             wait_us(10);
00083             latch = 0;
00084             goto repeat;
00085         }
00086     }
00087 }
00088 
00089 void tapeInit (int freq, int n) {
00090 
00091     num = n;
00092     data = new int(num);
00093     for (int i = 0; i < num; i ++) {
00094         data[i] = 0;
00095     }
00096 
00097     tape.format(8, 0);
00098     latch = 0;
00099     if (freq) {
00100         tape.frequency(freq * 1000);
00101     } else {
00102         // 450KHz, higher speed = draw errors
00103         tape.frequency(450000);
00104     }
00105 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00106     NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
00107     NVIC_SetPriority(SSP0_IRQn, 0);
00108     NVIC_EnableIRQ(SSP0_IRQn);
00109 #elif defined(TARGET_LPC11U24)
00110     NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
00111     NVIC_SetPriority(SSP1_IRQn, 0);
00112     NVIC_EnableIRQ(SSP1_IRQn);
00113 #endif
00114     _ssp->IMSC |= (1<<3); // TXIM
00115 }
00116 
00117 void tapeSet (int n, int dat) {
00118     if (n < num) {
00119         data[n] = dat;
00120     }
00121 }
00122 
00123 void tapeSend () {
00124 }