Ir ao conteúdo

ViniciusKruz

Membro Pleno
  • Posts

    720
  • Cadastrado em

  • Última visita

Tudo que ViniciusKruz postou

  1. @mroberto98 Eu citei 2000º (valor aproximado) da temperatura da queima do hidrogênio considerando as mesmas condições que a gasolina em um motor comum. Se formos considerar o poder energético em temperatura de cada combustível, o hidrogênio ganha de longe dos outros a base de carbono. Veja só: O Poder Calorífico é definido como a quantidade de calor produzido pela combustão completa de uma unidade de massa de combustível. Um combustível é constituído, sobretudo, de hidrogênio e carbono, tendo o hidrogênio o poder calorífico de 28.700 kcal/kg, enquanto que o do carbono é de 8.140 kcal/kg, e por isso, quanto mais rico em hidrogênio for o combustível maior será o seu poder calorífico (SILVA e SILVA, 2008). O poder calorífico e distinguido em poder calorífico superior e poder calorífico inferior (CEFET-MG, 2009). Documento completo: http://usuarios.upf.br/~engeamb/TCCs/2009-2/MATEUS ZART DE ARRUDA.pdf
  2. Sim, adicionei. @aphawk Então, esta biblioteca não é minha, eu peguei ela na net pra testar um processador de audio, aliás, foi a única opção que encontrei para este ci de audio: pt2322. Não teria uma forma de atualizar esta lib? Como ela é bem simples, talvês quem entenda bem desses códigos do arduino possa me ajudar a atualizá-la.
  3. Utilizar a energia do hidrogênio da forma como se utiliza gasolina, álcool, energia elétrica, etc... na minha opinião, com a atual tecnologia, é inviável. Porém, penso que repensando e até mesmo retrocedendo um pouco dá pra fazer um bom uso, por exemplo, o hidrogênio quando queimado pode atingir temperaturas altíssimas (mais de 2000ºC). Acredito que esta alta temperatura pode ser muito bem aproveitada em motores a vapor e a ar comprimido. Abraço.
  4. beleza, pessoal, estou fazendo um teste aqui com um arduíno mega e ao compilar o código dá o erro:(não sei bem se é um erro, me parece um aviso) O sketch usa 6.036 bytes (2%) de espaço de armazenamento para programas. O máximo são 253.952 bytes. Variáveis globais usam 578 bytes (7%) de memória dinâmica, deixando 7.614 bytes para variáveis locais. O máximo são 8.192 bytes. Biblioteca inválida encontrada em C:\Program Files\Arduino\libraries\PT2322: C:\Program Files\Arduino\libraries\PT2322 Biblioteca inválida encontrada em C:\Program Files\Arduino\libraries\PT2322: C:\Program Files\Arduino\libraries\PT2322 A biblioteca reclamada é esta: /* Arduino PT2322 Library * Copyright (C) 2009 by oddWires * * This file is part of the Arduino PT2322 Library * * This Library is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * <http://www.gnu.org/licenses/>. */ #define FL_VOLUME_CONTROL 0x10 #define FR_VOLUME_CONTROL 0x20 #define CENTER_VOLUME_CONTROL 0x30 #define RL_VOLUME_CONTROL 0x40 #define RR_VOLUME_CONTROL 0x50 #define SUB_VOLUME_CONTROL 0x60 #define FUNCTION_SELECT 0x70 #define BASS_TONE_CONTROL 0x90 #define MIDDLE_TONE_CONTROL 0xa0 #define TREBLE_TONE_CONTROL 0xb0 #define INPUT_SW_ACTIVE 0xc7 #define MASTER_VOLUME_1STEP 0xd0 #define MASTER_VOLUME_10STEP 0xe0 #define SYSTEM_RESET 0xff #define MUTE_ON 0x08 #define _3D_OFF 0x04 #define TONE_DEFEAT 0x02 #ifndef PT2322_h #define PT2322_h class PT2322 { private: unsigned char function; unsigned char toneLookup(int); unsigned char HEX2BCD (unsigned char x); int writeI2CChar(unsigned char c); public: int init(void); void muteOn(void); void muteOff(void); void _3DOn(void); void _3DOff(void); void toneOn(void); void toneOff(void); void leftVolume(unsigned char flv); void rightVolume(unsigned char frv); void centerVolume(unsigned char cv); void rearLeftVolume(unsigned char rlv); void rearRightVolume(unsigned char rrv); void subwooferVolume(unsigned char sv); void masterVolume(unsigned char mv); void bass(unsigned char tb); void middle(unsigned char tm); void treble(unsigned char tt); }; #endif O que será que pode ter de errado? Desde já agradeço.
  5. Vi alguns videos do MPLABx e fiquei interessado porém esbarrei na questão financeira rs. Alguém pode dizer quais são as limitações da versão free(estudante, se não me engano)? Me lembro que certa vez tentei usar uma IDE diferente da CCS C e tive problemas com as limitações da versão free, por exemplo na quantidade de linhas que se pode programar. Nas IDEs MPLAB free possui quais limitações? Abraço.
  6. Amigo, tenta colocar os fuses desta forma aqui: #fuses INTRC_IO,NOWDT,NOBROWNOUT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,MCLR,NOPBADEN,WRTB,CPB #use delay(clock=8000000) Coloca só isso aí e faz novamente o teste do led Só uma coisinha rs, se seu PIC tiver um resistor de 10k ligando o pino 1 ao 5v usa-se o fuse MCLR, conforme colocado acima, agora, se seu pic não tiver este resistor, ou seja, o pino 1 estiver sem nada, aí você muda para NOMCLR Abraço!
  7. O teste do led é muuuiiito revelador. Agora já sabemos que as configurações da frequencia estão mesmo erradas! Funciona, conforme você fez um "arranjo técnico" (hehe):>> use delay(clock=1000000)<< e funcionou, deu o tempo de 1seg, ótimo, porém não pode ficar assim!!! No início do tópico você menciona que está usando um 16f690, mas nos seus fuses, está incluindo um 18f2550, qual é o pic que você está usando mesmo?
  8. MCLR ou NOMCLR faz grande diferença mesmo. Pra testar a frequencia com o led, não use o timer, antes do loop principal(dentro do main), você adiciona um outro loop, de forma que o sistema fica somente no led. Por exemplo: while(1){ output_high(pin_b7); delay_ms(1000); output_low(pin_b7); delay_ms(1000);}
  9. Formigoni, ha tempos eu parei de mexer com o proteus por causa desses problemas, o proteus é muito "grosso", ele não se atem aos detalhes, só sai rodando e pronto. Até dá pra usar ele, porém não dá pra fazer um sistema completo nele, o ideal mesmo é usa-lo para testes básicos. A primeira coisa, é você fazer um "Helo world" com um led. Eu sempre começo um sistema usando um led em uma das IOs, piscando a cada 1 seg. este teste inicial, serve para saber se o pic está funcionando e se a configuração do cristal está conforme programado. Se o led piscar, porém estiver fora do tempo de 1 segundo, verifica as configurações da frequência.
  10. Perdão amigo Mateus mas não seria MAX7219? rsrsrs... Concordo com você! Melhor que o MAX, somente o TLC5940. Quanto ao funcionamento básico do 74hc595, (em ccs) é isso: data=0b11101000; for(i=0;i<8;i++){ //envia dado serial output_bit(serin14, shift_right(&data,1,0)); // set data (DIN) level output_high(srclk11); output_low(srclk11); } output_high(rclk12); //ativa linha output_low(rclk12); // A lógica é esta, agora, para outras linguagens é só adaptar.
  11. Então, na verdade não precisa usar a eeprom, na minha sugestão você armazenaria em uma variável mesmo, só que não era uma variável simples e sim um array, ou seja, uma variável de dez posições (dez variáveis em uma). A forma como você fez é mais simples e dá no mesmo resultado e com a vantagem de economizar memória, ao invés de pegar os valores separadamente, depois somá-los e dividir para ter a média, você já somou diretamente na variável e dividiu.
  12. Amigo, não mexo com Mikro C, porém a lógica é igual para todas as linguagens. Tenta o seguinte, cria um array com 10 posições por exemplo (em CCS C ficaria assim: byte memoria[10]), depois você coloca seu sistema para fazer uma leitura no sensor da boia a cada 0,5seg e armazenaria em uma das posições do array, depois é só fazer a média, faz um laço for() que percorre todas as casas do array somando-as e depois divide por 10, desta forma você teria a média da medição. o tempo de 0,5seg é só uma ideia mesmo, vai fazendo os testes aí e coloca o melhor valor. Se colocar um valor muito baixo, o sistema irá fazer todas as dez leituras dentro do pico, o que te daria um valor errado da mesma forma que acontece atualmente, como você relatou. Por outro lado, se colocar um valor muito alto, vai demorar pra mostrar o resultado da média. Espero ter ajudado. Abração.
  13. KKKKKKKKKKKKKKKKKKKKKKKK se servir de consolo, eu nunca termino meus projetos por causa do perfeccionismo KKKKKKKKK estou sempre mexendo em alguma coisa.
  14. É 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
  15. Pessoal, comprei 6 peças do TLC5940 só pra testar, comprei no ML mesmo, o negócio é sinistro, fiz os primeiros testes e fiquei muito satisfeito com o resultado.
  16. Calma aí vtrx, rerere, cada coisa é uma coisa, não desmereça seu projeto, o que acontece é que controle de brilho individual está ligado à apresentação de imagens enquanto que controle de brilho global está ligado a apenas texto e qualquer um desses projetos tem seu lugar garantido no mercado, até porque a questão do preço de cada um deles tem uma diferença gritante. Quanto a comprar fora do Brasil, vou fazer um pedido pequeno por aqui mesmo, assim que eu dominar ele e houver realmente a necessidade compro uma quantidade maior no exterior.
  17. Isto mesmo MatheusLPS, então eu estava certo, esse ci é exatamente o que eu procurava. Vou fazer o pedido de uns 6 pra testar.
  18. Acho que encontrei a solução, não analisei o ci ainda mas parece que ele dá: http://produto.mercadolivre.com.br/MLB-498716876-tlc5940-led-rgb-anodo-servo-motor-16-canais-pwm-arduino-pic-_JM se estou certo ele faz 16 canais pwm independentes, é exatamente o que estou procurando, mais tarde um pouco irei dar uma pesquisada mais a fundo e se for isto mesmo vou pedir alguns pra testar.
  19. Então Paulo, os chineses usam este hct mesmo, eu até já anotei uma vez o número correto, não me lembro mais, perdi o número, de qualquer forma, andei estudando estes hct deles e lelo que entendi são apenas shift-registers como os 74hc595 só que são de 16 saídas cada e não 8, será que eu entendi errado? se este C.I. tiver 16 PWM separados, a coisa muda totalmente de figura, vou mudar meus estudos pra estes circuitos integrados. O problema é que eles não são encontrados aqui no Brasil. Se alguém souber de algum C.I. que contenha entrada serial e pelo menos 8 saídas PWM independentes e que possa ser encontrado no Brasil me passa o nome por favor. Quanto aos 373, eles são apenas memórias, pra fazer PWM com eles tem que ser via software, eu já fiz um relógio 7 segmentos com este ci e ficou 100%.
  20. Exatamente Paulo!! Eu fiz uma experiência, conforme citei no inicio, um pouco mais além rs, além de enviar os dados linha por linha como você citou, eu tentei fazer um PWM em cada led individualmente, assim eu teria a possibilidade de colocar um brilho diferente para cada led, podendo assim imprimir uma imagem na tela, por exemplo uma foto. A experiência foi bem sucedida com um 18f4550 (48mhz) e um 74hc595, porém ao adicionar mais um 595, a varredura não foi suficiente. Sinceramente eu adoraria saber a técnica usada pelos chineses para conseguir um PWM em 16 leds usando os shift-registers de 16 saídas, caso alguém tenha uma ideia, dá uma luz que eu irei testar.
  21. Uma teoria que ainda não coloquei em prática, é a que ja citei antes, creio eu que usando os shift-registers é a única que pode funcionar: seria colocar um shift register para cada linha do bloco. (os painéis da china são assim) desta forma o shift-register funcionaria parecido com o max7219, funcionaria como uma memória e não precisaria de ficar fazendo varredura em tempo real. Em contrapartida, vai ficar bem mais caro e trabalhoso que usar um único max por bloco, o que torna inviável.
  22. Quando fala-se em display, logo vem uma parte fundamental, a fonte. Segue uma fonte completa: https://skydrive.live.com/redir?resid=52E8F6293CD2E6FD!165&authkey=!AOorZc1BiUMaUkg Esta fonte é muito boa, ela é completa e tem todos os caracteres da tabela ascii, alguns eu tive que editar e quem for usar pode ser que precise mexers em algum caractere, pelo menos não vai ter que criar uma fonte inteira na unha.
  23. você fez igual ao meu primeiro projeto, só que eu usei o 74HC595. Quanto ao hardware, você tem a opção de colocar um transistor para cada led, ou então, como o HC significa que o CI tem potência mais elevada, você pode colocar um ULN2008 no port e resistores no HC. O ULN2008 vai acionar o terra e tem um outro CI compatível com ele(não me lembro o nome), que faz o positivo, poderia ser ligado no lugar dos resistores do HC, daí é só colocar um resistor para cada led e pronto, o que você ganha com isto é que se você quiser futuramente colocar mais de um led por ponto é só aumentar os resistores e os leds.
  24. Usei os timers. Mesmo com os timers, a latência das interrupções interferem na varredura e pode ocorrer flick na tela. O problema é que de acordo com a quantidade de blocos que você coloque a frequencia muda, eu testei de varias formas, por exemplo, coloquei uma sequencia de 74hc595 um atras do outro controlando apenas cada coluna, dessa forma eu envio um passo para o 595 de forma que apenas uma coluna de todo display fica ativa, daí envio o dado desta coluna, tive problemas pois no meu caso eram 6 blocos de 8x8 e para percorrer todo o display tinha que enviar 48 passos nos 595 sendo que para mudar apenas um passo são 2 ou tres comandos. Ao final das contas, depois de muita ralação consegui fazer funcionar razoavelmente bem, mas como já disse antes, consegui resultados 100% melhores com o driver. Tem uma outra forma de fazer por varredura que eu ainda não testei, mas estudando estes paineis de led gigantes que o pessoal está usando nas ruas para publicidade, entendi que a forma de fazer é bem diferente, e creio que seja bem mais funcional, eles não controlam o x e o y separados, nesses que costumamos ver na internet, agente envia um comando no x e depois outro no y e esses comando se cruzam acendendo o led correspondente, no caso dos paineis de led gigantes, eles controlam apenas o x, e usam para isto CIs semelhantes aos 595, porém o deles não tem apenas 8 saídas como o 595 e sim 16 saídas,porém faz a mesma coisa. Esses dias eu fiz testes usando os sitema dos paineis gigantes, coloquei 1 74hc595 e um pic18f4550 (20mhz) e consegui fazer 8 PWM separados com sucesso, daí aumentei para 2 hc595 e a frequencia de varredura ja ficou extremamente baixa, aumentei o PIC para 48mh e quase resolveu, mas percebi que precisa de mais velocidade para conseguir fazer uma boa varredura, sinceramente, não sei o que os chineses fazem para conseguir tantos PWMs separados sem dar fliks na tela. Uma coisa deu para perceber com este teste, no caso para alcançar frequencias de PWM não deu muito certo, mas se usar este mesmo sistema sem a necessidade de PWM, ou seja controlando a frequencia igual para todos (é o caso de paineis de apenas texto) ficaria perfeito.
  25. Eu ja consegui obter resultados satisfatórios com este sistema de varredura feita pelo PIC, porém se o PIC tiver que efetuar qualquer outra função adicional, a varredura fica prejudicada, o processamento tem que ficar dedicado totalmente à varredura,sem contar que o controle do brilho depende diretamente do duty cycle da frequencia, ou seja, eu desisti do sistema por varredura e optei por usar um driver (max7219), esse driver faz tudo de forma automatica, você envia a ele o dado e ele se vira com a frequencia de vredura e também tem como você controlar o brilho dos leds simplesmente enviando o valor a ele e o interessante é que ele é uma memória, ou seja, você envia o dado e ele fica memorizado nos leds, daí o PIC pode ficar parado ou fazendo outras funções, varredura na unha é canseira.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!