Olá, galera,
Estou tentando simular o microcontrolador 8051 acionando 4 displays de 7 segmentos no Proteus, mas de modo algum eu consigo fazer com que os displays pareçam estar acionados simultaneamente. Consegui fazer um contador crescer e decrescer através de interrupções, mas os displays ficam piscando sequencialmente, mas não ficam como se estivessem acionados ao mesmo tempo. Alguém dá uma dica de como resolver? Imagem do circuito anexada.
Código usado:
TEMPO EQU 48353 ;define 17182us p/ cristal de 12MHz
TEMPO2 EQU 60535 ; define 5.000 us p/ cristal de 12MHz
DISPLAY1 EQU 11100000B ;escreve no display 1
DISPLAY2 EQU 11010000B ;escreve no display 2
DISPLAY3 EQU 10110000B ;escreve no display 3
DISPLAY4 EQU 01110000B ;escreve no display 4
ORG 0000H
LJMP INICIO
;##### ROTINA PARA INT0(Crescente) #####
ORG 0003H
MOV R6,#00H
RETI
;##### ROTINA PARA INT1(Decrescente) #####
ORG 0013H
MOV R6,#01H
RETI
ORG 0040H
INICIO:
MOV IE,#85H ;HABILITANDO INT0
MOV TCON,#5H ;BORDA INT0
MOV TMOD,#11H ;timer0 e timer1 no modo 1
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV R6,#00H
X:
LCALL CONTADOR
LJMP X
;############################################################################
;
; Faz a contagem de 0 a 9 em cada digito incrementando
;
ORG 0060H
CONTADOR:
CJNE R6,#00H,LBL1 ;Crescente 01, dec 00
LCALL ESCREVE
INC R0 ; incrementa R0
CJNE R0,#0AH,CONTADOR ; verifica se R0 chegou em 10
MOV R0,#00H
INC R1
CJNE R1,#0AH,CONTADOR
MOV R0,#00H
MOV R1,#00H
INC R2
CJNE R2,#0AH,CONTADOR
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
INC R3
CJNE R3,#0AH,CONTADOR
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
LCALL CONTADOR
RET
;############################################################################
;
; Faz a contagem de 9 a 0 em cada digito decrementando
;
CONTADOR3:
LBL4: DEC R3
LBL3: DEC R2
LBL2: DEC R1
LBL1: CJNE R6,#01H,CONTADOR
DEC R0
LCALL ESCREVE
CJNE R0,#00H,LBL1
MOV R0,#0AH
CJNE R1,#00H,LBL2
MOV R0,#0AH
MOV R1,#0AH
CJNE R2,#00H,LBL3
MOV R0,#0AH
MOV R1,#0AH
MOV R2,#0AH
CJNE R3,#00H,LBL4
MOV R0,#0AH
MOV R1,#09H
MOV R2,#09H
MOV R3,#09H
;LCALL ESCREVE
;LCALL LBL1
RET
;############################################################################
;
; Escreve os dados no PORT1
;
ESCREVE:MOV R7,#0fh
V2: CLR TR1
CLR TF1
MOV TL1,#LOW(TEMPO2)
MOV TH1,#HIGH(TEMPO2)
SETB TR1
MOV A,00H
ORL A,#DISPLAY1 ;11100000B escreve no display 1
MOV P1,A
LCALL ATRASO
MOV A,01
ORL A,#DISPLAY2 ;11010000B escreve no display 2
MOV P1,A
LCALL ATRASO
MOV A,02
ORL A,#DISPLAY3 ;10110000B escreve no display 3
MOV P1,A
LCALL ATRASO
MOV A, 03
ORL A,#DISPLAY4 ;01110000B escreve no display 4
MOV P1,A
LCALL ATRASO
JNB TF1,$
CLR TR1
CLR TF1
DJNZ R7,V2
RET
;############################################################################
;
; Perde 17 ms
ATRASO: CLR TR0
CLR TF0
MOV TL0,#LOW(TEMPO)
MOV TH0,#HIGH(TEMPO)
SETB TR0
JNB TF0,$
CLR TF0
RET
END
Tags:
Você deve esta multiplexando os segmentos com os displays.
Por isso fica piscando...
Obrigado, amigo pela dica! Verifiquei a possibilidade, mas foi necessário trocar o display da simulação!
Vc tem no simulador como medir a frequencia no pino que energiza o display ? deveria dar 1 pulso a cada 17ms ou pouca coisa mais.
Meu palpite é que para a apresentação não é possivel um simulador fazer na velocidade real do microcontrolador. O pulso estaria sendo gerado numa frequencia menor.
De qualquer forma minha sugestão seria rodar num protoboard. Hj com os 8051 flash serial fica mais fácil. Vide 80C8252
Ainda, uma simplificação: Se vc vai fazer o display multiplexado, ou seja: Vali ligar só 1 de cada vez, nao precisa de 1 ci de demux para cada display. Vc pode usar 1. Colocar os displays em paralelo depois do CI.
Concordo com a idéia de colocar os displays em paralelo, mas esse ci 4511 é um conversor BCD para 7 segmentos (evita mapear os pinos para segmentos).
De fato, nenhum integrado é preciso... Vc pode usar o microcontrolador pra gerar os pulsos corretamente.
Em função da saída do 8051 ser normalmente só dreno de corrente (transistor ao GND) pode ser preciso um transistor no pino comum (Anodo) para correto funcionamento, mas só o microcontrolador basta.
Retificando a informação que passei anteriormente, são exemplos de 8051 que facilmente podem ser ligados em protoboard pq podem ser gravados pela serial (de forma similar a um arduino, só que com o programa adequado:
Da atmel (o 80C8252 na verdade se chamava 89S8252 e saiu de linha para dar lugar ao 89S8253).
http://www.atmel.com/products/microcontrollers/8051Architecture/fla...
Da NXP (Philips):
Todos 89LCPxxx
Ex:
http://www.nxp.com/documents/data_sheet/P89LPC933_934_935_936.pdf
Mas o uso em protoboard fica limitado em função da indisponibilidade de versões DIP (só tem SMD).
Exemplos de ligação sem integrados externos podem ser encontrados em:
https://www.google.com.br/search?#q=8051+7+segments+circuit&tbm...
O projeto era somente para ser simulado, não era necessário montar de fato o circuito. Verifiquei as dicas e observações, fiz algumas mudanças como a redução no número de ci's necessários. O problema continuou, fizemos uma alteração no display usado na simulação, então funcionou corretamente.
Muito obrigado a todos pela colaboração, com certeza levarei os conselhos daqui para outras situações!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por