Página 1 de 1

Tempos de amostragem causando "delays"

MensagemEnviado: 26 Ago 2015 09:25
por Eduardo Augusto
Pessoal!
Tenho uma aplicação que utiliza o protocolo Modbus para transmitir seus dados para um concentrador de dados, até ai funcionando bem, consigo ler e escrever bobinas e variáveis . Contudo, meu concentrador está derrubando a comunicação com o escravo por time out e tenho certeza que é meu método de leitura do adc... Leio 4 sinais com o adc e depois os disponibilizo em um buffer, mas essas leituras estão me gerando "delay's" dentro da rotina de Modbus.....

Minha função de leitura.
Código: Selecionar todos
      ADCON1.F1 = 1;        //Start sampling (SAMP=1)
      Delay_ms(100);        //Wait for 100ms (sampling ...)
      ADCON1.F1 = 0;        //Clear SAMP bit (trigger conversion)
      while (ADCON1.F0 == 0)
      return ADCBUF0;


Não seria possível fazer por interrupção? Por exemplo dou set em um bit para iniciar a a amostragem e quando concluída tenho uma interrupção com a resposta da conversão?

Re: Tempos de amostragem causando "delays"

MensagemEnviado: 26 Ago 2015 10:22
por Alexandro
O tempo de 100ms é muita coisa, pode abaixar pra uS, isso deve resolver, mas por interrupção tambem dá.

Re: Tempos de amostragem causando "delays"

MensagemEnviado: 26 Ago 2015 20:22
por edsont
A rotina do ADC pode esperar, mas a rotina de comunicação não se não tiver controle de fluxo. Imagino que seja RTU ou ASCII (serial).
Se possível eu sugiro usar uma interrupção quando houver dado no buffer de entrada e copiar para um buffer da aplicação.
Sem controle de fluxo, se chegar um byte enquanto o buffer da UART estiver cheio este será perdido, resultando em mensagem incompleta.

Re: Tempos de amostragem causando "delays"

MensagemEnviado: 27 Ago 2015 15:13
por Eduardo Augusto
Consegui a partir deste material aqui

http://www.electronics-base.com/dspic-t ... dc-example

Meu problema era na consulta do mestre aos valores dos escravos. Quando os escravos iam responder ao chamado da leitura do mestre o pic iniciava o método de leitura das portas analógicas causando time-out na comunicação.
Já resolvido agora por interrupção!