Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Microcontroladores => Tópico iniciado por: pedrodacruz em 09 de Dezembro de 2007, 17:55
-
Estou fazendo um projeto da escola onde é necessário fazer um relógio, o problema é que eu não estou conseguindo colocar nem uma menssagem na tela do display do meu simulador(proteus). Gostaria que alguém me ajudasse a discubrir o que está errado no meu código(se está).
Observação: o display é conectado diretamento no microcontrolador, ficando a porta p0 reservada para dados e p2 para configuração.
Por favor!!!! Se alguém tiver um código semelhante que comunique diretamente com o display, me mandem!!!!
TEMPO EQU 60535 ;5.000mcrs
TEMPO2 EQU 15535 ;50.000mcrs
EN EQU P2.2
RW EQU P2.1
RS EQU P2.0
TECLA0 EQU 0500H ;ENDEREÇO DA EPROM em que esta "tecla0"
TECLA1 EQU 0510H ;ENDEREÇO DA EPROM em que esta "tecla1"
TECLA2 EQU 0520H ;ENDEREÇO DA EPROM em que esta "tecla2"
TECLA3 EQU 0530H ;ENDEREÇO DA EPROM em que esta "tecla3"
ORG 0000H
MOV R0,#0FFH ;INICIA R0
LJMP INICGERAL
ORG 0030H ;INICIA R0
AJUSTAR0: MOV R0,#0FFH
INICGERAL:
MOV SP,#30H
MOV TMOD, #11H ;TIMER 0 E TIMER 1 NO MODO 1
MOV DPTR,#8000H ;ENDEREÇO QUALQUER DO PORT 0 PARA DISPARAR O WR\
INC R0 ;COMO UM PSEUDO I/O MAPEADO.
CJNE R0,#04H,INICIO
JMP AJUSTAR0
;INICIALIZAÇÃO DO DISPLAY
INICIO:
CALL INIC_DISPLAY ;INICIALIZA DISPLAY
CLR RS
MOV A,#80H ;ESCREVE "INSTRUÇÃO" NO DISPLAY
CALL WRCAR ;POSICIONAR O CURSOR
SETB RS ;MUDA PARA "DADOS" NO DISPLAY
TECLAP0: CJNE R0,#00H,TECLAP1
MOV DPTR,#TECLA0 ;CARREGA ENDEREÇO DA STRING MSG0
CALL WRITESTRING ;ESCREVE MENSAGEM (ESTÁ APARECENDO APENAS UM NEGÓCIO PRETO)
CALL ATRASO ;CHAMA ATRASO
CALL LIMPA ;POSICIONA CURSOR (APARECE O CURSOR)
TECLAP1: CJNE R0,#01H,TECLAP2
MOV DPTR,#TECLA1 ;CARREGA ENDEREÇO DA STRING MSG1
CALL WRITESTRING ;ESCREVE MENSAGEM
CALL ATRASO ;CHAMA ATRASO
CALL LIMPA ;POSICIONA CURSOR
TECLAP2: CJNE R0,#2H,TECLAP3
MOV DPTR,#TECLA2 ;CARREGA ENDEREÇO DA STRING MSG2
CALL WRITESTRING ;ESCREVE MENSAGEM
CALL ATRASO ;CHAMA ATRASO
CALL LIMPA ;POSICIONA CURSOR
TECLAP3: CJNE R0,#3H,RETORNA
MOV DPTR,#TECLA3 ;CARREGA ENDEREÇO DA STRING MSG2
CALL WRITESTRING ;ESCREVE MENSAGEM
CALL ATRASO ;CHAMA ATRASO
CALL LIMPA ;POSICIONA CURSOR
RETORNA: LJMP INICGERAL
;###################################################################################
; SUB-ROTINAS
INIC_DISPLAY:
CLR RS ;ESCREVE INSTRUÇÃO NO DISPLAY
MOV A,#38H ;00111000B
CALL WRCAR
MOV A,#38H ;IDEM ACIMA
CALL WRCAR
MOV A,#06H ;00000110B
CALL WRCAR
MOV A,#0EH ;00001110B
CALL WRCAR
MOV A,#01H ;00000001B(LIMPA DISPLAY)
CALL WRCAR
MOV A,#0CH ;DESLIGA CURSOR
CALL WRCAR ;ESCREVE DADOS NO DISPLAY
SETB RS
CALL T5MS ;CHAMA ATRASO 5ms
RET
WRCAR:
PUSH DPL ;SALVA NA PILHA ÚLTIMO DPTR UTILIZADO(LOW)
PUSH DPH ;SALVA NA PILHA ÚLTIMO DPTR UTILIZADO(HIGH)
MOV DPTR,#8000H ;GERA ENDEREÇO DE I/O MAPEADO
MOVX @DPTR,A ;ESCREVE DADO NO LCD COMO SE FOSSE I/O MAPEADO
POP DPH ;RETORNA DA PILHA ÚLTIMO DPTR UTILIZADO
POP DPL ;RETORNA DA PILHA ÚLTIMO DPTR UTILIZADO
LCALL T5MS ;CHAMA TEMPO DE ESPERA.
RET
ATRASO:
MOV R2,#10D ;CONTADOR DE lOOPS EM VOLTA DO TIMER1
DENOVO:
MOV TL1,#LOW(TEMPO2)
MOV TH1,#HIGH(TEMPO2)
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
DJNZ R2, DENOVO
RET
WRITESTRING:
MOV A,#00H
MOVC A,@A + DPTR ;"VARRE"(INCREMENTA) O DPTR ATÉ QUE ENCONTRE A LETRA "$" E AÍ PÁRA DE LER
CJNE A,#'$',WRITE_NEXT
SJMP FINIS_STRING
WRITE_NEXT:
CALL WRCAR
CLR RS ;ESCREVE INSTRUÇÃO NO DISPLAY
MOV A,#14H ;00001100B
CALL WRCAR ;DESLOCA O CURSOR
SETB RS ;DESABILITA INTRUÇÕES
INC DPTR
SJMP WRITESTRING
FINIS_STRING:
RET
T5MS:
MOV TL0,#LOW(TEMPO)
MOV TH0,#HIGH(TEMPO)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
LIMPA: CLR RS ;ESCREVE NO MODO "INSTRUÇÃO", POSICIONA O CURSOR
MOV A,#80H ;ESCREVE INSTRUÇÃO QUE ESTÁ EM A.
CALL WRCAR ;ESCREVE INSTRUÇÃO QUE ESTÁ EM A.
SETB RS ;VOLTA PARA O MODO DE ESCREVER "DADOS".
RET
ORG TECLA0 ;ENDEREÇO DO LABEL "TECLA0": VIDE NO INÍCIO OS EQUATES.
DB 'TECLA0$' ;INTRUÇÃO PARA DIZER QUE EM SEGUIDA DELA VEM O TEXTO DO ENDEREÇO DADO POR "TECLA0".
ORG TECLA1 ;IDEM ACIMA.
DB 'TECLA1$'
ORG TECLA2
DB 'TECLA2$'
ORG TECLA3
DB 'TECLA3$'
END
-
Vé se isto te ajuda:
(http://img502.imageshack.us/img502/3311/inicializaolcdfq8.th.png) (http://img502.imageshack.us/my.php?image=inicializaolcdfq8.png)
E EQU P3.5
RW EQU P3.6
RS EQU P3.7
ORG 0
MOV TMOD,#00000001B
SETB TR0
CLR E
CLR RW
CLR RS
LCALL ENVIA
MOV P1,#00111000B
LCALL ENVIA
MOV P1,#00001111B
LCALL ENVIA
MOV P1,#00000001B
LCALL ENVIA
MOV P1,#00000110B
LCALL ENVIA
setb rs
MOV P1,#'a'
lcall envia
LJMP $
ENVIA: SETB E
NOP
NOP
NOP
CLR E
MOV TH0,#HIGH(65536-1843)
MOV TL0,#LOW(65536-1843)
CLR TF0
JNB TF0,$
RET
-
Ola Pedro,
Se vc conectou o LCD direto na micro, porque este I/O mapeado na rotina "WRCAR"?
vc pode trocar tudo o que ta la dentro por isso:
WRCAR:
mov p0,a
lcall t5ms
ret
Se não me engano, a porta P0 necessita de PULL-UP externo...
Anexa seu esquema do Proteus, que eu dou uma olhada e testo aqui...
Trevis
-
heim?
vcs são doidos?
que é isso afinal?
alguem querendo usar om lcd na cnc?
Não entendi nada do código.. qual a linguagem?
-
Cara isto é assembly linguagem de programação para microcontroladores/microprocessadores.
E esse codigo ai em cima serve para inicializar um Display LCD para depois de inicializado podermos escrever nele o que quizermos.
-
hum...
interessante...
vou acompanhar....
-
Também estou usando um LCD para informação horária e de temperatura.
Mas meu problema é a aquisição dos dados de temperatura atravez de um TC77 da Microchip que acontece é que com o meu 8051 DS89C450 não estou a conseguir comunicar atravez do protocolo SPI do sensor.
Deixo abaixo a subrotina de aquisição para alguém me dar uma força.
LE_TEMP:
CLR CS
CLR CLK
NOP
NOP
NOP
NOP
NOP
LCALL TEMP_CLK
JB SI,SINAL_NEG
MOV R0,#29h
MOV @R0,#251
LJMP NOT_BITE
SINAL_NEG:
MOV R0,#29h
MOV @R0,#253
MOV R0,#1Eh
MOV @R0,#0
NOT_BITE:
LCALL TEMP_CLK
MOV R0,#1Eh
MOV A,@R0
JB SI,SI_HIGH
LJMP TEST_8BIT
SI_HIGH:
INC A
TEST_8BIT:
INC R6
CJNE R6,#8,BIT_8
LJMP BIT_NOT8
BIT_8: RL A
BIT_NOT8:
MOV R0,#1Eh
MOV @R0,A
CJNE R6,#8,NOT_BITE
SETB CS
LCALL CONVERT_TEMP
MOV R6,#0
RET
TEMP_CLK:
CLR CLK
MOV TL2,#LOW(65536-46083)
MOV TH2,#HIGH(65536-46083)
CLR T2CON.7
JNB T2CON.7,$
;NOP
;NOP
;NOP
;NOP
;NOP
SETB CLK
RET
-
Grande,
Também estou usando um LCD para informação horária e de temperatura.
Mas meu problema é a aquisição dos dados de temperatura atravez de um TC77 da Microchip
Não conheço este componente. As informações que vou colocar embaixo se baseiam no que entendi do datasheet dele, tá?
-R6 não é inicializado (com 0, acho),
-SI TEM QUE ESTAR EM NIVEL ALTO para que o dado seja lido corretamente
-Se a temperatura for positiva, a variável em 1Eh não é inicializada
Posso dar umas dicas de programação?
Você usou:
MOV R0,#29h
MOV @R0,#251
ACHO que estas 2 instruções podem ser substituídas por:
MOV 29h,#251
Isso também vale para:
MOV R0,#1Eh
MOV A,@R0
Seria melhor usar:
MOV A,1Eh
O contador de loop é mais eficiente se você usar:
MOV R6,#8
LOOP:
xxx
xxx
xxx
DJNZ R6,LOOP
A instrução DJNZ decrementa o R6 e se, após decrementar, tiver valor diferente de 0, executa um JP LOOP
Você tem 8 registradores R0..R7. Use-os para variáveis temporárias ao invés de usar a RAM interna (1Eh e 29h). Após a leitura da temperatura, transfira o valor que está neste registrador para a RAM.
Espero ter ajudado :)
Abraços,
Rudolf
-
Valeu grande Rudolf.
Vou ler com mais atenção todas as suas dicas e depois tentar solucionar meu problema.
Ao longo da tarde posto como as coisas vão por aqui.
Um abraço e Obrigado
-
Boa tarde de novo Rudolf.
-R6 não é inicializado (com 0, acho),
Sim isso esta a acontecer no inicio do codigo.
-SI TEM QUE ESTAR EM NIVEL ALTO para que o dado seja lido corretamente
Pode explicar melhor, tenho que por o SI/O a nivel alto tes de uma aquisição de dados?
Ja tentei e tambem não tenho mudanças significativas.
O que esta a acontecer é o seguinte eu tento ler o valor do sensor e guardo na RAM onde estão guardados os valores da seguinte forma (23:59:23 +022ºC) em 15 espaços de memoria de 0x20h a 0x2Eh.
Depois o que estou a visualizar é o relogio a funcionar devidamente
e a temperatura a variar de valor entre 255 e 0.
-
Uma rotinazinha para estudo de um calendário.
; Este eh um exemplo de Calendário, com resolucao em segundos
; A Calendário deve ser chamada a cada 1 segundo
; Fabio Trevisan, 28/06/2001
;Variáveis utilizadas pelo calendário
segundo equ 08h ;variavel segundos
minuto equ 09h ;variavel minutos
hora equ 0ah ;variavel horas
dia equ 0bh ;variavel dias
mes equ 0ch ;variavel mes
ano equ 0dh ;variavel ano
temp equ 0eh ;variavel temporaria para calculo dos dias
;***********************************************************************************
; Rotina Calendário
;
;***********************************************************************************
;Ja Fe Mr Ab Ma Ju Jl Ag St Ot Nv Dz
diasmes: db 00,32,29,32,31,32,31,32,32,31,32,31,32
Calendario:
mov r0,#segundo ;r0 aponta para segundos
inc segundo ;incremento segundos
cjne @r0,#60,Sai ;se=60 então zera e incrementa minutos
;minutos
inc r0 ;r0 aponta para minutos
mov segundo,#0 ;zero os segundos
inc minuto ;incremento minutos
cjne @r0,#60,Sai ;se=60 então zera e incrementa horas
;horas
inc r0 ;r0 aponta para horas
mov minuto,#0 ;zero os minutos
inc hora ;incremento horas
cjne @r0,#24,Sai ;se=60 então zera e incrementa dias
;dias
inc r0 ;r0 aponta para dias
mov hora,#0 ;zero as horas
inc dia ;incremento dias
mov a,mes ;descubro quantos dias tem o mes
mov dptr,#diasmes ;para comparar corretamente
movc a,@a+dptr ;pego o numero de dias da tabela diasmes
mov temp,a ;coloco o numero de dias na variavel temp
mov a,dia ;carrego dia para a comparacao
cjne a,temp,Sai ;se=28,30 ou 31 então dia=1 e incrementa mes
;meses
inc r0 ;r0 aponta para mes
mov dia,#1 ;o mes começa no dia primeiro!
inc mes ;incremento mes
cjne @r0,#13,Sai ;se=13 então zera e incrementa anos
mov mes,#1 ;mes=1 pois nao existe mes zero!
inc ano ;incremento ano
Sai:
ret
-
Senhores da eletônica, programação e microcontroladores, deixe-me expor meu problema...
Estou querendo fazer um mostrador digital de rpm do meu spindle, mas usando como referencia a tensão do potenciometro de saida do meu invresor de frequencia cfw-10, este potenciometro é de 5k e trabalha de 0 a 10V, a minha idéia é converter essa tensão em numeros de 0 a 18.000 no display, ou seja 0V = 0 RPM e 10V = 18.000 RPM, alguém pode me ajudar a programar e a construir um circuito destes?
-
Guga,
Veja no manual do seu CFW10 o parametro 208 - ajustando-o, o mostrador do proprio CFW10 pode mostrar por exemplo a rpm do spindle...
-
Boa tarde...
Meu nome é junior e estou fazendo um trabalho de escola e gostaria de saber se alguém possui uma rotina de relógio digital.
Desde já agradeço a atenção
Júnior