Ir ao conteúdo
  • Cadastre-se

MATRIZ de LED com PIC


Posts recomendados

É somente um hello world mas ta aí:

[ame=https://www.youtube.com/watch?v=14PNegc5Yq0]teste de funcionamento TLC5940 - YouTube[/ame]

valeu!!

Caso alguém se interesse aí vão os arquivos que usei (o driver não sei de quem é o crédito)

driver: tlc5940.c


#define SIN pin_B1
#define SCLK pin_B2
#define XLAT pin_B3
#define BLANK pin_B4
#define DCPRG pin_B5
#define GSCLK pin_B6 //aterrado


#byte PORTB = 0xF81


unsigned char dcData[96] =
{
1, 1, 1, 1, 1, 1, // Ch 15
1, 1, 1, 1, 1, 1, // Ch 14
1, 1, 1, 1, 1, 1, // Ch 13
1, 1, 1, 1, 1, 1, // Ch 12
1, 1, 1, 1, 1, 1, // Ch 11
1, 1, 1, 1, 1, 1, // Ch 10
1, 1, 1, 1, 1, 1, // Ch 9
1, 1, 1, 1, 1, 1, // Ch 8
1, 1, 1, 1, 1, 1, // Ch 7
1, 1, 1, 1, 1, 1, // Ch 6
1, 1, 1, 1, 1, 1, // Ch 5
1, 1, 1, 1, 1, 1, // Ch 4
1, 1, 1, 1, 1, 1, // Ch 3
1, 1, 1, 1, 1, 1, // Ch 2
1, 1, 1, 1, 1, 1, // Ch 1
1, 1, 1, 1, 1, 1, // Ch 0
};

unsigned char gsData[192];


void TLC5940_Init();
void TLC5940_ClockInDC();
void TLC5940_SetGS_And_GS_PWM();
void changeGS(unsigned char channel, unsigned long dc);


void TLC5940_Init()
{
output_low(GSCLK);
output_low(SCLK);
output_low(DCPRG);
output_high(VPRG);
output_low(XLAT);
output_high(BLANK);
memset(gsData, 0x00, sizeof(gsData));
}


void TLC5940_ClockInDC()
{
unsigned long cnt = 0;
output_high(DCPRG);
output_high(VPRG);
while(TRUE)
{
if(cnt > 95)
{
output_high(XLAT);
output_low(XLAT);
break;
}
else
{
if(dcData[cnt])
{
output_high(SIN);
}
else
{
output_low(SIN);
}
output_high(SCLK);
output_low(SCLK);
cnt++;
}
}
}


void TLC5940_SetGS_And_GS_PWM()
{
short firstCycle = FALSE;
unsigned char Data_Cnt = 0;
unsigned long GSCLK_Cnt = 0;
if(bit_test(PORTB, 0))
{
output_low(VPRG);
firstCycle = TRUE;
}
output_low(BLANK);
while(TRUE)
{
if(GSCLK_cnt > 4095)
{
output_high(BLANK);
output_high(XLAT);
output_low(XLAT);
if(firstCycle)
{
output_high(SCLK);
output_low(SCLK);
firstCycle = FALSE;
}
break;
}
else
{
if(!(Data_Cnt > 191))
{
if(gsData[Data_cnt])
{
output_high(SIN);
}
else
{
output_low(SIN);
}
output_high(SCLK);
output_low(SCLK);
Data_Cnt++;
}
}
output_high(GSCLK);
output_low(GSCLK);
GSCLK_cnt++;
}
}


void changeGS(unsigned char channel, unsigned long dc)
{
unsigned long start = 0;
unsigned long stop = 0;
unsigned long s = 0;
short tmp = 0;
switch(channel)
{
case 1:
{
start = 168;
stop = 179;
break;
}
case 2:
{
start = 156;
stop = 167;
break;
}
case 3:
{
start = 144;
stop = 155;
break;
}
case 4:
{
start = 132;
stop = 143;
break;
}
case 5:
{
start = 120;
stop = 131;
break;
}
case 6:
{
start = 108;
stop = 119;
break;
}
case 7:
{
start = 96;
stop = 107;
break;
}
case 8:
{
start = 84;
stop = 95;
break;
}
case 9:
{
start = 72;
stop = 83;
break;
}
case 10:
{
start = 60;
stop = 71;
break;
}
case 11:
{
start = 48;
stop = 59;
break;
}
case 12:
{
start = 36;
stop = 47;
break;
}
case 13:
{
start = 24;
stop = 35;
break;
}
case 14:
{
start = 12;
stop = 23;
break;
}
case 15:
{
start = 0;
stop = 11;
break;
}
default:
{
start = 180;
stop = 191;
break;
}
}
for(s = start; s <= stop; s++)
{
tmp = bit_test(dc, (stop - s));
gsData[s] = tmp;
}
}

///////////////////////////////////////////////////////////////

programa principal:

#include <18F4550.h>
//#fuses HS,WDT1024,NOBROWNOUT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,MCLR,NOPBADEN,WRTB,CPB
//#use delay(clock=8000000)
#fuses MCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000)


//#device *= 16
//#device ADC = 10


#include "TLC5940.c"




#define reload1 63035
#define reload2 40000


short update_flag = 0;
short pol = 1;
signed long d = 0;


void setup();


#int_timer1

void update()
{
set_timer1(reload1);
update_flag = 1;
}


#int_timer0

void update_cycle()
{
set_timer0(reload2);
if(pol)
{
d += 5;
if(d == 4095)
{
pol = 0;
d = 4095;
}
}
else
{
d -= 5;
if(d <= 0)
{
pol = 1;
d = 0;
}
}
}



void efeito1(){
int16 x=0;

//vermelhos
while(x<4096){
//vermelhos
changeGS(0, x);
changeGS(2, x);
changeGS(5, x);
changeGS(7, x);
changeGS(8, x);
changeGS(10,x);
changeGS(13,x);
changeGS(15,x);
//delay_ms(100);
TLC5940_SetGS_And_GS_PWM();
x+=20;
}
x=0;
while(x<4096){
//azuis
changeGS(1, x);
changeGS(3, x);
changeGS(9, x);
changeGS(11,x);

TLC5940_SetGS_And_GS_PWM();
x+=20;
}
x=0;

while(x<4096){
//verdes
changeGS(4, x);
changeGS(6, x);
changeGS(12,x);
changeGS(14,x);

TLC5940_SetGS_And_GS_PWM();
x+=20;
}


}

void efeito2(){
int16 x=0;
//vermelhos
while(x<4096){
//vermelhos
changeGS(0, x);
changeGS(2, x);
changeGS(5, x);
changeGS(7, x);
changeGS(8, x);
changeGS(10,x);
changeGS(13,x);
changeGS(15,x);
//delay_ms(100);
TLC5940_SetGS_And_GS_PWM();
x+=20;
}
x=0;
changeGS(0, x);
changeGS(2, x);
changeGS(5, x);
changeGS(7, x);
changeGS(8, x);
changeGS(10,x);
changeGS(13,x);
changeGS(15,x);
//delay_ms(100);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
//azuis
changeGS(1, x);
changeGS(3, x);
changeGS(9, x);
changeGS(11,x);

TLC5940_SetGS_And_GS_PWM();
x+=20;
}
x=0;
//azuis
changeGS(1, x);
changeGS(3, x);
changeGS(9, x);
changeGS(11,x);

TLC5940_SetGS_And_GS_PWM();


while(x<4096){
//verdes
changeGS(4, x);
changeGS(6, x);
changeGS(12,x);
changeGS(14,x );

TLC5940_SetGS_And_GS_PWM();
x+=20;
}
x=0;
//verdes
changeGS(4, x);
changeGS(6, x);
changeGS(12,x);
changeGS(14,x);

TLC5940_SetGS_And_GS_PWM();


}


void efeito3(){
int16 x=0;
//vermelhos
while(x<4096){
changeGS(0, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}

x=0;
changeGS(0, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(2, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}

x=0;
changeGS(2, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(5, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(5, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(7, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(7, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(8, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(8, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(10, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(10, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(13, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(13, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(15, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(15, x);
TLC5940_SetGS_And_GS_PWM();

}

void efeito4(){
int16 x=0;
//azuis
while(x<4096){
//vermelhos
changeGS(1, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}

x=0;
changeGS(1, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(3, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}

x=0;
changeGS(3, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(9, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(9, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(11, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(11, x);
TLC5940_SetGS_And_GS_PWM();

}
/////////
void efeito5(){
int16 x=0;
//verdes

while(x<4096){
changeGS(4, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}

x=0;
changeGS(4, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(6, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}

x=0;
changeGS(6, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(12, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(12, x);
TLC5940_SetGS_And_GS_PWM();

while(x<4096){
changeGS(14, x);
TLC5940_SetGS_And_GS_PWM();
x+=10;
}
x=0;
changeGS(14, x);
TLC5940_SetGS_And_GS_PWM();

}



void zeraTodos(){
changeGS(0, 0);
changeGS(1, 0);
changeGS(2, 0);
changeGS(3, 0);
changeGS(4, 0);
changeGS(5, 0);
changeGS(6, 0);
changeGS(7, 0);
changeGS(8, 0);
changeGS(9, 0);
changeGS(10,0);
changeGS(11,0);
changeGS(12,0);
changeGS(13,0);
changeGS(14,0);
changeGS(15,0);
//delay_ms(100);
TLC5940_SetGS_And_GS_PWM();

}


void main()
{
setup();
while(TRUE)
{
efeito1();
zeraTodos();
efeito2();
zeraTodos();
efeito3();
zeraTodos();
efeito4();
zeraTodos();
efeito5();
zeraTodos();
}
}

void setup()
{
disable_interrupts(global);
setup_WDT(WDT_off);
setup_adc_ports(no_analogs);
setup_adc(ADC_off);
setup_timer_0(T0_internal);
setup_timer_1(T1_internal);
setup_timer_2(T2_DISABLED,255,1);
setup_timer_3(T3_DISABLED);
setup_CCP1(CCP_off);
setup_CCP2(CCP_off);
setup_SPI(SPI_DISABLED);
set_timer0(reload2);
set_timer1(reload1);
set_timer2(0);
set_timer3(0);
delay_ms(100);
enable_interrupts(global);
enable_interrupts(int_timer1);
enable_interrupts(int_timer0);
TLC5940_Init();
TLC5940_ClockInDC();
}
#define VPRG               pin_B0  //aterrado

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O material chegou hoje.

Mudei o projeto várias vezes e deixai em módulos para formar frases ou desenho de tamanhos variados.

O layout será mais ou menos estes:

Placa Master,que é conectada ao micro e envia sinais as demais.

master.jpg

Placa módulo,que pode se conectar a mais placas iguais.

modulo.jpg

ideia de duas juntas.

juntos.jpg

Começo a reprogramação na segunda.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

:D

Ficou bem legal o jeitão das placas se alinharem, quando fizer funcionar poste um videozinho !

Eu to mais curioso que voce!

Ja era para ter terminado mas como tudo na vida muda,estou com alguns problemas pessoais e o projeto está lento,mas ja começei a passar o layout para o cobre.

Se tudo ficar como planejado,devo faz-las sem o circuito 'em baixo',mas atrás deixando só os leds e podendo fazer uma tela de qualquer tamanho.

Link para o comentário
Compartilhar em outros sites

Vtrx, eu ia te falar exatamente isso. Colocar o circuito atrás fica legal também justamente pelo motivo que você citou. Mas pode complicar a construção física do conjunto. O que você pode fazer, seria construir tudo modular. Uma placa só com os LEDs e seus conectores. E placas com os controles. Ai você pode construir fisicamente uma placa em cima da outra. Com um espaçamento.

Se bem que você já mudou varias vezes e nao sei se terá paciência de mudar mais. Mas fica a dica.

Falou

Link para o comentário
Compartilhar em outros sites

pessoal obtive êxito em controlar os clock data e strobe consegui imprimir uma imagem estou fazendo uma specie de tabela :D estou quase compreendendo tudo!! queria saber eu posso substituir os output high(pin_x);delay_ms(xxx);

por laços for para meu programa ficar pequeno ,e não acabar desperdiçando memoria ?;)

aphawk ,deu trabalho fazer no proteus mais estou compreendendo a varredura ,não faço faculdade ,mais devo admitir que este tipo de assunto no começo era

um pouco complicado estressante agora é fascinante obrigado a todos!!:D:lol:

Link para o comentário
Compartilhar em outros sites

Merlin,

Opa legal hehehe , como eu sempre disse, não precisa de faculdade, e sim seu próprio esforço em ler, pesquisar, e experimentar !

Se quiser saber mais sobre o Isis, que é o simulador do Proteus, baixe o meu tutorial sobre programação, design e simulação para AVR, está num dos tópicos destacados acima, em quase todos os circuitos eu faço também a simulação, e tem muitas dicas lá , ok ?

E parabéns , meu amigo !

Paulo

Link para o comentário
Compartilhar em outros sites

Estava vendo sobre LEDs em geral e me deparei com um tópico da comunidade do arduino oficial lá de 2010. Nele o pessoal discute sobre as vantagens e desvantagens de se usar um CI já com PWM embutido que é mais caro ou usar shift-registers tradicionais. Achei bem interessante.

Resumindo, vale a pena pagar mais caro em um CI que irá de dar menos trabalho na programação?

http://forum.arduino.cc/index.php?topic=6590.0

Agora, se eu resolver trabalhar com matrizes, já sei o chip de minha escolha : TLC5940.

Parece meio chato de trabalhar, mas temos exemplo em posts anteriores e podemos ver o que ele é capaz.

Fica a dica.

Falou

Link para o comentário
Compartilhar em outros sites

Então Matheus,mudei mais uma vez mas como recebí os componentes desta mudança,provavelmente a placa dos led será a da foto.

Led1.jpg

Falta decidir a plaquinha que se encaixa na parte de traz nesta.

Estou com dois problemas,um é que o Eagle não 'deixa' eu desenhar o contorno desta placa no tamanho certo para saber a dimensão correta de corte para juntar uma com as outras e o segundo é conseguir um jeito de desenhar o layout da placa de traz se encaixar na mesma posição dos dois conectores da placa de Leds.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Continuando minha saga...

Eu ja fiz o orçamento das placas de Leds numa empresa especializada e como não saiu barato,antes de encomendar,comprei umas matrizes para testar o circuito driver pois vai ser o mesmo.

Apanhei um pouco para organizar as fileiras na matriz e descobrir os pinos,seguindo o datasheet,mas consegui.

8x8.jpg

matriz.jpg

Link para o comentário
Compartilhar em outros sites

É ....... Sei o que você tá passando, Vtrx !

Tá parecendo a montagem do meu novo home teather.... Já mudei o projeto 8 vezes, toda hora acho algo que vai ficar melhor, e nada de montar as partes todas que já estão aqui, prontinhas, kkkk !!

Agora mudei o amplificador de headphones, e mais uma ou duas semanas até montar e testar....

Paulo

Link para o comentário
Compartilhar em outros sites

É ....... Sei o que você tá passando, vtrx !

Tá parecendo a montagem do meu novo home teather.... Já mudei o projeto 8 vezes, toda hora acho algo que vai ficar melhor, e nada de montar as partes todas que já estão aqui, prontinhas, kkkk !!

Agora mudei o amplificador de headphones, e mais uma ou duas semanas até montar e testar....

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

Link para o comentário
Compartilhar em outros sites

É ....... Sei o que você tá passando, Vtrx !

Tá parecendo a montagem do meu novo home teather.... Já mudei o projeto 8 vezes, toda hora acho algo que vai ficar melhor, e nada de montar as partes todas que já estão aqui, prontinhas, kkkk !!

Agora mudei o amplificador de headphones, e mais uma ou duas semanas até montar e testar....

Paulo

KKKKKKKKKKKKKKKKKKKKKKKK

se servir de consolo, eu nunca termino meus projetos por causa do perfeccionismo KKKKKKKKK estou sempre mexendo em alguma coisa.

Link para o comentário
Compartilhar em outros sites

Kkkkkkkkkkkk querem dar mais risadas ????

Acabei de mudar o pré-amplificador, para um top de menos ruído..... E mais uns 45 dias para chegarem os capacitores e CI's especiais !!!!!!

Po.... Já posso vender algumas placas no Mercado Livre.... Tenho duas de pré-amplificador com controle de tom, uma de pré com controle de tom e de sub, e duas placas de retificação e filtragem de altíssima qualidade para fontes de 70 volts.... Tudo trocado por outras !!!

Agora , nem no Natal vai ficar pronto !!!!!!

Paulo

Link para o comentário
Compartilhar em outros sites

Acabei de mudar o pré-amplificador, para um top de menos ruído..... E mais uns 45 dias para chegarem os capacitores e CI's especiais !!!!!!

Agora , nem no Natal vai ficar pronto !!!!!!

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

em questão de projetínhos que demoram demais para sair do papel acho que todo técnico tem um kkkkkkk, eu por exemplo tenho outra matriz de led que quero fazer, quadrada 35X35, mas toda hora penso em mudar alguma coisa e até agora não sai dp lugar kkkkkkkkk, mas o campeão de demora pra mim, é o meu propellerclock kkkk, ja faz muito tempo que estou comprando e armazenando as coisas pra poder fazer ele, e até agora não dei um passo kkkkk

flowwww

Link para o comentário
Compartilhar em outros sites

É que depende muito da impressora. Todas as imprssoras HP deskjet da serie 600 eu seu que tem motores DC. E diga-se otimos motores. Porque são fortes. O unico ruim deles para o propeller clock é o comprimento. Mas mesmo assim creio que não seja impedimento para o utilizar

Flowww

Link para o comentário
Compartilhar em outros sites

Deixa eu ver se entendi direito..... Esses motores possuem de alguma maneira os pinos de alimentação disponíveis no eixo do motor ????????

Porque os tais motores de cabeçotes de videocassetes fazem exatamente isto , eles fornecem alimentação ao cabeçote que está girando preso ao eixo do motor, e por causa disso ele também é chamado de transformador rotativo....

Caramba, essa eu não imaginava, um motor de impressora HP é bem fácil de se achar.....

Amanha mesmo vou procurar aqui na Santa Efigênia !!!

Paulo

Link para o comentário
Compartilhar em outros sites

não. :( eles são simples motores DC, bem fortinhos, mas não fornecem a alimentação para o eixo do motor que fica rodando, eles são alimentados mas não repassam essa alimentação, para o propellerclock eu imaginei alguns métodos de alimentar, de outra forma, pois esses motores não repassam a alimentação.

flowwww

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!