Página 1 de 1

Demora na comunicação RS232

MensagemEnviado: 24 Out 2011 11:23
por sami2
Bom pessoal estou comunicando 2 PIC16F877 por um unico fio fazendo uma comunicação simplex entre eles, feito em CCS

To enviando uma string do seguinte modo:
Unsigned int enviar[10];
.
.
.
// o PIC Lê 8 sensores via AD em 8 bits e coloca o valor de:
sensor 1 em enviar [0]
sensor 2 em enviar [1]
sensor 3 em enviar [2]
assim por diante

fputs (enviar, stream);



No PIC que recebe:

Código: Selecionar todos
unsigned int recebe[10]
int sensor_1, sensor_2,sensor_3.....

While(1)
{
if (kbhit())
{
   fgets(recebido,stream)
   sensor_1 = recebido[0];
   sensor_2 = recebido[1];
   etc...
   break;
}
}



Tá funcionando bonitinho... o problema é que o pic que lê os sensores realiza a leitura a cada 333ms
Então ele só envia a cada 333ms

E o PIC que recebe deveria fazer outras funções mais rápido, mas a velocidade dele fica limitado tambem aos 333ms..

Já tirei aquele while dali, mas continuou na mesma, tirei o if (kbhit()).. coloque um gets mesmo.. e continuou na mesma tambem

Alguma Luz, ou é assim mesmo ?

MensagemEnviado: 24 Out 2011 11:57
por mastk
En taro adun Sami2.

o "while" não é um problema se dentro dele estiver acontecendo a função "main" do seu programa, reveja a estrutara geral, pode um erro no loop principal ou na forma que lida com os eventos.

Eu recomendo que vc trate a interrupção e faça sua propria rotina de acquisição de dados provientes do modulo serial.

E tipo, não estaria o "fget", esperando a interrupção seguinte? Isso explicaria o problema.

MensagemEnviado: 25 Out 2011 06:53
por Andre_Cruz
Sami2,

Uma vez precisei enviar informação de um sensor de temperatura separado fisicamente da "placa central", adotei a solução de usar um 12F675 para ler a temperatura e enviar o valor para a "placa central". Na placa com o 12F675 eu lia o A/D e convertia o resultado em um número binário e depois enviava em binário cada nível lógico 1 correspondia a um pulso de Xms em 5V e cada nível lógico 0 esperava Xms em 0V.
Na "placa central" usei o pino RB0 configurado como interrupção externa e acada bit enviado pelo 12F675 a "placa central" recebia os 8 bits e montava o valor.

Como o mastk disse a interrupção vai evitar de você ficar preso esperando o PIC (escravo) enviar os dados.
Se puder faça sua própria rotina, fuja dessas rotinas prontas.

Qualquer novidade posta aee !
Abraço

MensagemEnviado: 25 Out 2011 12:00
por sami2
O que acontece é isso mesmo, o PIC que recebe para no Fgets e fica esperando o dado.. mesmo com o kbhit ele fica parado lá

E o while ta dentro do main sim

Então na verdade não sou muito mestre em criar minhas proprias rotinas, e etc.. rsrsr.. se algum puder dar um exemplo
Ou então uma solução de hardware mesmo

Tipo:

o PIC que enviar, quando enviar poe um pino em estado alto, esse pino é ligado no PIC que recebe, na interrupção, e dentro da interrupção a função de Fget.... dia a comunicação fica por 2 fios

MensagemEnviado: 25 Out 2011 13:32
por mastk
Basicamente, trate a interrupção de recepção do modulo serial, armazene o dado acquisitado no lugar apropriado, vá emborar fazer outras coisas.

Não é complexo isso e é importantisimo para seu conhecimento saber como acontece em seus por menores.

A comunicação serial por acontecer por 2 fios, depende da forma que foi feito apenas, se for unidirecional, se for bidirecional deve ter mais um hardware envolvido, mas por hora não é o problema principal imagino.

MensagemEnviado: 25 Out 2011 19:46
por sami2
INT_RDA
essa é a interrução da serial ?

Hoje testei no simulador assim, apenas um fio com os dados em si, e mais um fio que vai a nivel alto alguns milesegundos antes de enviar os dados, esse fio vai na interrupção, e dentro da interrupção ele fica esperando os dados, armazena e fim

funcionou perfeito aqui, era o que eu queria, agora quem recebe está livre

mas por via software seria isso mesmo, INT_RDA ?

MensagemEnviado: 25 Out 2011 22:21
por mastk
Nao sei, nao uso PIC, deve ser. Entre tanto, vc sempre pode escolher uma interrupcao ou fazer por polling, ou seja, no primeiro caso sera um evento especial no MCU no segundo seu programa deve ficar analisando o Flag do modulo serial ate que seja valido. E obviamente, em ambos o caso preparar o modulo para o proximo byte.

MensagemEnviado: 26 Out 2011 06:59
por EDSONCAN
While(1)
{
if (kbhit())
{
fgets(recebido,stream)
sensor_1 = recebido[0];
sensor_2 = recebido[1];
etc...
break;
}
}

Por esse programa ele somente executa o que esta dentro do Kbhit apos receber o start_bit, ou seja, a cada 333mseg, se a leitura do sensor estiver dentro do if sera esse tempo de leitura.
Edson