problemas com 89S52 e display de 7 seguimentos

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

problemas com 89S52 e display de 7 seguimentos

Mensagempor renan-papaco » 06 Ago 2012 20:08

eu criei este seguinte circuito:

montei uma placa com 8 displays de 7 seguimentos, e usei um decodificador 74LS138 pra selecionar eles... sendo que eu quero ligar 6 deles para fazer um relógio digital(ou um contador de 8 algarismos) eu até obtive sucesso adaptando um programa q consegui com meu kit original 8051, mas este só veio com 4 displays... criando algo parecido com um cronometro o programa original ligava e desligava diretamente as portas P2.0 a P2.3, para multiplexar os displays e como queria econimizar pinos e incrementar um pouco o hardware, eu usei o 74LS138...

de fato, só bastou eu adaptar o programa fonte pra q ele fizesse a contagem binária usando estes mesmos 4 pinos sendo 3 pra fazer a contagem e 1 pra habilitar ou desabilitar o multiplexador

o codigo original é esse:


#include<at89x52.h>

char milhar=0;
char centena=0;
char dezena=0;
char unidade=0;
char cont=0;
//****************************************************
void delay(){
unsigned int tempo=0;
for(tempo=0;tempo<10;tempo++);
}

//****************************************************
void inicializaTimer0(){
TMOD=1; //ativa timer no modo 16 bits
TR0=1; //ativa o timer (play/pause)
EA=1; //ativa o uso da interrupcoes
ET0=1; //ativa interrupcao por timer0
}
//****************************************************
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms
TL0=0x00; //B0
TR0=1;
cont++; //passou +50us
}
//****************************************************
void exibeHora(){
if (milhar==0) P0=63;
if (milhar==1) P0=6;
if (milhar==2) P0=91;
if (milhar==3) P0=79;
if (milhar==4) P0=102;
if (milhar==5) P0=109;
if (milhar==6) P0=125;
if (milhar==7) P0=7;
if (milhar==8 ) P0=127;
if (milhar==9) P0=111;
P2=11;
delay();
P2=0;

if (centena==0) P0=63;
if (centena==1) P0=6;
if (centena==2) P0=91;
if (centena==3) P0=79;
if (centena==4) P0=102;
if (centena==5) P0=109;
if (centena==6) P0=125;
if (centena==7) P0=7;
if (centena==8 ) P0=127;
if (centena==9) P0=111;

P2=10;
delay();
P2=0;

if (dezena==0) P0=63;
if (dezena==1) P0=6;
if (dezena==2) P0=91;
if (dezena==3) P0=79;
if (dezena==4) P0=102;
if (dezena==5) P0=109;
if (dezena==6) P0=125;
if (dezena==7) P0=7;
if (dezena==8 ) P0=127;
if (dezena==9) P0=111;

P2=9;
delay();
P2=0;

if (unidade==0) P0=63;
if (unidade==1) P0=6;
if (unidade==2) P0=91;
if (unidade==3) P0=79;
if (unidade==4) P0=102;
if (unidade==5) P0=109;
if (unidade==6) P0=125;
if (unidade==7) P0=7;
if (unidade==8 ) P0=127;
if (unidade==9) P0=111;

P2=8;
delay();
P2=0;
}
//****************************************************
void main(){
inicializaTimer0();
while(1){
if(cont==20){
if(unidade<9) unidade++;
else{
if(dezena<5) dezena++;
else{
if(centena<9) centena++;
else{
centena=0;
milhar++;
}

if((milhar==2) && (centena==4)){
unidade=0;
dezena=0;
centena=0;
milhar=0;
}
dezena=0;
}
unidade=0;
}
cont=0;
}
exibeHora();
}
}



este funcionou, já adaptado pra funcionar usando o decodificador 74LS138



ai eu mudei o código:

#include<at89x52.h>

char hora1=0;
char hora2=0;
char minuto1=0;
char minuto2=0;
char segundo1=0;
char segundo2=0;
char cont=0;
//****************************************************
void delay(){
unsigned int tempo=0;
for(tempo=0;tempo<10;tempo++);
}

//****************************************************
void inicializaTimer0(){
TMOD=1; //ativa timer no modo 16 bits
TR0=1; //ativa o timer (play/pause)
EA=1; //ativa o uso da interrupcoes
ET0=1; //ativa interrupcao por timer0
}
//****************************************************
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms
TL0=0x00; //B0
TR0=1;
cont++; //passou +50us
}
//****************************************************
void exibeHora(){

if (hora1==0) P0=63;
if (hora1==1) P0=6;
if (hora1==2) P0=91;
if (hora1==3) P0=79;
if (hora1==4) P0=102;
if (hora1==5) P0=109;
if (hora1==6) P0=125;
if (hora1==7) P0=7;
if (hora1==8 ) P0=127;
if (hora1==9) P0=111;
P2=13;
delay();
P2=0;

if (hora2==0) P0=63;
if (hora2==1) P0=6;
if (hora2==2) P0=91;
if (hora2==3) P0=79;
if (hora2==4) P0=102;
if (hora2==5) P0=109;
if (hora2==6) P0=125;
if (hora2==7) P0=7;
if (hora2==8 ) P0=127;
if (hora2==9) P0=111;
P2=12;
delay();
P2=0;

if (minuto1==0) P0=63;
if (minuto1==1) P0=6;
if (minuto1==2) P0=91;
if (minuto1==3) P0=79;
if (minuto1==4) P0=102;
if (minuto1==5) P0=109;
if (minuto1==6) P0=125;
if (minuto1==7) P0=7;
if (minuto1==8 ) P0=127;
if (minuto1==9) P0=111;
P2=11;
delay();
P2=0;

if (minuto2==0) P0=63;
if (minuto2==1) P0=6;
if (minuto2==2) P0=91;
if (minuto2==3) P0=79;
if (minuto2==4) P0=102;
if (minuto2==5) P0=109;
if (minuto2==6) P0=125;
if (minuto2==7) P0=7;
if (minuto2==8 ) P0=127;
if (minuto2==9) P0=111;

P2=10;
delay();
P2=0;

if (segundo1==0) P0=63;
if (segundo1==1) P0=6;
if (segundo1==2) P0=91;
if (segundo1==3) P0=79;
if (segundo1==4) P0=102;
if (segundo1==5) P0=109;
if (segundo1==6) P0=125;
if (segundo1==7) P0=7;
if (segundo1==8 ) P0=127;
if (segundo1==9) P0=111;

P2=9;
delay();
P2=0;

if (segundo2==0) P0=63;
if (segundo2==1) P0=6;
if (segundo2==2) P0=91;
if (segundo2==3) P0=79;
if (segundo2==4) P0=102;
if (segundo2==5) P0=109;
if (segundo2==6) P0=125;
if (segundo2==7) P0=7;
if (segundo2==8 ) P0=127;
if (segundo2==9) P0=111;

P2=8;
delay();
P2=0;
}
//****************************************************
void main(){
inicializaTimer0();
while(1){
if(cont==20){
if(segundo2<9) segundo2++;
else{
if(segundo1<5) segundo1++;
else{
if(minuto2<9) minuto2++;
else{
if(minuto1<5) minuto1++;
else{
if(hora1<9) hora1++;
else{
hora1=0;
hora2++;
}

if((hora1==2) && (hora2==4)){
segundo1=0;
segundo2=0;
minuto1=0;
minuto2=0;
hora1=0;
hora2=0;
}
segundo1=0;
}
segundo2=0;
}
cont=0;
}
exibeHora();
}
}
}
}
ele compila e grava... porém, na hora de roda-lo os displays não acendem, só ficam piscando os 6 primeiros displays alguem poderia me ajudar?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor tcpipchip » 06 Ago 2012 22:16

Pelo que vi, voce esquece de programar as portas como SAIDA.
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor renan-papaco » 07 Ago 2012 22:02

tcpipchip escreveu:Pelo que vi, voce esquece de programar as portas como SAIDA.





explique-se como esse poderia ser o meu erro?

se na versão do programa q controla apenas 4 displays, tudo funcionou corretamente... então a versão do programa q controla 6 displays não funcionou pq eu não programei as portas como saida....


poderia apontar meu erro?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor Silvio51 » 09 Ago 2012 20:46

tcpipchip escreveu:Pelo que vi, voce esquece de programar as portas como SAIDA.


Hãm ?

Desde quando precisamos especificar direção dos pinos no 8051 ?
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil

Mensagempor tcpipchip » 10 Ago 2012 10:44

Desde 1980
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor renan-papaco » 10 Ago 2012 14:44

tcpipchip escreveu:Desde 1980


será que alguem poderia me ajudar DE VERDADE?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor renan-papaco » 10 Ago 2012 20:54

acho q esse tcpipchip deve estar confundindo C com ASM...

no C vc não precisa definir portas como entrada ou saída... dependendo do q for fazer... na aplicação aqui não precisaria se fosse preciso definir, eu poderia encontrar essas definições no codigo ORIGINAL do programa... ENTENDA DE UMA VEZ POR TODAS!! NA VERSÃO Q CONTROLA 4 DISPLAYS(o programa q veio de amostra com o kit), O PROGRAMA FUNCIONA NUMA BOA! na versão q controla 6 displays, eles só ficam piscando, aleatoriamente por curtas durações
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor renan-papaco » 11 Ago 2012 15:48

alguem por favor pode me ajudar?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor tcpipchip » 11 Ago 2012 18:43

Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor renan-papaco » 11 Ago 2012 21:55

tcpipchip escreveu:http://electrofriends.com/articles/electronics/microcontroller-electronics-articles/8051-8951/8051-microcontroller-port-programming/


cara, eu não programo em assembler...será q vc n entendeu? eu to tentando fazer o programa em C!!!
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor renan-papaco » 11 Ago 2012 21:56

tcpipchip escreveu:http://electrofriends.com/articles/electronics/microcontroller-electronics-articles/8051-8951/8051-microcontroller-port-programming/


cara, eu não programo em assembler...será q vc n entendeu? eu to tentando fazer o programa em C!!!




a programação de portas eu até sei fazer, mas em C!! alguem REALMENTE pode me ajudar?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor ze » 14 Ago 2012 14:59

dexeu dar um chutes. Me lembro também (vagamente) que não precisa programar a direção dos ports nos 51´s. Mas no entanto me lembro também (vagamente) que quando queria que ele fosse entrada, primeiro eu colocava 1 na saída pois ele não lia direito (mas isso não é regra, é prática).
Código: Selecionar todos
P1=0xff;//na inicialização
ACC=P1;//pronto. agora é entrada
ACC7=P17;//p.ex.

Bom vejamos...Quanto ao seu dilema, só vi a superficie do fonte. Parece que voce está acionando manualmente cada display. Coloque o circuito. Veja se tem erros de montagem. Simule com o proteus. Alguns pinos tem multiplas funções. Verifique se não estão habilitados. etc.

Agora veja esta alternativa mais enxuta...Tente com talela e use a interrupção para posicionar os caracteres indexadamente
Código: Selecionar todos
const char tabela[]={63,6,91...}; //padrão de 0 a 9
char dig[4];

e na interrupt
Código: Selecionar todos
char i;
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms, para displays 7seg, melhor + rápido
TL0=0x00; //B0
TR0=1;
...
P0=tabela[dig[i]];//digito indexado
P2=i;//supondo que o 138 está nos pinos P2.2,P2.1,P2.0
i++;if (i>3) i=0;
...
}

no loop tente
Código: Selecionar todos
void main (void)
{
char a;
...
...
for(;;)
{
dig[0]=a/10; ///só p. teste
dig[1]=a%10;
a++;
delay(500); //p.ex.
}
}

como dica final, NÃO GRITE, SEJA MAIS GENTIL E CONSEGUIRÁS MAIS AJUDA!
boa sorte
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor mastk » 14 Ago 2012 16:48

Renan, em uma lida rapida em seu codigo eu tambem não estou vendo aonde vc seta a direção das portas, aparentemente é só isso que precissa para seu codigo funcionar.

Eu não sei qual o nome dos registro em C, que irão fazer o que quer, dá uma olhada na documentação do seu Compilador ou no livro que estiver baseando seus estudos.

O codigo do Kit tambem não inicia as portas, isso é bem estranho porque é algo fundamental, a não ser que seu 8051 esteja rodando sem portas, apenas com o barramento externo, em outro topico vc queria gravar uma memoria 27xx, é esse o seu caso?
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor andre_luis » 15 Ago 2012 08:20

Ajudaria se tivesse um esquema do circuito.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor renan-papaco » 16 Ago 2012 18:59

andre_teprom escreveu:Ajudaria se tivesse um esquema do circuito.


+++



eu vou postar o esquema... eu não tenho proteus, n sei bem como usa-lo... eu nunca tive oportunidade de fazer algum curso decente ou ter alguem pra me ajudar, programação nunca foi meu forte...eu comprei o meu kit e veio com varios codigos de exemplo, incluindo o do referido contador de 4 digitos... eu só modifiquei pra multiplexar 6 displays em vez de 4... vo postar o diagrama esquemático pra vocês verem então...
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Próximo

Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x