Página 1 de 1

Envio de dados via RS232 quando requisitado

MensagemEnviado: 03 Set 2013 14:53
por Fischer
Estou escrevendo um programa que aquisita dados de 2 sonares e envia via RS232 como texto. No computador os dados são filtrados e um vetor é construído.
Meu problema é que eu não consigo enviar os dados conforme requisição do PC, como, por exemplo, enviando um "ok" do computador e então o PIC envia os dados.
Tentei usar o comando UART1_Data_Ready e o break, mas o não consigo ativar a transmissão de dados novamente após o break.

Estou usando um PIC 16F877A com um crystal de 4 Mhz. Para a conexão com o computador eu estou usando um cabo USB com um conversor USB-Serial.
O compilador utilizado é o MikroC PRO
Segue o código


Código: Selecionar todos
float adc2, adc5;
float conv2, conv5;
char sonar2[7], sonar5[7];
unsigned char vector[80];

void sonar()
{
adc2=adc_read(2); //read signal from sonar 3, AN2
delay_ms(100);
conv2=adc2*0.0135;
floattostr(conv2,sonar2);

adc5=adc_read(5); //read signal from sonar 6, AN5
delay_ms(100);
conv5=adc5*0.0135;
floattostr(conv5,sonar5);
}

void main()
{
trisa=0b00101111;
trise=0b00000111;
porta=0b00000000;
porte=0b00000000;
adcon1= 0b00000000; //portas analogicas utilizadas pg 114
delay_us(100); //required acquisition time
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
adc_init();
delay_ms(300);

while (1)
{
sonar();

strcpy(vector,sonar2); //builds the data to be send
strcat(vector," ");
strcat(vector,","); //separetes the data to be analised in the computer
strcat(vector," ");
strcat(vector,sonar5); //builds the data to be send

//vector will be sent as data_sonar2 , data_sonar5

if (UART1_Data_Ready() == 1)
{
UART1_Write_Text(vector); //sends the vector
delay_ms(500);
break;
}
}
}



Se alguém puder me ajudar, vou ser imensamente agradecido.

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 03 Set 2013 16:52
por ze2
olá. Permita-me expor meu . de vista. O problema de funções prontas é podemos ficar meio que perdidos (e pervertidos). Voce pode tentar se embrenhar mais no âmago do uC pra voce ter controle total do que ocorre no núcleo. É relativamente simples (o que não impede que você dê uma lida no d.s.) No começo pode ser doloroso mas logo você nem sente mais nada. Hábitos no início são teias de aranha. Com o tempo se tornam fios de arame

Veja que procuro maximizar o minimalismo.
Código: Selecionar todos
void txanal(void) //ui
{
TXREG=ADRESH; //coloca o dado no buffer e...
while(!TRMT); //espera transmitir. Interessante voce elaborar um timeout tipo while(!TMRT && tmout--);
TXREG=ADRESL; //=
while(!TRMT); //veja no seu compilador a definição correta deste bit. Compare com o do d.shit
}

main()
//...depois de setar todo o hw, óbvio...
for (;;)
{
...
while (!RI); //aguarda o pc enviar qualquer caracter. Interessante voce elaborar com um caracter start tipo if (RXREG==0xaa) ... p.ex.
adc_read(2); //read signal from sonar 3, AN2
txanal();
while (!RI); //Veja no seu compilador a definição correta deste bit. Compare com o do d.shit
adc_read(5); //read signal from sonar 6, AN5
txanal();
//não faça nenhuma conversão no pic. Deixe pro pc (a não ser que o protocolo já esteja pronto esperando o dado mastigado)
...
}
é + - assim...O pc envia um byte qualquer (ou o start) pra requisitar 2 bytes com valores analógicos. O bacana mesmo é usar o recurso de interrupção quando chega um dado em RXREG. E também elaborar um recurso qualquer para garantir consistência dos dados. Mas por hora esquece...

abç

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 03 Set 2013 19:18
por andre_luis
Fischer,


O uso da função DELAY num contexto onde o uC precisa responder á um evento ( no caso, uma interrupção serial ) é algo condenável.
Além disso, o valor de 500ms está muito alto, o que pode fazer perder alguns pacotes de dados do PC.

Procura implementar um programa baseado no conceito de "time slot", onde essa temporização é feita sem travar o processamento num loop local.


+++

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 03 Set 2013 20:04
por Fischer
ze

Obrigado pela resposta, vou ver se consigo estudar e me embrenhar no âmago do PIC.

andre_teprom

O delay de 500ms foi um resquício da programação inicial, na qual os dados eram enviados continuamente. Esse foi o tempo setado para a leitura dos dados pelo computador. Como esse programa fica em loop sem o break, eu mantive o delay de modo a poder visualizar os dados enviados.
Não estou familiarizado com o conceito de "time slot". Seria possível me dar alguma indicação sobre o que é?

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 03 Set 2013 23:01
por tcpipchip
Apos testar uart1-data-ready...leia pelo menos a serial para apsgar o status

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 04 Set 2013 09:01
por r0n4ld0l1n5
Após a condição "if (UART1_Data_Ready() == 1)" for verdadeira, vc precisa apagar a flag que foi levantada quando chegou dados na UART, vc pode fazer isso como o tcpipchip disse, ou apenas apagando a flag RC1IF que no seu caso eu acho q pode ser acessada dessa forma "PIR1.RC1IF = 0" (falo eu acho pq eu trabalho com o CCS). Na dúvida sobre como o compilador trabalha eu faria os dois.

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 04 Set 2013 09:48
por tcpipchip
ela já faz isto.

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 04 Set 2013 11:09
por r0n4ld0l1n5
A então ficou mais fácil...

Eu faria assim:

Código: Selecionar todos
if (UART1_Data_Ready() == 1)
{
    Buffer[i++] = getc();  //TEM Q VERIFICAR SE É ESSA A FUNCAO QUE FAZ A LEITURA DO BUFFER DA UART
    if(i>=sizeof(Buffer))
    {
          i=0;
          if(memcmp(Buffer, "OK", 2) == 0)   
          {
            UART1_Write_Text(vector); //sends the vector
            delay_ms(500);
             break;
          }
    }

}



Acho q funciona....

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 04 Set 2013 14:20
por tcpipchip
UART1_Read()

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 05 Set 2013 09:46
por r0n4ld0l1n5
Agora já sei qual Compilador ele tá usando é o MikroC, não é?

Espero ter ajudado nosso amigo...

Até mais.

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 19 Set 2013 09:44
por Fischer
Obrigado pela ajuda pessoal. Adicionar a linha de UART1_Read() resolveu o problema.
Desculpem a demore em responder, eu fiquei afastado do lab quase 2 semanas.

Re: Envio de dados via RS232 quando requisitado

MensagemEnviado: 19 Set 2013 12:15
por tcpipchip
otimo. Mais um "poblema" resolvido.