Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
LucasDiulbern

Duvida em Matriz de Led 8x32

Recommended Posts

Estou tentando escrever na matriz, mais não estou conseguindo nem sicronizar os clocks com data e strobe dos 4094.

Eu peguei um pedaço do codigo fonte de outro circuito de matriz e modifiquei o que eu achei que era necessario, mais mesmo assim não funciona.

#include <16F877A.h> // identifica microcontrolador alvo
#use delay (clock=4000000) // <- define cristal para 4Mhz. Para outros valores, mude e recompile.

#INCLUDE <MATH.H>
#DEFINE EEPROM_SCL PIN_E2
#DEFINE EEPROM_SDA PIN_E3
#FUSES NOWDT
#FUSES XT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD


#define RDD_DATA PIN_B1
#define RDD_CLOCK PIN_B0
#BYTE PORTD = 0x08
#BYTE PORTB = 0x06
#BYTE PORTD_TRIS = 0x88
#BYTE PORTB_TRIS = 0x86
void fConfigurar_portas(void);
void fRDD_send_data0(void);
void fRDD_send_data1(void);

void main(){


int8 i,j;
fConfigurar_portas();
output_low(RDD_CLOCK);
output_low(RDD_DATA);
//
//------Dibujo las filas una a una -----
//
while (TRUE){
PORTD = 0b11111110; //Filas 1 encendida, las demas apagadas.
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
fRDD_send_data1();
}
delay_ms(200);
PORTD = (PORTD <<1) +1;
}
//
//------Dibujo rectangulos... -----
//
PORTD = 0b11111111; //Filas apagadas.
for (i=0;i<8;i++) {fRDD_send_data1();}
for (i=0;i<8;i++) {
fRDD_send_data0();
PORTD = PORTD /2 ;
delay_ms(200);
}
}
}

void fConfigurar_portas(void){

PORTB_TRIS = 0b11000000; //1 = ENTRADA, 0 = SAIDA
PORTD_TRIS = 0b00000000; //1=ENTRADA, 0=SAIDA
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
}

//--------------------------------------------------
//---Envia un 0 al registro de desplazamiento:
//--------------------------------------------------
void fRDD_send_data0(void){
output_low(RDD_DATA);
delay_us(2);
output_low(RDD_CLOCK);
delay_us(2);
output_high(RDD_CLOCK);
}
//--------------------------------------------------
//---Envia un 1 al registro de desplazamiento:
//--------------------------------------------------
void fRDD_send_data1(void){
output_high(RDD_DATA);
delay_us(2);
output_low(RDD_CLOCK);
delay_us(2);
output_high(RDD_CLOCK);
}

Gostaria de uma ajuda, ao menos uma dica do que eu estou fazendo errado, ou do que eu estou deixando de fazer. Não tenho muita experiencia com programação e é a primeira vez que eu tento montar uma matriz com mais de uma matriz se é que me entendem.

Outra duvida é como eu posto o aqruivo .DNS aqui no forum? para ajudar vocês para que me ajudem

Desde já agradeço aos que responderem!!!

post-738360-1388496148117_thumb.jpg

Editado por Bcpetronzio
Foto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é o problema de pegar codigos alheios ,no fim nao da certo,pegue a ideia e tente fazer o teu,alem de entender melhor sabe o que esta fazendo.Eu tenho um aqui so q é para uma matriz pequena e uso o 4017,se interessar

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Valeu pela ajuda, mais eu tambem pensei em começar do zero, mais eu não sei como fazer a varredura de deslocamento. Se puder posta ai o seu pra mim dar uma olhada, as vezes vendo um funcionando e vendo o codigo fonte eu entendo alguma coisa.

    Fiz uma matriz dessas, funcionou perfeitamente. Mas está em ASM

    ASM, num entendo nada....=/ . Eu ate achei alguns esquemas na intenet mais ta tudo em ASM. Mais valeu mesmo assim!!!

    Dei uma modificada basica no circuito, mais ainda nao funciona, meu problema é sincronizar clock com data com strobe, pra poder fazer a varredura

    post-738360-1388496148848_thumb.jpg

    Editado por Bcpetronzio
    Unir Post seguidos em menos de 24 horas, use a opção editar

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    voce posicionou bem a matriz? Com os catodos no PIC e os anodos no registro?

    voce posicionou bem a matriz? Com os catodos no PIC e os anodos no registro?

    Faça antes um teste pra saber quais são os catodos e quais são os anodos?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
     #include <16F628a.h> //Microcontrolador utilizado
    #fuses hs,nowdt,noprotect,put,brownout,mclr,nolvp,nocpd
    #use delay(clock=4000000)
    #use fast_io(a)
    #use fast_io(
    #byte porta = 0x05
    #byte portb = 0x06
    #bit clk =porta.1
    int n;
    const unsigned char table[1][5] = {{0B10111111
    0B10111111
    0B10000000
    0B10111111
    0B10111111}};

    void main()
    {
    set_tris_b(0);
    set_tris_a(1);
    while(1){
    clk=0;
    for (n=0;n<5;n++) {
    clk=1;
    output_b(table[0][n]);

    delay_us(100);

    }
    }
    }

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
     #include <16F628a.h> //Microcontrolador utilizado
    #fuses hs,nowdt,noprotect,put,brownout,mclr,nolvp,nocpd
    #use delay(clock=4000000)
    #use fast_io(a)
    #use fast_io(
    #byte porta = 0x05
    #byte portb = 0x06
    #bit clk =porta.1
    int n;
    const unsigned char table[1][5] = {{0B10111111
    0B10111111
    0B10000000
    0B10111111
    0B10111111}};

    void main()
    {
    set_tris_b(0);
    set_tris_a(1);
    while(1){
    clk=0;
    for (n=0;n<5;n++) {
    clk=1;
    output_b(table[0][n]);

    delay_us(100);

    }
    }
    }

    post-299450-13884961489239_thumb.jpg

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • voce posicionou bem a matriz? Com os catodos no PIC e os anodos no registro?

    voce posicionou bem a matriz? Com os catodos no PIC e os anodos no registro?

    Faça antes um teste pra saber quais são os catodos e quais são os anodos?

    Realmente estava ao contrario,mudei para o jeito que você falou. Mais eu não consegui entender qual a diferença. Era so mudar no programa não. Ao invés de mandar 1 mandar 0.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Pelo programa a matriz activa-se a baixo na parte que liga no PIC (por exemplo pra activar a primeira coluna - 0b11111110) portanto é aí que se liga os catodos. E envia-se os dados em serie atraves do registro, aí liga-se os anodos.

    Podia-se trocar a logica no programa, mas creio que essa é mesmo a melhor forma.

    Editado por LEOPUENA

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • matriz8x32j.jpg

    Virei as matrizes e adicionei uma ao lado para mostrar a configuração dos led(anodo catodo)

    Agora quem controla as colunas são os Shift Register e o pic controla as linhas

    Consegui fazer tipo uma varredura mais foi com a coluna inteira como mostra na figura, nao sei se o programa esta certo, se tiver o que eu devo fazer pra continuar. Como eu vou adicionar os valores binarios correspondentes as linhas para formar uma letra no pic?

    Segue o programa

    #include <16F877A.h> // identifica microcontrolador alvo
    #use delay (clock=4000000) // <- define cristal para 4Mhz. Para outros valores, mude e recompile.

    #INCLUDE <MATH.H>
    #DEFINE EEPROM_SCL PIN_E2
    #DEFINE EEPROM_SDA PIN_E3
    #FUSES NOWDT //No Watch Dog Timer
    #FUSES XT
    #FUSES NOPUT //No Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD


    #define RDD_DATA PIN_B1
    #define RDD_CLOCK PIN_B0
    #BYTE PORTD = 0x08
    #BYTE PORTB = 0x06
    #BYTE PORTD_TRIS = 0x88
    #BYTE PORTB_TRIS = 0x86
    void fConfigurar_portas(void);
    void fRDD_send_data0(void);
    void fRDD_send_data1(void);

    void main(){


    int8 i,j;
    fConfigurar_portas();
    output_low(RDD_CLOCK); //clock = Bajo
    output_low(RDD_DATA);
    //
    //------Dibujo las filas una a una -----
    //

    //i=limha
    //j=coluna
    while (TRUE){


    //
    PORTD = 0b00000000; //Filas acendidas.

    for (i=0;i<1;i++) {fRDD_send_data0();}

    for (i=0;i<24;i++) {
    fRDD_send_data1();

    PORTD = PORTD /2 ;
    delay_ms(100);

    }
    }//Fin while
    }//Fin main

    void fConfigurar_portas(void){

    PORTB_TRIS = 0b00000000; //1 = ENTRADA, 0 = SALIDA
    PORTD_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    }

    //--------------------------------------------------
    //---Envia un 0 al registro de desplazamiento:
    //--------------------------------------------------
    void fRDD_send_data0(void){
    output_high(RDD_DATA);
    delay_us(2);
    output_low(RDD_CLOCK);
    delay_us(2);
    output_high(RDD_CLOCK);
    }
    //--------------------------------------------------
    //---Envia un 1 al registro de desplazamiento:
    //--------------------------------------------------
    void fRDD_send_data1(void){
    output_low(RDD_DATA);
    delay_us(2);
    output_low(RDD_CLOCK);
    delay_us(2);
    output_high(RDD_CLOCK);
    }

    post-738360-13884961490517_thumb.jpg

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    ja altero o codigo mas se não quiseçe era so por portas nand que funciona na saida do 4094 antes de ir para a matriz

    a primeira vez que fiz não entendia o que acontecia mas depois prestanu bem a atenção identifique que esse era o erro não tinha paciencia de muda o cod e fiz isso deu certo

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Tem um erro na imagem, a matriz de exemplo não está na mesma posição das outras. Contudo a ideia é essa, o PIC controla as linhas com sinal baixo (catodos) e os registros controlam as colunas com sinal alto (anodos).

    PORTD = 0b00000000;

    Fazendo isso está a ser activada a linha toda e depois activa-se uma coluna que acende todos leds. o Ideal é iniciar tudo a 1 e ir activando as linhas desejadas (com logica baixa).

    Se já entendeste tenta criar um programa teu, testando tudo parte por parte. Primeiro testa a varredura nas colunas activando os registros, e depois vai enviando os dados pelas linhas.

    Olha esse programa que fiz agora. Tem muitas falhas ainda mas dá pra ver a ideia


    //--VETOR COM MEU NOME----
    int dado[24];
    dado[0]=0;
    dado[1]=0;
    dado[2]=0b00111110;
    dado[3]=0b00100000;
    dado[4]=0b00100000;
    dado[5]=0;
    dado[10]=0b00111110;
    dado[11]=0b00101010;
    dado[12]=0b00100010;
    dado[13]=0;
    dado[14]=0;
    dado[18]=0b00111110;
    dado[19]=0b00100010;
    dado[20]=0b00100010;
    dado[21]=0b00111110;
    dado[22]=0;
    //--------------------------
    ....
    output_high(data);
    [B] for(i=0;i<24;i++){[/B] portd=dado[i-1];
    output_d(0x00); //não testei bem essa parte
    output_low(en);
    delay_us(100);
    output_high(en);
    output_low(data);
    delay_us(100);
    [B]}[/B]
    ...

    e aí está o circuito

    post-838024-13884961532079_thumb.png

    .

    Editado por LEOPUENA
    codigo e circuito

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Vou fazer o programa desde o inicio, fazer as modificações e depois posto com que ficou.

    Obrigado ai a todos que estão ajudando!!!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá pessoal, boa noite a todos, 1° gostaria de agradecer a todos pelo assunto que sempre vai e vem, tem sempre alguem como eu que gosta de matriz de led, e sempre os que adoram ajudar... Bom estou procurando algo parecido com isso a tempo (Pic 16f877A e 4094), então se o colega LucasDiulbern, puder postar um link com a simulação fontes e tudo mais, talvez eu possa contribuir um pouquinho....

    desde já agradeço...

    Editado por axiel

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Cara, eu meio que desisti de fazer essa matrix por enquanto. Nao estava tendo tempo nem paciencia para faze-la. Mais estou com um projeto novo de um cubo de led que vai comecar com 4x4x4 e depois irei fazer um de 8x8x8. Por mais incriver que pareca ta sendo muito mais fácil hehe. Depois posto alguns detalhes...

    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






    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

    ×