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

Dependencies:   mbed

Committer:
okini3939
Date:
Mon Jul 08 01:36:53 2013 +0000
Revision:
0:6fc9fe87e0c5
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:6fc9fe87e0c5 1 /*
okini3939 0:6fc9fe87e0c5 2 * HL1606 tape led IC
okini3939 0:6fc9fe87e0c5 3 */
okini3939 0:6fc9fe87e0c5 4 #include "mbed.h"
okini3939 0:6fc9fe87e0c5 5 #include "LEDTape.h"
okini3939 0:6fc9fe87e0c5 6
okini3939 0:6fc9fe87e0c5 7 #define PWM_STEP 64
okini3939 0:6fc9fe87e0c5 8
okini3939 0:6fc9fe87e0c5 9 SPI tape(p11, p12, p13);
okini3939 0:6fc9fe87e0c5 10 DigitalOut latch(p14);
okini3939 0:6fc9fe87e0c5 11
okini3939 0:6fc9fe87e0c5 12 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:6fc9fe87e0c5 13 LPC_SSP_TypeDef *_ssp = LPC_SSP0;
okini3939 0:6fc9fe87e0c5 14 #elif defined(TARGET_LPC11U24)
okini3939 0:6fc9fe87e0c5 15 LPC_SSPx_Type *_ssp = LPC_SSP1;
okini3939 0:6fc9fe87e0c5 16 #endif
okini3939 0:6fc9fe87e0c5 17
okini3939 0:6fc9fe87e0c5 18 int num = 160;
okini3939 0:6fc9fe87e0c5 19 int *data;
okini3939 0:6fc9fe87e0c5 20
okini3939 0:6fc9fe87e0c5 21
okini3939 0:6fc9fe87e0c5 22 //#define tape_write(d) tape.write(d)
okini3939 0:6fc9fe87e0c5 23 #ifndef tape_write
okini3939 0:6fc9fe87e0c5 24 void tape_write (int d) {
okini3939 0:6fc9fe87e0c5 25 while (! (_ssp->SR & (1<<1))); // TNF
okini3939 0:6fc9fe87e0c5 26 _ssp->DR = d;
okini3939 0:6fc9fe87e0c5 27 }
okini3939 0:6fc9fe87e0c5 28 #endif
okini3939 0:6fc9fe87e0c5 29
okini3939 0:6fc9fe87e0c5 30 extern "C"
okini3939 0:6fc9fe87e0c5 31 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:6fc9fe87e0c5 32 void SSP0_IRQHandler() {
okini3939 0:6fc9fe87e0c5 33 #elif defined(TARGET_LPC11U24)
okini3939 0:6fc9fe87e0c5 34 void SSP1_IRQHandler() {
okini3939 0:6fc9fe87e0c5 35 #endif
okini3939 0:6fc9fe87e0c5 36 static int addr = num - 1;
okini3939 0:6fc9fe87e0c5 37 static int pwm = 0;
okini3939 0:6fc9fe87e0c5 38 int d, dr, r, g, b;
okini3939 0:6fc9fe87e0c5 39 repeat:
okini3939 0:6fc9fe87e0c5 40 // led data
okini3939 0:6fc9fe87e0c5 41 while (_ssp->SR & (1<<1)) { // TNF
okini3939 0:6fc9fe87e0c5 42 d = data[addr];
okini3939 0:6fc9fe87e0c5 43 r = (d >> 16) & 0xff;
okini3939 0:6fc9fe87e0c5 44 g = (d >> 8) & 0xff;
okini3939 0:6fc9fe87e0c5 45 b = d & 0xff;
okini3939 0:6fc9fe87e0c5 46
okini3939 0:6fc9fe87e0c5 47 dr = 0x80;
okini3939 0:6fc9fe87e0c5 48 #ifdef PWM_STEP
okini3939 0:6fc9fe87e0c5 49 if (r > pwm || r == 0xff) {
okini3939 0:6fc9fe87e0c5 50 dr |= 0x04;
okini3939 0:6fc9fe87e0c5 51 }
okini3939 0:6fc9fe87e0c5 52 if (g > pwm || g == 0xff) {
okini3939 0:6fc9fe87e0c5 53 dr |= 0x10;
okini3939 0:6fc9fe87e0c5 54 }
okini3939 0:6fc9fe87e0c5 55 if (b > pwm || b == 0xff) {
okini3939 0:6fc9fe87e0c5 56 dr |= 0x01;
okini3939 0:6fc9fe87e0c5 57 }
okini3939 0:6fc9fe87e0c5 58 #else
okini3939 0:6fc9fe87e0c5 59 if (r) {
okini3939 0:6fc9fe87e0c5 60 dr |= 0x04;
okini3939 0:6fc9fe87e0c5 61 }
okini3939 0:6fc9fe87e0c5 62 if (g) {
okini3939 0:6fc9fe87e0c5 63 dr |= 0x10;
okini3939 0:6fc9fe87e0c5 64 }
okini3939 0:6fc9fe87e0c5 65 if (b) {
okini3939 0:6fc9fe87e0c5 66 dr |= 0x01;
okini3939 0:6fc9fe87e0c5 67 }
okini3939 0:6fc9fe87e0c5 68 #endif
okini3939 0:6fc9fe87e0c5 69 _ssp->DR = dr;
okini3939 0:6fc9fe87e0c5 70
okini3939 0:6fc9fe87e0c5 71 addr --;
okini3939 0:6fc9fe87e0c5 72 if (addr < 0) {
okini3939 0:6fc9fe87e0c5 73 addr = num - 1;
okini3939 0:6fc9fe87e0c5 74 #ifdef PWM_STEP
okini3939 0:6fc9fe87e0c5 75 pwm += PWM_STEP;
okini3939 0:6fc9fe87e0c5 76 if (pwm > 255) {
okini3939 0:6fc9fe87e0c5 77 pwm = 0;
okini3939 0:6fc9fe87e0c5 78 }
okini3939 0:6fc9fe87e0c5 79 #endif
okini3939 0:6fc9fe87e0c5 80 while ((_ssp->SR & ((1<<4)|(1<<0))) != (1<<0)); // BSY, TFE
okini3939 0:6fc9fe87e0c5 81 latch = 1;
okini3939 0:6fc9fe87e0c5 82 wait_us(10);
okini3939 0:6fc9fe87e0c5 83 latch = 0;
okini3939 0:6fc9fe87e0c5 84 goto repeat;
okini3939 0:6fc9fe87e0c5 85 }
okini3939 0:6fc9fe87e0c5 86 }
okini3939 0:6fc9fe87e0c5 87 }
okini3939 0:6fc9fe87e0c5 88
okini3939 0:6fc9fe87e0c5 89 void tapeInit (int freq, int n) {
okini3939 0:6fc9fe87e0c5 90
okini3939 0:6fc9fe87e0c5 91 num = n;
okini3939 0:6fc9fe87e0c5 92 data = new int(num);
okini3939 0:6fc9fe87e0c5 93 for (int i = 0; i < num; i ++) {
okini3939 0:6fc9fe87e0c5 94 data[i] = 0;
okini3939 0:6fc9fe87e0c5 95 }
okini3939 0:6fc9fe87e0c5 96
okini3939 0:6fc9fe87e0c5 97 tape.format(8, 0);
okini3939 0:6fc9fe87e0c5 98 latch = 0;
okini3939 0:6fc9fe87e0c5 99 if (freq) {
okini3939 0:6fc9fe87e0c5 100 tape.frequency(freq * 1000);
okini3939 0:6fc9fe87e0c5 101 } else {
okini3939 0:6fc9fe87e0c5 102 // 450KHz, higher speed = draw errors
okini3939 0:6fc9fe87e0c5 103 tape.frequency(450000);
okini3939 0:6fc9fe87e0c5 104 }
okini3939 0:6fc9fe87e0c5 105 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:6fc9fe87e0c5 106 NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
okini3939 0:6fc9fe87e0c5 107 NVIC_SetPriority(SSP0_IRQn, 0);
okini3939 0:6fc9fe87e0c5 108 NVIC_EnableIRQ(SSP0_IRQn);
okini3939 0:6fc9fe87e0c5 109 #elif defined(TARGET_LPC11U24)
okini3939 0:6fc9fe87e0c5 110 NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
okini3939 0:6fc9fe87e0c5 111 NVIC_SetPriority(SSP1_IRQn, 0);
okini3939 0:6fc9fe87e0c5 112 NVIC_EnableIRQ(SSP1_IRQn);
okini3939 0:6fc9fe87e0c5 113 #endif
okini3939 0:6fc9fe87e0c5 114 _ssp->IMSC |= (1<<3); // TXIM
okini3939 0:6fc9fe87e0c5 115 }
okini3939 0:6fc9fe87e0c5 116
okini3939 0:6fc9fe87e0c5 117 void tapeSet (int n, int dat) {
okini3939 0:6fc9fe87e0c5 118 if (n < num) {
okini3939 0:6fc9fe87e0c5 119 data[n] = dat;
okini3939 0:6fc9fe87e0c5 120 }
okini3939 0:6fc9fe87e0c5 121 }
okini3939 0:6fc9fe87e0c5 122
okini3939 0:6fc9fe87e0c5 123 void tapeSend () {
okini3939 0:6fc9fe87e0c5 124 }