LusoRobótica - Robótica em Português
Sistemas específicos => 8051 => Tópico iniciado por: metRo_ em 03 de Novembro de 2009, 09:34
-
Estou com alguns problemas em colocar a porta série a mandar seja o que for no 8051.
O código que o meu prof. tinha nos slides era:
And tmod, #0fh
Orl tmod, #10H
Mov TH1, #0FDH
mov TL1, #0FDH
Setb TR1
Anl PCON, #7FH
Mov SCON, #01010000H
ENVIA: clr TI; Rotina para enviar pela porta série
mov sbuf, A
Xx: jnb TI, xx
ret
REC: jnb RI, REC ; rotina de recepção
mov a, sbuf
clr RI
reti
No primeiro bloco de código ele define a porta série em modo 1, definindo o timer e os registos associados ao controlo da porta série.
Depois em envia ele ao mover para dentro do registo sbuf algo a porta serie devia enviar isso, certo?
O que vos parece que falta? :S
-
Eia 8051, brings back memories :P
Ora vamos lá ver hmm
Sim a porta série enviaria isso... Isso é um problema, saber o que falta aí? Assim agora rapidamente não me parece que falte definir nada... (supondo claro que deverás ter aí uma main para fazer o CALL ENVIA)
Agora tou na uni, quando chegar a casa vejo melhor isso ;)
-
explica la melhor como crio o main para fazer o call do envia. Eu nos testes estava a fazer call envia no final das configurações da porta série. É que ainda estou muito verde em ASM :D
-
Eu nos testes estava a fazer call envia no final das configurações da porta série.
Se não me engano, é isso mesmo. As rotinas são tipo "funções". Tens o código principal do programa em que chamas essas mesmas funções. Neste caso tens o código inicial de inicialização da porta série e depois chamas as rotinas ENVIA e REC conforme te der jeito e as vezes que quiseres.
-
CSEG AT 00h
CALL ENVIA
JMP $
Tentaste assim?
-
so tinha escrito mesmo CALL ENVIA.
Podes enquadrar esse código no que psotei lá em cima? :-[
-
CSEG AT 00h
jmp main
CSEG AT 50h
main: CALL CONF_SERIE
CALL ENVIA
JMP $
CONF_SERIE:
And tmod, #0fh
Orl tmod, #10H
Mov TH1, #0FDH
mov TL1, #0FDH
Setb TR1
Anl PCON, #7FH
Mov SCON, #01010000H
RET
ENVIA: clr TI; Rotina para enviar pela porta série
mov sbuf, A
Xx: jnb TI, xx
ret
REC: jnb RI, REC ; rotina de recepção
mov a, sbuf
clr RI
reti
Aquele primeiro And n devia ser Anl?
Talvez seja melhor habituares-te a uma norma, ou tudo em caps ou não, e fazer comentários úteis (comentar MOV A,B com move de a para b não é mt útil). Acredita que quando tiveres um código de 500 linhas vai fazer muita diferença!
-
Build target 'Target 1'
assembling portacom.a...
portacom.a(8): error A9: SYNTAX ERROR
portacom.a(25): warning A41: MISSING 'END' STATEMENT
Target not created
A contagem das linhas começa em 1
Eu suponho que o And que o meu prof tem no slide seja Anl e o END onde devo colocaR?
Edit:
Alterando o And para Anl fica:
CSEG AT 30h
main: CALL CONF_SERIE
CALL ENVIA
JMP $
CONF_SERIE:
Anl tmod, #0fh
Orl tmod, #10H
Mov TH1, #0FDH
mov TL1, #0FDH
Setb TR1
Anl PCON, #7FH
Mov SCON, #01010000B
RET
ENVIA: clr TI; Rotina para enviar pela porta série
mov sbuf, A
Xx: jnb TI, xx
ret
REC: jnb RI, REC ; rotina de recepção
mov a, sbuf
clr RI
ret
e já não da erro:
Build target 'Target 1'
linking...
Program Size: data=8.0 xdata=0 code=43
"ze" - 0 Error(s), 0 Warning(s).
Vou testar
-
não funca :S
-
O END esqueci-me, é no fim de tudo!
Hmm, mas não funciona porque? Tás a testar numa placa ou a simular isso? Mais logo à noite se quiseres instalo o keil e testo.
-
Estou a programar no Keil mas não percebo muito do debug disto, estou a testar mesmo na placa.
O seguinte código embora não imprima grande coisa, imprime alguma coisa mas nada do que mando :)
START:
mov TMOD, #20H ;T1 is mode2
mov TH1, #0fdH ;9600 baud
mov SCON, #50H ;8b, 1stop, 1start, REN enabled
anl PCON, #07fh ;To make SMOD =0
setb TR1 ;start T1
AGAIN:
mov SBUF, #"A" ;letter A is transmitted
HERE:
jnb TI, HERE ;poll TI until all the bits are transmitted
clr TI ;clear TI for the next character
sjmp AGAIN ;while(1)
END
Vi na net.
-
START:
mov TMOD, #20H ;T1 is mode2
mov TH1, #0FDH ;9600 baud
mov SCON, #50H ;8b, 1stop, 1start, REN enabled
anl PCON, #07fh ;To make SMOD =0
setb TR1 ;start T1
AGAIN:
mov SBUF, #"A" ;letter A is transmitted
HERE:
jnb TI, HERE
clr TI ;clear TI for the next character
END;
Este está a funcionar pelo menos para enviar, tenho que ver se percebo isto agora, se alguem quiseres ajudar esteja à vontade ;)
Obrigado tyran
Vi neste link: http://www.freewebs.com/maheshwankhede/rs232.html (http://www.freewebs.com/maheshwankhede/rs232.html)
-
Ainda bem que conseguiste ;)
Não tens assim o código exactamente como aí está pois não?
-
está um pouco diferente, basicamente uso:
-isto para configurar a porta serie:
ini_pserie: mov scon, #50h
anl tmod, #0fH
orl tmod, #20h
mov th1, #0fdh
mov tl1, #0fdh
anl pcon, #7fh
setb tr1
-isto para enviar:
send_char: clr ti
mov sbuf, a
jnb ti, $
ret
-Um exemplo para imprimir 1 em ascii
mov a, #31h
call send_char
-
Era mais por não teres main nem nada lol