mishkinis
Newbie level 4
Hi, I am trying to control individual RGB LEDs with the TLC5940 and PIC24HJ502 microcontroller. I am programming in C (MPLAB). I have googled all possible documentation on internet, datasheet, TI programming flowchart & demystifying TLC5940. Not much progress yet, most of examples are on Arduino. I have to use PIC24 and I haven't found good beginners examples for that. Anyway here is my code:
#include <p24HJ128GP502.h>
#include <libpic30.h>
#include <stdio.h>
#define VPRG LATBbits.LATB2
#define SCLK LATBbits.LATB3
#define SIN LATBbits.LATB4
#define XLAT LATBbits.LATB5
#define BLANK LATBbits.LATB6
#define GSCLK LATBbits.LATB7
unsigned char gsData[192] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 15 //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 14
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 13
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 12
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 11
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 10
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 9
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 8
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 7
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 6
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 5
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 4
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 3
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 1
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Channel 0
};
int Data_Counter,GSCLK_Counter,x,true,z;
unsigned int bright,brightness,FirstCycleFlag;
//char GS_DATA[
void main()
{
_PLLPRE = 0 ;// then N1 = 2. This yields a
_PLLDIV = 40; // then M = 32. This yields a
_PLLPOST = 0; // then N2 = 2. This provides
AD1PCFGL = 0xFFFF;
_TRISB2 = 0;
_TRISB3 = 0;
_TRISB4 = 0;
_TRISB5 = 0;
_TRISB6 = 0;
_TRISB7 = 0;
FirstCycleFlag=0;
true=1;
GSCLK=0;
SCLK=0;
VPRG=0;
XLAT=0;
BLANK=1;
while(1){
if (VPRG==true){
VPRG=0;
FirstCycleFlag=1;
}
else{
GSCLK_Counter=0;
Data_Counter=0;
BLANK=0;
}
if (GSCLK_Counter>4095){
BLANK = 1;
XLAT = 1;
XLAT = 0;
SCLK=1;
SCLK=0;
FirstCycleFlag = 0;
}
else if (Data_Counter>191){
if (gsData[Data_Counter]){
SIN =1;
}
else{
SIN=0;
SCLK=1;
SCLK=0;
Data_Counter++;
}
}
else{
GSCLK=1;
GSCLK=0;
GSCLK_Counter++;
}
}
}
Does anyone see what I am doing wrong? Or maybe someone has they own SIMPLEST explanation of how to control TLC5940
#include <p24HJ128GP502.h>
#include <libpic30.h>
#include <stdio.h>
#define VPRG LATBbits.LATB2
#define SCLK LATBbits.LATB3
#define SIN LATBbits.LATB4
#define XLAT LATBbits.LATB5
#define BLANK LATBbits.LATB6
#define GSCLK LATBbits.LATB7
unsigned char gsData[192] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 15 //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 14
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 13
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 12
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 11
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 10
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 9
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 8
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 7
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 6
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 5
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 4
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 3
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 1
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Channel 0
};
int Data_Counter,GSCLK_Counter,x,true,z;
unsigned int bright,brightness,FirstCycleFlag;
//char GS_DATA[
void main()
{
_PLLPRE = 0 ;// then N1 = 2. This yields a
_PLLDIV = 40; // then M = 32. This yields a
_PLLPOST = 0; // then N2 = 2. This provides
AD1PCFGL = 0xFFFF;
_TRISB2 = 0;
_TRISB3 = 0;
_TRISB4 = 0;
_TRISB5 = 0;
_TRISB6 = 0;
_TRISB7 = 0;
FirstCycleFlag=0;
true=1;
GSCLK=0;
SCLK=0;
VPRG=0;
XLAT=0;
BLANK=1;
while(1){
if (VPRG==true){
VPRG=0;
FirstCycleFlag=1;
}
else{
GSCLK_Counter=0;
Data_Counter=0;
BLANK=0;
}
if (GSCLK_Counter>4095){
BLANK = 1;
XLAT = 1;
XLAT = 0;
SCLK=1;
SCLK=0;
FirstCycleFlag = 0;
}
else if (Data_Counter>191){
if (gsData[Data_Counter]){
SIN =1;
}
else{
SIN=0;
SCLK=1;
SCLK=0;
Data_Counter++;
}
}
else{
GSCLK=1;
GSCLK=0;
GSCLK_Counter++;
}
}
}
Does anyone see what I am doing wrong? Or maybe someone has they own SIMPLEST explanation of how to control TLC5940