Ir ao conteúdo
  • Cadastre-se
ViniciusKruz

TLC5940 Biblioteca para CCS C

Recommended Posts

Boa tarde pessoal,

há tempos atras eu havia postado que estaria fazendo testes com o CI TLC5940, que é de 12 bits/16 saidas PWM independentes e é muito usado em displays de led rgb. Na época eu até comprei algumas peças para fazer testes e os testes foram bem sucedidos. Agora estou aprofundando no sistema e preciso de mais recursos, o driver que eu consegui é funcional, porém encontrei um outro bem completo só que é para C18. Seria uma boa fazer a tradução deste c18 para ccs c. Alguém se habilita a me ajudar? 

 

 

Vou disponibilizar dois arquivos, um é o driver para CCS C e o outro é um projeto completo para C18.

 

RGB_Bargraph_Firmware_2.zip

 

tlc5940.rar

 

Atenciosamente, Vinícius Cruz.

 

Já havia me esquecendo de postar a fonte deste projeto completo: http://www.waitingforfriday.com/index.php/USB_RGB_LED_VU_Meter

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Então, li, mas não entendi a relação rsrs

A primeira dúvida: como traduzir esta parte para CCS C

// Initialise the displayvoid initialiseRgbDisplay(void){   // Get the TLC5940s ready for action   initialiseTlc5940();      // Write the default values to the display state model   for (int rgbLedNumber = 0; rgbLedNumber < 16; rgbLedNumber++)   {      display.rgbLed[rgbLedNumber].redTarget = 0;      display.rgbLed[rgbLedNumber].greenTarget = 0;      display.rgbLed[rgbLedNumber].blueTarget = 0;            display.rgbLed[rgbLedNumber].redActual = 0;      display.rgbLed[rgbLedNumber].greenActual = 0;      display.rgbLed[rgbLedNumber].blueActual = 0;            display.rgbLed[rgbLedNumber].redFadeSpeed = 0;      display.rgbLed[rgbLedNumber].greenFadeSpeed = 0;      display.rgbLed[rgbLedNumber].blueFadeSpeed = 0;            display.rgbLed[rgbLedNumber].redFadeCounter = 0;      display.rgbLed[rgbLedNumber].greenFadeCounter = 0;      display.rgbLed[rgbLedNumber].blueFadeCounter = 0;            display.rgbLed[rgbLedNumber].fadeOnSpeed = 0;      display.rgbLed[rgbLedNumber].fadeOffSpeed = 0;   }      display.brightnessCounter = 0;   }

esta parte inicializa o tlc5940 e está no arquivo rgbled.c

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este é outro patamar de pisca led que ainda não atingi mas vejamos um de meus chutes

amigo @ViniciusKruz , esta parte é c nativo. É parte de uma struct/union qualquer. voce não precisa necessariamente "traduzir". Seu foco de preocupação vai ser apenas na parte de inicializar o hw do mc. O resto é c puro. bom pelo menos era pra ser. ouvi dizer que cc não segue padrões de c ao pé da letra. Portanto, analise nos fontes onde e quando há menção dos circuitos e pinos do seu mc e faça o traslado tranquilamente. Depois disso, erros de sintaxe mínimos de fácil correção devem aparecer. Corrija-os.

 

Posso não ter ajudado muito mas.. boa intenção conta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

De boa intenção dizem que o inferno está cheio (hahahahaha) Isadora... 

brincadeiras à parte...

eu já imaginava que seria alguma coisa específica do compilador C18. 

Quanto a me concentrar na inicialização, a tradução dela é mais fácil, ela fica em void "initialiseTlc5940()" dentro de tlc5940.c.

 

De repente seria melhor aprimorar o driver que citei acima, porque já é próprio do ccs c, talvez seja mais fácil, dá uma olhada e me diga o que acha? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

realmente estruturas em c é um treco bem sinistro e até hoje me arrancam cabelo. Mas basicamente são variáveis. Não sei o que quiseste dizer com aprimorar. Seria facilitar a compreensão, trocar de tipo de variável ou algo assim? Não sei se vale a pena. Tente portar como está mesmo. Sinto não analisar o código todo mas sinto que o que o sw driver acima faz é essencialmente zerar memória ou dados que serão enviados pro hw driver. não?

Também não conheço tal tlc5940. Qualquer hora dou uma olhada...

sono......

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resumindo as funções deste CI, ele é basicamente como o hc595, a diferença é que no tlc as saídas são PWMs individuais.

 

Aprimorar que eu digo seria adicionar algumas funções que ele não possui, além de estar enviando dados somente para o primeiro CI, se ligo 3 peças em cascata, todas elas recebem os dados igualmente, nesse caso será necessário fazer com que eu possa escolher o endereço de qualquer um deles separadamente, no 74hc595 isso é bem fácil de fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só porque você insistiu dei uma lida rápida no d.s.

Sério? só se comunicam em cascata? sei não, acho que é cascata hein. Tenta algo tipo assim:

-pinos clock e dado em comum pra todos mesmo.

-individualize cada um com o pino XLAT. o que você não quer mexer, deixe o XLAT queto. Talvez tenha que individualizar o pino VPRG também. sei lá...

-como o acionamento del é +- simples, crie seu proprio driver baseando-se no que você quer efetivamente fazer com ele. (pisca pisca de natal p.ex. anda logo! falta pouco!). Dá só uma olhadela no que os cara fizeram e copie uma coisa ou outra.

 

Bom por hora é o que saiu. O phd em leds é o amigo @ Talvez ele já tenha usado este driver. Só não conta muito com isso pois afinal é o ganha pão dele. E sabe como é que é né... neste caso não se pode abrir as per.. ops... torneiras do conhecimento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hahahaha, bem humorada você heim!!!

Em um outro driver eu fiz isto que você sugeriu de isolar o pino de ativação do comando e deu certo. Será uma boa opção pelo menos para testes.

 

Agora entendi porque o @ me direcionou para um site impertinente ao assunto, ele estava defendendo o pão dele hahahaha

 

Assim que eu fizer os novos testes postarei o resultado. Minha intenção não é somente aprender a lidar com este CI, mas também deixar registrado aqui uma boa solução para quem se interessar.

 

Abraço!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ViniciusKruz,

Se voce ligar tres em cascata, basta enviar os dados em sequência, que já vai completando o primeiro e indo para o segundo, e quando completar o segundo já vai para o terceiro. Basta observar o protocolo no Datasheet quando se cascateia dois desses CIs, e estender o mesmo principio para o terceiro ou quantos mais existirem em cascata.

Eu tenho 10 desses CIs comigo ( foi uma oferta irresistível no Ebay... ) mais ainda não montei nada com eles, quem sabe me animo agora !

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ViniciusKruz,

Se voce ligar tres em cascata, basta enviar os dados em sequência, que já vai completando o primeiro e indo para o segundo, e quando completar o segundo já vai para o terceiro. Basta observar o protocolo no Datasheet quando se cascateia dois desses CIs, e estender o mesmo principio para o terceiro ou quantos mais existirem em cascata.

Eu tenho 10 desses CIs comigo ( foi uma oferta irresistível no Ebay... ) mais ainda não montei nada com eles, quem sabe me animo agora !

Paulo

Então, acredito que hoje terei tempo pra testar, vou analisar com cuidado o ds e também o driver do ccs. Na verdade minha intenção quando criei este post, era "traduzir" o driver do C18 que citei, este sim é um excelente driver, tem todas as funções necessárias. Mas seguindo os conselhos da Isadora, irei começar do zero com base neste driver da ccs c mesmo. Uma coisa já percebi, o pino que deve ser ativado após o envio serial parece ser o XLAT, Tem que testar pra ver. 

 

Abraço.

 

A proposito, Paulo, testa os CIs aí que você vai curtir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

seguir o que disse o manual é muito fácil. aí fica xato. o legal mesmo é desafiar as regras. brinc... Na verdade o que teorizei é que se eu ligar 100 destes em série e quiser alterar o brilho apenas do 100°, teria que fazer 99 shifts inúteis por isso a teoria do controle individual que nem sei que dá certo.

 

Se você's me disserem algum uso prático pra isso além de pisca de natal e afins, quem sabe me animo a adquirir alguns...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Painel de led para apresentação de textos e imagens... mas creio que o pisca de natal dê mais retorno$$$$ pro ano que vem, claro, ha-ha-ha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Feedback... suando a camisa...

 

 

consegui ter algum progresso:

void TLC5940_SetGS_And_GS_PWM() {                                                     short firstCycle = FALSE;    unsigned char Data_Cnt = 0;    unsigned long GSCLK_Cnt = 0;     indexmxDsp=1;   if(bit_test(PORTB, 0))    {       output_low(VPRG);       firstCycle = TRUE;                     }       output_low(BLANK);   while(TRUE)         {                   if(indexMxDsp==1){         if(!(Data_Cnt > 191))          {                           output_low(SIN);                         output_high(SCLK);             output_low(SCLK);                        Data_Cnt++;                         }                       }            if(indexMxDsp==2){         if(!(Data_Cnt > 191))          {                           output_low(SIN);             output_high(SCLK);             output_low(SCLK);                        Data_Cnt++;                         }                    }            if(indexMxDsp==3){         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++;               if(GSCLK_cnt > 4095)       {         output_high(BLANK);         GSCLK_cnt=0;         Data_Cnt=0;         indexMxDsp++;         if(indexMxDsp>3){            //output_toggle(pin_a1);//teste            output_high(XLAT);            output_low(XLAT);            break;                             }      }   }                                    } 

Alterando esta função consegui enviar para 3 TLCs em sequencia. Parece pouco mas por hora foi o que deu pra fazer. Desta forma aí, está dando "flick" nos leds, mas só de conseguir resolver a lógica já é alguma coisa. Até!! 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×