Ir ao conteúdo
  • Cadastre-se

Duvida em Matriz de Led 8x32


LucasDiulbern

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
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);

}
}
}

Link para o comentário
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

Link para o comentário
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?

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.

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
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

Link para o comentário
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

.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

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

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

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

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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!