Go Down

Topic: 5940 code wont verify (Read 918 times) previous topic - next topic

mrgizmo

Im using some code to sequence 16 rgb leds using 3 5940 on an led painter board, the original program was to sequence 45 leds but I cant seem to get it to verify. Im really new at this, I've done a few led experiments, steppers and servos, but this one is a bit more complex.
Code: [Select]

/*Ti 5940 16-port LED driver
= overlapped fade across 48 LEDs at a low background level
* Peter Mackey  June 2007  Pratt Digital Arts  pmackey@pratt.edu
* direct adressing to PORTB, smooth flickerless fading (thanks to Amp on the Arduino forum)
* additional logic from David Cuartielles's & Marcus Hannerstig's LEDdriver demo
= see the TLC5940 data sheet for the logic behind these pulse sequences
*/

//using the pin codes on the TLC5940NT to name the Arduino ports
#define VPRG 2 //"chip pin 27 to Arduino pin 2"
#define SIN 3
#define SCLK 7
#define XLAT 4
#define BLANK 5
#define DCPRG 6
#define GSCLK 8 //note: but using PORTB method

#define MSINTRVL 0 //could be used to delay updating of incrementFades()
#define FADEMIN 100 //lowest fade level LEDs will reach (min would be 0, max 4065)
#define FADEINCR 64   //determines how many steps it takes to run the desired range (lower=longer)

int fadeLevel[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //stores a level for each of 48 ports
int faderNdx = 0;  //counter used in this fading sequence

int fadeState[] = {
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //stores the direction of fading for each port 1,0,-1
//start with first port

int next; //used for limit checking in fading function
float prevMillis; //used for a timing delay

int word[] = {
  0,0,0,0,0,0,0,0,0,0,0,0}; //temp storage for reversing bits in a word (for greyscale setting)

void setup() {
  pinMode(VPRG, OUTPUT);   
  pinMode(SIN, OUTPUT);   
  pinMode(SCLK, OUTPUT);
  pinMode(XLAT, OUTPUT);   
  pinMode(BLANK, OUTPUT);   
  pinMode(DCPRG, OUTPUT);   
  pinMode(GSCLK, OUTPUT);       //could also set DDRB directly

  beginSerial(9600); //in case of debugging
  Serial.println("Ready...");

  preset();    //input ?Dot Correction? data
}

void loop () {
  setGreys();
  feedPorts();   
  if (millis() > (prevMillis+MSINTRVL)){
    incrementFades();
    prevMillis=millis();
  }
}

void incrementFades() {
  //a very particular sequence: fade up from LED 0 to 15 then fade down in same direction
  //overlaps incoming&outgoing adjacent ports' fade level

  for (faderNdx=0; faderNdx<=15; faderNdx++) {

    if (fadeState[faderNdx]!=0) {  //if the state for this LED is not 0...
      if (fadeState[faderNdx]==1) {  //then fade up...
        next = fadeLevel[faderNdx]+FADEINCR; 
        if (next<4095) {
          fadeLevel[faderNdx] = next; //...by incrementing the value in the fadeLevel array
        }
        else {  //set the state for this LED to fade down
          fadeLevel[faderNdx] = 4095; //be sure is at "max level"
          fadeState[faderNdx] = -1; //flip my sign
          //AND...make next neighbor begin a fade up
          if (faderNdx<15) {
            fadeState[faderNdx+1] = 1;
          }
          else {
            fadeState[0] = 1;
          }
        }//------------------------------------------------
      } //end fading up

      else { //fade down instead...........................
        next = fadeLevel[faderNdx]-FADEINCR;
        if (next>=FADEMIN) { //-----------------
          fadeLevel[faderNdx] = next;
        }
        else { 
          //set me to fade down
          fadeLevel[faderNdx] = FADEMIN; //be sure at minimum level
          fadeState[faderNdx] = 0; //stop fading me until neighbor sets me to fade up
        }//------------------------------------------------
      }//end fading down
     
    }//end check for state not 0
  }// end of cycle thru each port
}

//=======5940 control======================================

void setGreys()  {
  //data for each port (12 bit word * 16 ports =192 bits in this loop)...
  //read the fadeLevel array
  for (int i=15; i>=0; i--) { // ports, count DOWN
    int datb = fadeLevel[i];   

    //load fade level bits into the temp array BACKWARDS
    for (int j=11; j>=0; j--) {
      word[j]=(datb & 1); //& bitwise AND
      datb >>= 1;        //shift right and assign
      // (maybe there's a slicker way to do this!? but this works...)
    }
    //send the data to the 5940
    for (int j=0; j<12; j++) {
      digitalWrite(SIN,word[j]); 
      pulseSCLK();
    } 
  } 
  digitalWrite(XLAT, HIGH);
  digitalWrite(XLAT, LOW);
}

void feedPorts() {
  //The actual sequencing of the PWM data into the LEDs, must do constantly...
  digitalWrite(BLANK, HIGH);   
  digitalWrite(BLANK, LOW); //=all outputs ON, start PWM cycle

  for (int i=0; i<4096; i++) {
    pulseGSCLK();
  }
}

//DOT CORRECTION...do once
void preset() {
  //Input ?DotCorrex? Data
  //16 outputs, 64 posssible levels of adjustment, 6 bits/chan = 96 bits total
  //[use if any LEDs in array are physically too bright]

  digitalWrite(DCPRG, HIGH); //leaving it H is my arbitrary choice (="write to register not EEPROM") 
  digitalWrite(VPRG, HIGH);     //=inputting data into dot correx register

  digitalWrite(BLANK, HIGH); //=all outputs off, when this goes high it resets the greyscale counter
  digitalWrite(SIN, LOW);       //to start dot correction
  digitalWrite(XLAT, LOW);

  //begin loading in the dot correx data, most significant bit first...
  //but here we are not correcting anything, so LSB is going first!
  for (int i=0; i<16; i++) { //16 ports
    for (int j=0; j<6; j++) { //6 bits of data for each port
      digitalWrite(SIN, HIGH); //for now, 111111 for everybody
      pulseSCLK();
      digitalWrite(SIN, LOW);
    }
  }

  //----doing the FIRST GREYSCALE SETTING here becuz of the unique 193rd clock pulse

  digitalWrite(XLAT, HIGH);   //latch the dot data into the dot correx register
  digitalWrite(XLAT, LOW);
  digitalWrite(VPRG, LOW);    //entering greyscale mode

  for (int i=0; i<16; i++) { //16 ports
    int datb = 4095;        //using same fade level for all ports this first time

    for (int j=0; j<12; j++) { //data for each port, all the same value to start
      digitalWrite(SIN, datb & 01);
      pulseSCLK();
      datb>>=1;
    } 
  } 
  digitalWrite(XLAT, HIGH);  //latch the greyscale data
  digitalWrite(XLAT, LOW);
  pulseSCLK();               //193rd clock pulse only need to do the FIRST time after dot correx

  digitalWrite(BLANK, LOW);  //=all outputs ON, start PWM cycle... moved here
}

//SCLK used in dot correx and greyscale setting
void pulseSCLK() {
  digitalWrite(SCLK, HIGH);
  digitalWrite(SCLK, LOW);
}

void pulseGSCLK() {
  //ultra fast pulse trick, using digitalWrite caused flickering
  PORTB=0x01; //bring PORTB0 high (pin 8), other ports go low [0x01 does only pin 8, 0x21 also lifts pin 13]
  //16nanosecs is the min pulse width for the 5940, but no pause seems needed here
  PORTB=0x20;  //keep pin13 high [0x00 would be all low]
}


any ideas or help would be appreciated.

dxw00d

Code: [Select]
int word[] = {
  0,0,0,0,0,0,0,0,0,0,0,0}; //temp storage for reversing bits in a word (for greyscale setting)


word is a reserved word. You'll need to rename that array.

Code: [Select]
  beginSerial(9600); //in case of debugging

Needs replacing with:

Code: [Select]
  Serial.begin(9600); //in case of debugging

johnwasser

You can just change 'word' to 'words' in the few places it's used.
Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

mrgizmo

Thanks, so far so good.  hooked up the board to the led painter board and nothing happened. Ill have to check everything out and try again.

mrgizmo

#4
Oct 28, 2012, 02:54 am Last Edit: Oct 28, 2012, 02:57 am by mrgizmo Reason: 1
    Well I'm not sure what im doing wrong, I wired the arduino to the led painter per the sketch applied 12V to the painter power inputs and vcc/grd to the arduino.  No lights working at all on the painter.

James C4S

Why aren't you using the TLC5940 library?
Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

mrgizmo


James C4S

http://www.arduino.cc/playground/learning/TLC5940
Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

Go Up