| 
 | 
3#
 
 
 樓主 |
發表於 2016-11-5 17:30:00
|
只看該作者
 
 
 
 本帖最後由 zasdfeer13 於 2016-11-6 16:54 編輯  
 
我之前有使用過他的library,但是我是打算使用48顆TLC5940串接去控制256顆RGB LED , 
 
他的library串接到第4顆之後就會有clock不足的問題, 
 
不知道是不是我使用的問題,我是希望可以透過SPI去提高傳送的速度 
 
但是這顆TLC5940最重要的GSCLK的控制,我還是一直搞不懂,下面是我的Code, 
 
參考外國的一個http://www.kevindarrah.com/downl ... imersCountersV6.ino的Code去改的 
 
但是它是透過UNO去控制,主要的Timer還有中斷的部分我沒有辦法理解,我只能照我理解的部分改成DUE能使用的,目前串到第5顆TLC的時候就會產生不對的閃爍,希望可以能找到完整的GSCLK的寫法。 
 
我們是透過串接48顆TLC5940跟2顆74595去控制16*16*16的LED立方體。 
下面是我目前的Code- #include <SPI.h>//Serial Peripheral Interface Library
 
 -  //****************************************************************************************************
 
  
-  //****************************************************************************************************
 
 -   byte ch=0, chbit=0, spibit=0, spibyte=0;// variables used by tlc sub routine
 
 -   int SINData;//variable used to shift data to the TLC
 
 -   byte transferbyte[1152];// bytes that are sent out to the tlc5940 via SPI
 
 -   // 48 because 16 channels @ 12bits gives 384bits, 384/8 = 48 bytes, 12 bit to 8 bit conversion
 
 -   int i, j, k, l=10,m,n,x=0; //misc variables
 
 -   int green, oldgreen= 2048;//for random animation
 
 -   int red, oldred = 2048;//for random animation
 
 -   int blue, oldblue = 2048;//for random animation
 
 -   int comeback=0, pick_color=0;//for random animation
 
 -   bool ledOn = false;
 
 - //************************************************************************************************** 開空間
 
 -   byte low_numberToDisplay[9]  = {0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
 
  
-   byte  high_numberToDisplay[9] = {0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
 
 -  //*************************************************************************************************
 
 - //************************************************************************************************* 74595
 
 -   byte channelR,channelG,channelB;
 
 -   char LEDZ=0;
 
 - //*************************************************************************************************
 
 -  
 
 -   //****************************************************************************************************
 
 -   #define XLAT (1<<25) //TLC 24  due2
 
 -   #define GSCLK (1<<28) //TLC 18 due 3
 
 -   #define SIN (1<<26)  //TLC 26  due75
 
 -   #define SCLK (1<<27) //TLC 25 due76
 
 -   #define BLANK (1<<25) //TLC 23  due5
 
  
-   //****************************************************************************************************
 
 -  
 
 -   //****************************************************************************************************
 
 - void setup(){//   MAIN SETUP   MAIN SETUP   MAIN SETUP   MAIN SETUP   MAIN SETUP
 
 -   REG_PIOB_OWER = XLAT; REG_PIOB_OER = XLAT;     
 
 -   REG_PIOA_OWER = SIN; REG_PIOA_OER = SIN;    
 
 -   REG_PIOA_OWER = SCLK; REG_PIOA_OER = SCLK;
 
 -   REG_PIOC_OWER = GSCLK; REG_PIOC_OER = GSCLK;
 
  
-   REG_PIOC_OWER = (1<<22); REG_PIOC_OER = (1<<22);//74595 latch
 
 -   REG_PIOD_OWER = (1<<8); REG_PIOD_OER = (1<<8);//74595clk
 
 -   REG_PIOD_OWER = (1<<7); REG_PIOD_OER = (1<<7);//74595data
 
 -   
 
 -   //Set up the SPI
 
 -   SPI.setBitOrder(MSBFIRST);//Most Significant Bit First
 
 -   SPI.setDataMode(SPI_MODE0);// Mode 0 Rising edge of data, keep clock low
 
 -   SPI.setClockDivider(3);//Run the data in at 84MHZ
 
 -  
 
 -   
 
 -   for(i=0; i<1152; i++)//clear out Gray Scale Data
 
 -   transferbyte[i]=0;   
 
 -   for(i=0; i<768; i++)//wipe out the data in tlc
 
 -   tlc(i, 0);// This is how you update the LEDs, tlc is a subroutine with two inputs
 
 -   // tlc(Channel, Value)  Channel in this case is 0-32 and value is 0-4095 duty cycle
 
 -   //4095 is 100% ON
 
 -   REG_PIOC_OWER = BLANK; REG_PIOC_OER = BLANK;//BLANK  We set this pin up here, so it remains in a high impedance
 
 -   // state throughout the setup, otherwise the LEDs go crazy!  even if you write this HIGH
 
  
 
 
-     
 
 - }// END OF SETUP END OF SETUP END OF SETUP END OF SETUP END OF SETUP END OF SETUP END OF SETUP
 
 -   //****************************************************************************************************
 
  
-   //****************************************************************************************************
 
 - void loop(){//   MAIN LOOP   MAIN LOOP   MAIN LOOP   MAIN LOOP   MAIN LOOP   MAIN LOOP
 
  
 
-     VccControl();
 
  
-    
 
 -     for(i=0;i<96;i++)
 
 -     {
 
 -      tlc(i,k); 
 
 -     }
 
 -     ID();
 
 -     
 
 -     
 
 -     /*k=k+l;
 
 -    if (k <= 0 || k >= 4090) {
 
 -     l = -l ;
 
 -   }*/
 
 -   
 
 -  
 
  
-   
 
  
 
- }//      loop close      loop close      loop close      loop close
 
 -   //****************************************************************************************************
 
  
-   //****************************************************************************************************
 
 - // INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS  
 
  
- // INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS   INTERRUPTS  
 
 -   //****************************************************************************************************
 
  
-   //****************************************************************************************************
 
 - void ID(){
 
 -   
 
 -   SPI.begin();// start the SPI back up
 
 -   for(SINData=1151; SINData>=0; SINData--)// send the data out!
 
 -   SPI.transfer(transferbyte[SINData]);// The SPI port only understands bytes-8 bits wide
 
 -   SPI.end();//end the SPI so we can write to the clock pin
 
 -  REG_PIOB_SODR = 0x1 << 25;// write XLAT HIGH to latch in data from the last data stream
 
 -  REG_PIOC_CODR = 0x1 << 25;// write blank LOW  to start the next cycle
 
 -  
 
 -  for(i=0;i<4096;i++){ 
 
 -     REG_PIOC_SODR = 0x1 << 28;
 
 -     REG_PIOC_CODR = 0x1 << 28;
 
 -     } 
 
 -  REG_PIOC_SODR = 0x1 << 25;//Blank goes HIGH to reset the 4096 counter in the TLC
 
 -  REG_PIOB_CODR = 0x1 << 25;//XLAT can go low now
 
 -   
 
 -   
 
 - }
 
 -   //****************************************************************************************************
 
  
-  
 
 - void tlc(int channel, int value){// TLC to UPDATE TLC to UPDATE TLC to UPDATE TLC to UPDATE
 
 - // This routine needs to happen as fast as possible!!!
 
 - //delayMicroseconds(10);//to control speed if necessary
 
 - //Limit check
 
 -   if(value>4095)
 
 -   value=4095;
 
 -   if(value<0)
 
 -   value=0;
 
 -   
 
 -    // We need to convert the 12 bit value into an 8 bit BYTE, the SPI can't write 12bits
 
 -    
 
 -    //We figure out where in all of the bytes to write to, so we don't have to waste time
 
 -    // updating everything
 
 -    
 
 -    //12 bits into bytes, a start of 12 bits will either at 0 or 4 in a byte
 
 -     spibit=0;
 
 -     if(bitRead(channel, 0))//if the read of the value is ODD, the start is at a 4
 
 -     spibit=4;
 
 -     
 
 -     //This is a simplification of channel * 12 bits / 8 bits
 
 -     spibyte = int(channel*3/2);//this assignes which byte the 12 bit value starts in
 
 -   
 
 -     for(chbit=0; chbit<12; chbit++, spibit++) // start right at where the update will go
 
 -     {         
 
 -         if(spibit==8)//during the 12 bit cycle, the limit of byte will be reached
 
 -         {
 
 -         spibyte++;//roll into the next byte
 
 -         spibit=0;//reset the bit count in the byte
 
 -         }
 
 -   
 
 -         
 
 -         if(bitRead(value, chbit))         //check the value for 1's and 0's
 
 -         {
 
 -            bitSet(transferbyte[spibyte], spibit);//transferbyte is what is written to the TLC
 
 -         }
 
 -         else
 
 -         {
 
 -            bitClear(transferbyte[spibyte], spibit);
 
 -         }
 
 -     }//0-12 bit loop
 
  
-   
 
 -   }//  END OF TLC WRITE  END OF TLC WRITE  END OF TLC WRITE  END OF TLC WRITE  END OF TLC WRITE
 
 -   //*******************************************************************************************
 
  
-  
 
 - void VccControl(){
 
 -   
 
 -  REG_PIOC_CODR = 0x1 << 22;//74595 LATCH LOW
 
 -   switch(LEDZ)
 
 -   { 
 
 -     case   0: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[1]);break;  
 
 -     case   1: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[2]);break;                 
 
 -     case   2: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[3]);break;  
 
 -     case   3: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[4]);break;
 
 -     case   4: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[5]);break;  
 
 -     case   5: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[6]);break;
 
 -     case   6: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[7]);break;  
 
 -     case   7: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[0]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[8]);break;
 
 -     case   8: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[1]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;  
 
 -     case   9: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[2]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;
 
 -     case  10: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[3]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;  
 
 -     case  11: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[4]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;
 
 -     case  12: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[5]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;  
 
 -     case  13: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[6]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;
 
 -     case  14: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[7]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break;  
 
 -     case  15: shiftOut(11, 12, MSBFIRST, high_numberToDisplay[8]); shiftOut(11, 12, MSBFIRST, low_numberToDisplay[0]);break; 
 
 -   }
 
 -   
 
 -   REG_PIOC_SODR = 0x1 << 22;//74595 LATCH HIGH
 
  
-   LEDZ++;
 
 -   if(LEDZ==16)
 
 -   {
 
 -     LEDZ=0;
 
 -   }
 
  
 
 
 
- }
 
  
  複製代碼 |   
 
 
 
 |