Página 1 de 2

problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 07:22
por VMS
bom dia pessoal, seguinte
estou usando um microcontralador Pic16f877A para receber uma valor analogico de 0 a 10v e enviar pela porta serial
Código: Selecionar todos
printf("%f",valor_float);


Tenho uma aplicação delphi usando o componente ComPort para receber esse valor
o problema é que esse valor está vindo quebrado, por exemplo
se o valor for 2.22, ele envia 2 e depois envia .22

Não sei se o problema é no programa do Pic ou na aplicação Delphi, alguem pode me dar uma ajuda?

desde ja agradeço.

Re: problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 09:19
por vtrx
Que eu saiba a serial envia bytes e voce deve montá-los.

Re: problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 10:07
por andre_luis
VMS,


Um tiro no escuro :

Provavelmente o compilador pode estar fazendo a conversão para float durante a execução do printf.
Experimenta converter o valor para string primeiro, e depois então enviar o texto pela serial.


+++

Re: problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 12:13
por VMS
Que eu saiba a serial envia bytes e voce deve montá-los.


vtrx, voce poderia me explicar melhor como montar isso?

Re: problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 12:55
por vtrx
Voce fez um teste usando um memo para ver quantos valores recebe?
Oque voce utilza para receber os bytes da serial,um memo ou uma variavel String?
Voce está capturando os bytes pelo 'ReceiveCallBack' do componente?

Re: problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 13:09
por VMS
Voce fez um teste usando um memo para ver quantos valores recebe?

sim ja fiz, supomos que o valor recebido seja 1.23
o memo receberá assim:
1.231.231.231.231.231.23
se eu usar quebra de linha, o memo receberá assim:
1
.23
1
.23
1
.23


Oque voce utilza para receber os bytes da serial,um memo ou uma variavel String?

uma variavel string

Voce está capturando os bytes pelo 'ReceiveCallBack' do componente?


no delphi eu recebo assim com o componente ComPort
Código: Selecionar todos
procedure TFPrincipal.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  str : String;
begin
  ComPort1.ReadStr(str, Count);
end;


esse é o codigo que uso para obter o valor analogico e enviar pela serial no pic
Código: Selecionar todos
  //Lê o canal 0 - pino RA0.
  valor_float = read_adc();                 
  valor_float = (valor_float*10);
  valor_float = (valor_float/1023);
  printf("%f",valor_float);

Re: problema ao enviar valor analogico

MensagemEnviado: 14 Jul 2013 20:08
por vtrx
Qual o resultado da String:
Código: Selecionar todos
ComPort1.ReadStr(str, 2);

?
Talvez voce possa resolver no código no PIC:
Código: Selecionar todos
printf("%f",valor_float\n")


Ou usar a quebra da linha e juntar os dois,no Delphi.

Re: problema ao enviar valor analogico

MensagemEnviado: 15 Jul 2013 12:29
por VMS
Qual o resultado da String:

o resultado da string é um valor analogico de 0 a 10

Talvez voce possa resolver no código no PIC:


eu nao quero armazenar num memo, preciso armazenar em uma variavel, esses valores são enviado pelo pic a cada 500ms para minha aplicação delphi que gera um grafico em tempo real.

atualmente eu to fazendo isso, recebendo os valores que vem da serial, junto em uma variavel e consigo ter um valor float, mas eu queria saber se tem como eu enviar um valor tipo float sem que chegue quebrado na minha aplicação delphi.

como eu ja disse, se eu envio pelo pic o valor 2.34, na aplicação delphi chega primeiro 2 e depois chega .34

Re: problema ao enviar valor analogico

MensagemEnviado: 15 Jul 2013 13:16
por xultz
Eu até agora não entendi qual é o problema, se imprimir em ASC (caso do printf) o valor 2,34, você vai receber '2', depois '.', depois '3' e por fim '4'.
O que você gostaria que o circuito fizesse?

Re: problema ao enviar valor analogico

MensagemEnviado: 16 Jul 2013 08:16
por andre_luis
xultz escreveu:...Eu até agora não entendi qual é o problema, se imprimir em ASC (caso do printf) o valor 2,34, você vai receber '2', depois '.', depois '3' e por fim '4'...


É parecido com o que também sugeri no tópico acima : Converter para Texto e somente depois enviar pela serial.

andre_teprom escreveu: Experimenta converter o valor para string primeiro, e depois então enviar o texto pela serial...



+++

Re: problema ao enviar valor analogico

MensagemEnviado: 16 Jul 2013 12:06
por ze
se não tiver vergonha de sujar as mãos, não é + simples e eficiente enviar apenas os valores do ad?
Código: Selecionar todos
...
while(!TRMT);
TXREG=ADRESH;
while(!TRMT);
TXREG=ADRESL;
...
e deixar o pc fazer o trabalho sujo?

Re: problema ao enviar valor analogico

MensagemEnviado: 16 Jul 2013 15:27
por vtrx
e deixar o pc fazer o trabalho sujo?

Eu sempre deixo o PC fazer a pior parte...

Re: problema ao enviar valor analogico

MensagemEnviado: 16 Jul 2013 22:06
por andre_luis
vtrx escreveu:...Eu sempre deixo o PC fazer a pior parte...


Mas se a função dessa saída do PIC para o PC for um Debug, a necessidade do casting para ASCII continua...


+++

Re: problema ao enviar valor analogico

MensagemEnviado: 16 Jul 2013 22:37
por vtrx
Qualquer que seja o envio para o PC,no Delphi/C++ etc, é fácil converter qualquer valor,eu mesmo costumava ler os bytes direto em hexa sem se importar se estava codificado em ASCII ou não.

Re: problema ao enviar valor analogico

MensagemEnviado: 17 Jul 2013 09:04
por andre_luis
Concordo contigo, mas apenas destaquei que essa alternativa talvez pudesse não atender ao problema original.


+++