add new dot correction method

Fork of TLC5940 by suu pen

Committer:
motoi1484
Date:
Thu Jul 26 16:14:47 2012 +0000
Revision:
1:be9daf113060
Parent:
0:ead2ebe1dc77
add new dot correction method

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:ead2ebe1dc77 1 //==========================================================
suupen 0:ead2ebe1dc77 2 //
suupen 0:ead2ebe1dc77 3 // TLC5940.cpp
suupen 0:ead2ebe1dc77 4 // TLC5940(Texas Instruments 16 channel led driver with dot correction and grayscale pwm control)
suupen 0:ead2ebe1dc77 5 // http://datasheet.octopart.com/TLC5940NT-Texas-Instruments-datasheet-121738.pdf
suupen 0:ead2ebe1dc77 6 //==========================================================
suupen 0:ead2ebe1dc77 7 #define _TLC5940_C
suupen 0:ead2ebe1dc77 8
suupen 0:ead2ebe1dc77 9 #include "types.h"
suupen 0:ead2ebe1dc77 10 #include "mbed.h"
suupen 0:ead2ebe1dc77 11 #include "TLC5940.h"
suupen 0:ead2ebe1dc77 12
suupen 0:ead2ebe1dc77 13
suupen 0:ead2ebe1dc77 14
suupen 0:ead2ebe1dc77 15
suupen 0:ead2ebe1dc77 16 /** DC motor direct drive object connected to the specified DigtalOutput pin
suupen 0:ead2ebe1dc77 17 */
suupen 0:ead2ebe1dc77 18 TLC5940::TLC5940(PinName mosi, PinName miso, PinName sck, PinName xlat, PinName blank, PinName vprg, uint8_t cascade) :
suupen 0:ead2ebe1dc77 19 _spi(mosi, miso, sck), _xlat(xlat), _blank(blank), _vprg(vprg){
suupen 0:ead2ebe1dc77 20
suupen 0:ead2ebe1dc77 21 _xlat = 0;
suupen 0:ead2ebe1dc77 22 _blank = 0;
suupen 0:ead2ebe1dc77 23 _vprg = 0;
suupen 0:ead2ebe1dc77 24
suupen 0:ead2ebe1dc77 25 D_cascade = cascade;
suupen 0:ead2ebe1dc77 26
suupen 0:ead2ebe1dc77 27 tlc5940DotCorrection();
suupen 0:ead2ebe1dc77 28 tlc5940SpiInitalize();
suupen 0:ead2ebe1dc77 29 tlc5940GrayDataClear();
suupen 0:ead2ebe1dc77 30 }
suupen 0:ead2ebe1dc77 31
suupen 0:ead2ebe1dc77 32 /******************************************************************************
suupen 0:ead2ebe1dc77 33 Name : TLC5940 dot correction initalize
suupen 0:ead2ebe1dc77 34 Parameters : none
suupen 0:ead2ebe1dc77 35 Returns : nothing
suupen 0:ead2ebe1dc77 36 Description:
suupen 0:ead2ebe1dc77 37 ******************************************************************************/
suupen 0:ead2ebe1dc77 38 void TLC5940::tlc5940DotCorrection(void) {
suupen 0:ead2ebe1dc77 39 _vprg = 1;
suupen 0:ead2ebe1dc77 40 _spi.format(6,0);
suupen 0:ead2ebe1dc77 41 _spi.frequency(Z_clockFrequency);
suupen 0:ead2ebe1dc77 42
suupen 0:ead2ebe1dc77 43
suupen 0:ead2ebe1dc77 44 // _vprg = 1;
suupen 0:ead2ebe1dc77 45
suupen 0:ead2ebe1dc77 46 for (int i = 0; i < (16 * D_cascade); i++) {
suupen 0:ead2ebe1dc77 47 int whoami = _spi.write(Z_dotCorrection);
suupen 0:ead2ebe1dc77 48 }
motoi1484 1:be9daf113060 49
suupen 0:ead2ebe1dc77 50 _xlat = 1;
motoi1484 1:be9daf113060 51 wait_us(5);
suupen 0:ead2ebe1dc77 52 _xlat = 0;
motoi1484 1:be9daf113060 53 wait_us(5);
motoi1484 1:be9daf113060 54 _vprg = 0;
motoi1484 1:be9daf113060 55 wait_us(10);
suupen 0:ead2ebe1dc77 56 }
suupen 0:ead2ebe1dc77 57
suupen 0:ead2ebe1dc77 58 /******************************************************************************
suupen 0:ead2ebe1dc77 59 Name : SPI Initalize (for TLC5960 control)
suupen 0:ead2ebe1dc77 60 Parameters : none
suupen 0:ead2ebe1dc77 61 Returns : nothing
suupen 0:ead2ebe1dc77 62 Description:
suupen 0:ead2ebe1dc77 63 ******************************************************************************/
suupen 0:ead2ebe1dc77 64 void TLC5940::tlc5940SpiInitalize(void) {
suupen 0:ead2ebe1dc77 65 _spi.format(12,0);
suupen 0:ead2ebe1dc77 66 _spi.frequency(Z_clockFrequency);
suupen 0:ead2ebe1dc77 67
suupen 0:ead2ebe1dc77 68 _vprg = 0;
suupen 0:ead2ebe1dc77 69 }
suupen 0:ead2ebe1dc77 70
suupen 0:ead2ebe1dc77 71 /******************************************************************************
suupen 0:ead2ebe1dc77 72 Name : TLC5940 Gray Data clear
suupen 0:ead2ebe1dc77 73 Parameters : none
suupen 0:ead2ebe1dc77 74 Returns : nothing
suupen 0:ead2ebe1dc77 75 Description:
suupen 0:ead2ebe1dc77 76 ******************************************************************************/
suupen 0:ead2ebe1dc77 77 void TLC5940::tlc5940GrayDataClear(void) {
suupen 0:ead2ebe1dc77 78
suupen 0:ead2ebe1dc77 79 _vprg = 0;
suupen 0:ead2ebe1dc77 80
suupen 0:ead2ebe1dc77 81 for (int i = 0; i < (16 * D_cascade); i++) {
suupen 0:ead2ebe1dc77 82 int whoami = _spi.write(0);
suupen 0:ead2ebe1dc77 83 }
suupen 0:ead2ebe1dc77 84
suupen 0:ead2ebe1dc77 85 _xlat = 1;
suupen 0:ead2ebe1dc77 86 _xlat = 0;
suupen 0:ead2ebe1dc77 87 }
suupen 0:ead2ebe1dc77 88
motoi1484 1:be9daf113060 89 /********************************************************
motoi1484 1:be9daf113060 90 dotCorrection
motoi1484 1:be9daf113060 91 **********************************************************/
motoi1484 1:be9daf113060 92 void TLC5940::dotCorrection(uint8_t *data)
motoi1484 1:be9daf113060 93 {
motoi1484 1:be9daf113060 94 _vprg = 1;
motoi1484 1:be9daf113060 95 _spi.format(6,0);
motoi1484 1:be9daf113060 96 _spi.frequency(Z_clockFrequency);
motoi1484 1:be9daf113060 97
motoi1484 1:be9daf113060 98 int8_t x = 0;
motoi1484 1:be9daf113060 99
motoi1484 1:be9daf113060 100 for(uint8_t C_cascade = 1; C_cascade <= D_cascade; C_cascade++){
motoi1484 1:be9daf113060 101 for(x = 0; x < 16; x++){
motoi1484 1:be9daf113060 102 _spi.write((uint8_t)*(data + (16 * (D_cascade - C_cascade)) + (15 - x)));
motoi1484 1:be9daf113060 103 }
motoi1484 1:be9daf113060 104 }
motoi1484 1:be9daf113060 105
motoi1484 1:be9daf113060 106
motoi1484 1:be9daf113060 107 _xlat = 1;
motoi1484 1:be9daf113060 108 wait_us(5);
motoi1484 1:be9daf113060 109 _xlat = 0;
motoi1484 1:be9daf113060 110 wait_us(5);
motoi1484 1:be9daf113060 111 _vprg = 0;
motoi1484 1:be9daf113060 112 wait_us(10);
motoi1484 1:be9daf113060 113
motoi1484 1:be9daf113060 114 _spi.format(12,0);
motoi1484 1:be9daf113060 115 _spi.frequency(Z_clockFrequency);
motoi1484 1:be9daf113060 116 }
motoi1484 1:be9daf113060 117
suupen 0:ead2ebe1dc77 118 /**************************************
suupen 0:ead2ebe1dc77 119 * main
suupen 0:ead2ebe1dc77 120 **************************************/
suupen 0:ead2ebe1dc77 121 void TLC5940::grayDataSetAndDisplay(uint16_t *data) {
suupen 0:ead2ebe1dc77 122
suupen 0:ead2ebe1dc77 123 // *data = &D_grayScale[][]
suupen 0:ead2ebe1dc77 124 // D_grayScale[cascade][16]; // [][0] = out0, [][1] = out1, ... ,[][14] = out15
suupen 0:ead2ebe1dc77 125 // [x][x].11,[x][x].10, ... ,[x][x].1,[x][x].0 = (xxxx xxxx xxxxb) 1gray scale data
suupen 0:ead2ebe1dc77 126
suupen 0:ead2ebe1dc77 127 // [0][0] [0][1] [0][14] [0][15] [1][0] [1][1] [1][14] [1][15] [20][0] 20][1] [20][14] [20][15]
suupen 0:ead2ebe1dc77 128 // | | ... | | | | ... | | | | ... | |
suupen 0:ead2ebe1dc77 129 // ----------------------------------| ------------------------------------| ------------------------------------|
suupen 0:ead2ebe1dc77 130 // | out0 1 ... 14 15 |-----------| out0 1 ... 14 15 |-----......------| out0 1 ... 14 15 |
suupen 0:ead2ebe1dc77 131 // |TLC5940 (cascade = 1) | |TLC5940 (cascade = 2) | |TLC5940 (cascade = 21) |
suupen 0:ead2ebe1dc77 132 // ----------------------------------- ------------------------------------- -------------------------------------
suupen 0:ead2ebe1dc77 133 //
suupen 0:ead2ebe1dc77 134
suupen 0:ead2ebe1dc77 135
suupen 0:ead2ebe1dc77 136 int8_t x; // display data no x 0 - 15
suupen 0:ead2ebe1dc77 137
suupen 0:ead2ebe1dc77 138 #define Z_GSCLKNUM (340) // GRAYSCALE PWM sousin yo clock 4096(PWM) / 12bit(sousin) = 341
suupen 0:ead2ebe1dc77 139 #define Z_GRAYDATA (16 * D_cascade)
suupen 0:ead2ebe1dc77 140
suupen 0:ead2ebe1dc77 141
suupen 0:ead2ebe1dc77 142 _blank = 1;
suupen 0:ead2ebe1dc77 143 _blank = 0;
suupen 0:ead2ebe1dc77 144
suupen 0:ead2ebe1dc77 145
suupen 0:ead2ebe1dc77 146
suupen 0:ead2ebe1dc77 147
suupen 0:ead2ebe1dc77 148 _vprg = 0;
suupen 0:ead2ebe1dc77 149
suupen 0:ead2ebe1dc77 150 for(int i = 0; i < (Z_GSCLKNUM - Z_GRAYDATA); i++){
suupen 0:ead2ebe1dc77 151 // grayscale pwm clock only
suupen 0:ead2ebe1dc77 152 _spi.write(0);
suupen 0:ead2ebe1dc77 153 }
suupen 0:ead2ebe1dc77 154
suupen 0:ead2ebe1dc77 155 // grayscale pwm clock & color data clock
suupen 0:ead2ebe1dc77 156 // green data send
suupen 0:ead2ebe1dc77 157 for(uint8_t C_cascade = 1; C_cascade <= D_cascade; C_cascade++){
suupen 0:ead2ebe1dc77 158 for(x = 0; x < 16; x++){
suupen 0:ead2ebe1dc77 159 _spi.write((uint16_t)*(data + (16 * (D_cascade - C_cascade)) + (15 - x)));
suupen 0:ead2ebe1dc77 160 }
suupen 0:ead2ebe1dc77 161 }
suupen 0:ead2ebe1dc77 162
suupen 0:ead2ebe1dc77 163
suupen 0:ead2ebe1dc77 164 _xlat = 1;
suupen 0:ead2ebe1dc77 165 _xlat = 0;
suupen 0:ead2ebe1dc77 166
suupen 0:ead2ebe1dc77 167 }
suupen 0:ead2ebe1dc77 168
suupen 0:ead2ebe1dc77 169