Envio de dados via RS232 quando requisitado

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Envio de dados via RS232 quando requisitado

Mensagempor Fischer » 03 Set 2013 14:53

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.
Fischer
 
Mensagens: 3
Registrado em: 03 Set 2013 14:44

Re: Envio de dados via RS232 quando requisitado

Mensagempor ze2 » 03 Set 2013 16:52

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ç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: Envio de dados via RS232 quando requisitado

Mensagempor andre_luis » 03 Set 2013 19:18

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Envio de dados via RS232 quando requisitado

Mensagempor Fischer » 03 Set 2013 20:04

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 é?
Fischer
 
Mensagens: 3
Registrado em: 03 Set 2013 14:44

Re: Envio de dados via RS232 quando requisitado

Mensagempor tcpipchip » 03 Set 2013 23:01

Apos testar uart1-data-ready...leia pelo menos a serial para apsgar o status
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Envio de dados via RS232 quando requisitado

Mensagempor r0n4ld0l1n5 » 04 Set 2013 09:01

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.
r0n4ld0l1n5
Bit
 
Mensagens: 25
Registrado em: 26 Mar 2013 14:30

Re: Envio de dados via RS232 quando requisitado

Mensagempor tcpipchip » 04 Set 2013 09:48

ela já faz isto.
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Envio de dados via RS232 quando requisitado

Mensagempor r0n4ld0l1n5 » 04 Set 2013 11:09

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....
r0n4ld0l1n5
Bit
 
Mensagens: 25
Registrado em: 26 Mar 2013 14:30

Re: Envio de dados via RS232 quando requisitado

Mensagempor tcpipchip » 04 Set 2013 14:20

UART1_Read()
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Envio de dados via RS232 quando requisitado

Mensagempor r0n4ld0l1n5 » 05 Set 2013 09:46

Agora já sei qual Compilador ele tá usando é o MikroC, não é?

Espero ter ajudado nosso amigo...

Até mais.
r0n4ld0l1n5
Bit
 
Mensagens: 25
Registrado em: 26 Mar 2013 14:30

Re: Envio de dados via RS232 quando requisitado

Mensagempor Fischer » 19 Set 2013 09:44

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.
Fischer
 
Mensagens: 3
Registrado em: 03 Set 2013 14:44

Re: Envio de dados via RS232 quando requisitado

Mensagempor tcpipchip » 19 Set 2013 12:15

otimo. Mais um "poblema" resolvido.
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!


Voltar para PIC

Quem está online

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

cron

x