Suga koubou
/
LEDTape_HL1606
see: http://mbed.org/users/okini3939/notebook/led_strip/
LEDTape_HL1606.cpp@0:6fc9fe87e0c5, 2013-07-08 (annotated)
- Committer:
- okini3939
- Date:
- Mon Jul 08 01:36:53 2013 +0000
- Revision:
- 0:6fc9fe87e0c5
1st build
Who changed what in which revision?
User | Revision | Line number | New 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 | } |