Displays de 7 segmentos

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Displays de 7 segmentos

Mensagempor denis neves » 15 Jul 2009 12:25

Olá a todos,

estou fazendo um circuitinho com PIC onde tenho dois displays de 7 segmentos ligados no portB de um 16F628A através de dois 4511 para decodificar o bcd para os displays.Eu estou fazendo contagem de eventos externos através da interrupção externa do PIC, e pretendo mostrar essa contagem nos displays com atualização de 1 segundo. Até ai belezaa!!!

O problema é o seguinte:

O portB do PIC é de 8bits certo !?!?...então se eu ligar dois displays eu fico com 4 bits para cada um.Com 4bits eu consigo ir até 16, mas o display só vai até 9.
A minha dificuldade está sendo pegar a variável da contagem e mostra-la nos displays.
EX:
main()
{
int contagem;
contagem = 0;
while(true)
{
contagem ++;
delay_ms(200);
if(contagem == 25)
{
output_b(contagem); //os displays estão ligados aqui
contagem = 0;
}
}
}

Na hora que este valor é mostrado nos displays ele fica totalmente errado...

ah...O compilador é o CCS.

Alguem poderia me ajudar !?!?

Muito obrigado,

Denis.
HEY HO LET'S GO !!!
denis neves
Byte
 
Mensagens: 117
Registrado em: 25 Jul 2007 17:16

Mensagempor Alesandro F Zagui » 15 Jul 2009 13:21

Denis

O valor da variavel "contagem" é hexadecimal, voce deve converter ela em decimal.

Divida a variavel contagem por 10, o resultado é a dezena e o resto é a unidade.
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor denis neves » 15 Jul 2009 13:35

Olá Alesandro,

humm...deixa eu ver se entendi...eu pego a variavel (contagem) e divido por dez (contagem / 10) e depois pego o resto (contagem % 10) certo !?!?

Ai eu escrevo assim: output_b(contagem/10 + contagem%10); ????????

Se não for assim, como seria ???

Muito obrigado,

Denis.
HEY HO LET'S GO !!!
denis neves
Byte
 
Mensagens: 117
Registrado em: 25 Jul 2007 17:16

Mensagempor _blackmore_ » 15 Jul 2009 13:45

denis neves

fiz um contador a alguns dias mas eu utilizei uma tabela para converter o valor .. acredito que fica mais fácil pois o valor encontrado será colocado diretamente no port do pic ... porém será necessário utilizar mais uma variável e mais um pino de saída do pic para cada display multplexando os mesmos ... vou pegar o fragmento do código e o circuito e posto aqui mais tarde para tu entender mais claramente.

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor denis neves » 15 Jul 2009 14:02

hummm...interessante blackmore !!!

Bom eu tenho 3 IO sobrando...da pra fazer isso que vc falou !!!

Posta o fragmento pra eu dar uma olhada e entender melhor!!!

Muito grato pela atenção,

Denis.
HEY HO LET'S GO !!!
denis neves
Byte
 
Mensagens: 117
Registrado em: 25 Jul 2007 17:16

Mensagempor buiz » 15 Jul 2009 15:22

Olá Denis,

Voce ira utilizar apenas 02 displays?

O melhor a fazer é usar uma tabela usando os 4 primeiros pinos do portB (B0, B1, B2, B3) para contar de 0 a 9. E usar o B4 e B5 como Strobe para selecionar qual dos 4511 voce quer.

Exemplo:

Código: Selecionar todos

#DEFINE DISPL1 Pin_b4
#DEFINE DISPL2 Pin_b5


byte const tabela[]={ 0b00110000,//0
                                  0b00110001,//1
                                  0b00110010,//2
                                  0b00110011,//3
                                  0b00110100,//4
                                  0b00110101,//5
                                  0b00110110,//6
                                  0b00110111,//7
                                  0b00111000,//8
                                  0b00111001,};//9

void main()
{
int contagem;
contagem = 0;
output_high(DISPL1);// ligado ao Strobe do 1º display
output_high(DISPL2);// ligado ao Strobe do 2º display


while(true)
{
contagem ++;
delay_ms(200);
if(contagem == 25)
{
output_b(tabela[contagem/10]);
output_low(DISPL1);
output_high(DISPL1);
output_b(tabela[contagem%10]);
output_low(DISPL2);
output_high(DISPL2);
contagem = 0;
}
}
}





Bom eu fiz correndo este exemplo e não testei, mas acho que funciona, mais tarde vou testar se tiver que corrigir alguma coisa eu posto aqui, mas é uma ideia para você testar!

Uma observação, eu usei parte do seu programa, e da forma que ele esta escrito só vai mostrar 25. Seria isso?

Porque se for uma contagem até 25 e mostrando vai ter que mudar algumas coisinhas.

Espero ter ajudado, um abraço,
Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor ze » 15 Jul 2009 15:46

Código: Selecionar todos
#define HEX2BCD(hex) ((((hex) / 10) << 4) + ((hex) % 10))
PORTB=HEX2BCD(contagem);
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor buiz » 15 Jul 2009 15:47

Segunda versão:

Contador de 0 a 25 com intervalo de 200 milisegundos.

Testado e funciona!

Código: Selecionar todos

#DEFINE DISPL1 Pin_b4
#DEFINE DISPL2 Pin_b5


byte const tabela[]={ 0b11110000,//0
                                  0b11110001,//1
                                  0b11110010,//2
                                  0b11110011,//3
                                  0b11110100,//4
                                  0b11110101,//5
                                  0b11110110,//6
                                  0b11110111,//7
                                  0b11111000,//8
                                  0b11111001,};//9

void main()
{

int contagem;
contagem = 0;

//Coloquei esta função para inicializar os 4511.
output_b(0x0f);
output_low(DISPL1);// ligado ao Strobe do 1º display
output_low(DISPL2);// ligado ao Strobe do 2º display
output_high(DISPL1);// ligado ao Strobe do 1º display
output_high(DISPL2);// ligado ao Strobe do 2º display


while(true)
{
output_b(tabela[contagem/10]);
output_low(DISPL1);
output_high(DISPL1);
output_b(tabela[contagem%10]);
output_low(DISPL2);
output_high(DISPL2);

delay_ms(200);
contagem ++;
if (contagem>25) contagem=0;

}
}



Bom fiz ai alguns exemplos, agora você aperfeiçoa conforme sua necessidade.

Lembrando que nestes exemplos eu usei 4 pinos do PORTB para ABCD e 2 pinos para Strobe, desta forma voce pode ligar até 4 displays de 7 segmentos usando 1 4511 para cada.



Um abraço,

Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor buiz » 15 Jul 2009 16:05

Aproveitando o exemplo do nosso amigo Lellis e passando para o CCS:

Código: Selecionar todos

#define HEX2BCD(hex) ((((hex) / 10) << 4) + ((hex) % 10))

void main()
{

int contagem;
contagem = 0;


while(true)
{
output_b(HEX2BCD(contagem));

delay_ms(200);
contagem ++;
if (contagem>25) contagem=0;

}
}




Testado e funciona!
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor denis neves » 15 Jul 2009 16:34

poxaaa, valeuuu pessoal !!!

vou fazer esses exemplos que vcs me passaram...se surgir alguma duvida e/ou resultado eu posto aqui ok?!?!

Muito obrigado a todos mais uma vez...estarei disponivel no que eu puder ajudar !!!

Denis.
HEY HO LET'S GO !!!
denis neves
Byte
 
Mensagens: 117
Registrado em: 25 Jul 2007 17:16

Mensagempor denis neves » 22 Jul 2009 08:26

Olá a todos,

o meu circuitinho deu certo...graças a vocês...muito obrigado !!!

Agora só mais uma duvida...nu futuro pretendo colocar mais um display que para contar até 999...ai nesse caso como eu faço a divisão para mostrar nos displays ???

Seria só dividir por 100 !?!?

Muito grato,

Denis.
HEY HO LET'S GO !!!
denis neves
Byte
 
Mensagens: 117
Registrado em: 25 Jul 2007 17:16

Mensagempor ze » 22 Jul 2009 16:23

como separar, vai a ideia:
Código: Selecionar todos
int dado;
char cen,dez,un;
dado=567;
cen=dado/100; //5
dez=(dado-cen*100)/10; //6
un=dado-cen*100-dez*10; //7

como colocar nos ports e displays é por conta da sua imaginação. faça com multiplexagem que econom... bom, a imaginação deve ser sua...
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor denis neves » 27 Jul 2009 13:43

Hummm...muito obrigado Lellis !!!

Eu ja fiz com os 3 displays e funcionou belezinha.

Valeu,

Denis.
HEY HO LET'S GO !!!
denis neves
Byte
 
Mensagens: 117
Registrado em: 25 Jul 2007 17:16


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x