Ajuda com programação 8051

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Ajuda com programação 8051

Mensagempor Renan Matsuda » 19 Abr 2010 20:54

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
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19

Mensagempor Renan Matsuda » 19 Abr 2010 21:03

Eu esqueci de falar eu tenho conhecimentos em assemby ! :)
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19

Mensagempor Francesco » 19 Abr 2010 21:59

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Renan Matsuda » 20 Abr 2010 13:40

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 :D
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19

Mensagempor Francesco » 20 Abr 2010 13:50

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?
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Renan Matsuda » 20 Abr 2010 14:00

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
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19

Mensagempor Francesco » 20 Abr 2010 14:08

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.
8) 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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Renan Matsuda » 20 Abr 2010 14:13

okk eu só nao entendi as partes 11,12 e 13 converter para que ?
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19

Mensagempor Renan Matsuda » 20 Abr 2010 14:15

Seria converter para hex e depois "juntar " os dados ?
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19

Mensagempor Francesco » 20 Abr 2010 14:21

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Renan Matsuda » 20 Abr 2010 14:25

Ahh Agora está claro, muito obrigado Francesco pela paciência e pela atenção.

Abraços Renan :)
Renan Matsuda
Bit
 
Mensagens: 7
Registrado em: 18 Abr 2010 08:19


Voltar para 8051

Quem está online

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

x