Página 1 de 1
Ajuda com programação 8051

Enviado:
19 Abr 2010 20:54
por Renan Matsuda
Olá a todos, sou novato nos mC, eu estou encontrando dificuldades para fazer um software, bem vou explicar tudo.
Eu possuo um sensor ultrasonico com uma saída serial de 5 codigos ASCII:
R X X X ENTER ,
onde os "X"s correspondem a distancia em polegadas de até 255, tanto em polegadas como em ASCII, porem eu preciso fazer um programa que que acione um port de 000 até 060, ou seja, fique setado nesse valor e quando ultrapassar ele vá para zero.
Eu estou utilizando um 89s52 e pretendo usar o port p3.0 (RX) como o receptor desse sinal.
Não estou conseguindo pensar em uma lógica para fazer isso.
Espero que eu tenha me esclarecido bem e agradeço desde de já.
Abraços Renan

Enviado:
19 Abr 2010 21:03
por Renan Matsuda
Eu esqueci de falar eu tenho conhecimentos em assemby !


Enviado:
19 Abr 2010 21:59
por Francesco
Ok, não é difícil... só um pouco trabalhoso por ser em assembly.
Primeiramente você precisa fazer o recebimento do dado pela serial, ou seja, precisa configurar a serial.
Neste link há um pequeno tutorial de como configura-lo em assembly.
http://www.8052.com/tutser.phtml
Quando receber os dados, vamos para a próxima parte, ok?
Francesco

Enviado:
20 Abr 2010 13:40
por Renan Matsuda
Vai ficar no modo 0, logo SCON ficará igual a #10h.
eu nao quero transmitir nada em serial apenas receber e dar um comando em um port.
Obrigado e aguardo continuação


Enviado:
20 Abr 2010 13:50
por Francesco
Mesmo que você não vá transmitir, tem que fazer a configuração do clock correntamente. Que cristal você está usando?
O próximo passo pe fazer a máquina de recepção dos dados. Pelo que você falou, ele sempre vai ter o mesmo formato, não é?
RXXX<Enter>
XXX pode variar de 000 a 999, correto? E o enter vai ser 0Dh e 0A, ou só 0Dh ou só 0A? Qual deles?
Assim que você passar essas informações, continuamos, ok?

Enviado:
20 Abr 2010 14:00
por Renan Matsuda
Estou usando um cristal de 12 MHz.
Na verdade ele pode variar de 000 a 255, pois 255 é a distância máxima em polegadas que o sensor consegue verificar.
O enter é o ASCII 13 que é o 0D apenas.
Agradeço a atenção

Enviado:
20 Abr 2010 14:08
por Francesco
Ok... então a rotina é mais simples. Se ele não for fazer mais nada além disso, dá para fazer um laço infinito no programa principal, sem a necessidade da interrupção. Por exemplo...
: INICIO
1) Aguarda dado.
2) Se não for 'R', volta a INICIO.
3) Aguarda dado.
4) Guarda dado Centena.
5) Aguarda dado.
6) Guarda dado Dezena.
7) Aguarda dado.

Guarda dado Unidade.
9) Aguarda dado.
10) Se não for <enter>, volta a INICIO.
11) Converne centena.
12) Converte dezena.
13) Converte unidade.
14) Se "<= 60", seta P1_0.
15) Se "> 60", zera p1_0
16) Volta INICIO.
O que acha? Atende à sua necessidade?
Francesco

Enviado:
20 Abr 2010 14:13
por Renan Matsuda
okk eu só nao entendi as partes 11,12 e 13 converter para que ?

Enviado:
20 Abr 2010 14:15
por Renan Matsuda
Seria converter para hex e depois "juntar " os dados ?

Enviado:
20 Abr 2010 14:21
por Francesco
Então... estou entendendo que você vai receber os números em ASCII. Por exemplo, o dado:
R012<ENTER>
Você recebe como...
52 30 31 32 0D
Os dados 30 31 32 são seu 012, ou 12. Se você converter os 3 bytes para um só, fica mais fácil de tratar.
Fica assim... imagina que você tem as centenas em R3, as dezenas em R2 e as unidades em R1 e você quer transformar isso para um número em R0. primeiro você converte de ASCII para um número, e depois coloca ele no devido lugar (centena, dezena ou unidade).
R3 = R3 - 30h // Como ele é 30, vai virar 0)
R2 = R2 - 30h // Como ele é 31, vai virar 1)
R1 = R1 - 30h // Como ele é 32, vai virar 2)
R3 = R3 * 100 // Para transformar em centena
R2 = R2 * 10 // Para transformar em dezena
R1 // Não faz nada, pois ele já é unidade.
R0 = R3 + R2 + R1
Agora você tem em R0 o número 12, pode usar o CJNZ por exemplo. R0 vai ter valores de 0 a 255.
Francesco

Enviado:
20 Abr 2010 14:25
por Renan Matsuda
Ahh Agora está claro, muito obrigado Francesco pela paciência e pela atenção.
Abraços Renan
