Cumunicação Serial Usart Mikroc

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Cumunicação Serial Usart Mikroc

Mensagempor elzirobotelho » 02 Mar 2008 14:28

Olá pessoal, sou recém chegado ao Forum. Estou precisando de ajuda. Estou tendo dificuldades em implementar uma comunicação serial para poder concluir o meu TCC. O projeto consiste basicamente em um contador de pulsos onde este valor totalizado, qdo solicitado será enviado pela serial via RF. O total é composto p/ 5 dígitos EX.: 12345 e possui um endereço composto por 2 letras e 4 nº. Ex.: AA0000, este endereço é envido ao totalizador por RF, sendo confirmado este end. é enviado o valor totalizado. Qdo eu envio somente a 1ª letra do end. recebo o total, e qdo envio 0s demais não recebo o total. Estou enviando uma parte do programa. Obs.: Só sei +/- trabalhar com Mikroc. Se alguém puder me ajudar agradeço

Elziro Botelho


do {
if (Ps2_Key_Read(&dados, &especial, &down)) { //Foi pressionada alguma tecla?
if (down && (dados == 1)) trata_cursor(); //Sim, verifica se foi F1, caso verdadeiro
if (down && (dados == 2)) trata_fator(); //Sim, verifica se foi F2, caso verdadeiro
}
if (down && dados) { //Se foi selecionado um caracter alfa numérico
trata_teclado(); // e no LCD estiver a tela 1 Chama Sub-Rotina trata_teclado
}
atualiza_lcd();
x=0;
if (Usart_Data_Ready()==1) {
rx_endereco(); }
}
while(1); // Loop
}

void rx_endereco() {
char *apontador_rx=&end0_rx;
if (Usart_Data_Ready()==1) {
do {
if (Usart_Data_Ready()==1) {
*apontador_rx=Usart_Read();
*apontador_rx++;
} }
while(*apontador_rx != '\0');
}
if (end0==end0_rx) {
//&& (end1==end1_rx)&& (end2==end2_rx)&& (end3==end3_rx)&&
//(end4==end4_rx)&& (end5==end5_rx)) {
Usart_Write(dzml);
Delay_ms(10);
Usart_Write(ml);
Delay_ms(10);
Usart_Write(ct);
Delay_ms(10);
Usart_Write(dz);
Delay_ms(10);
Usart_Write(un);
Delay_ms(10);
} }
elzirobotelho
Bit
 
Mensagens: 31
Registrado em: 22 Fev 2008 23:00
Localização: Santos - SP

Mensagempor Sergio38br » 03 Mar 2008 12:02

Boas.
qual pic e qual versão do mikroC que vc esta usando?

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor ze » 03 Mar 2008 13:38

Hi,
Não entendi muito bem. ¿Quando você diz "Qdo eu envio somente a 1ª letra do end. recebo o total, e qdo envio 0s demais não recebo o total" é parte do problema ou do seu algoritmo?

dica: selecione seu texto fonte e clique em "code". fica mais mió de bão!
a propósito uélcome!!
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor elzirobotelho » 03 Mar 2008 23:02

Sergio38br escreveu:Boas.
qual pic e qual versão do mikroC que vc esta usando?

Sergio

P/ Sérgio e o Lellis também

Estou usando o mikroc 6.2 e o PIC é 18F452
Vou tentar me sair melhor agora, o projeto é um contador de pulsos composto por 5 dígitos sendo que cada dígito está sendo salvo em 5 variáveis, un, dz, ct, ml, dzml e possui um endereço este contador, onde é composto p/ 6 dígitos EX. AB1234. Qdo c/ um outro PIC (Leitura Remota) enviar um endereço e este for confirmado
EX. (TX) AB12345=AB1234 (RX Cont.Pulso). Este me envia via serial o conteúdo das variáveis un,dz.....
Estou tendo dificulade em enviar o endereço e confirmação deste. Estou fazendo a comunicação(testes) com o Communication Terminal do próprio Mikroc e a placa de desenvolvimento que possuo
Se alguém puder me dar alguma dica ou um pequeno esboço do programa de como fazer isto agradeço.
Faltam 2 detalhes p/ concluir meu TCC, e este é o + crítico p/ mim
Elziro Botelho
elzirobotelho
Bit
 
Mensagens: 31
Registrado em: 22 Fev 2008 23:00
Localização: Santos - SP

Mensagempor Sergio38br » 04 Mar 2008 07:54

Bom dia,

Você esta fazendo isto por um link de RF, na grande maioria das vezes a velocidade destes modulos é baixa em torno de 1200, como você não colocou o Usart_Init, de uma verificada nisto.

No seu código vc esta repetindo no meu ponto de vista a função "Usart_Data_Ready()", como a comunicação é assincrona , veja se é possivel colocar a rotina de recepção na interrupção.

Inicie o seu buffer de dados fora interrupção, ative while em true, se tiver interrupção vai recebe os dados, filtre este dados , a comunicação por rf pode ser muito ruidosa.

incremente um contador e verifique se o que você esta esperando esta na posição correta, tipo, é o primeiro ou segundo caracter recebido e não é uma letra, dado falso!!!, reinicie o buffer e espere a sequencia correta.

Quando receber a sequencia correta sai do while e responda.

P.S. Cara não tem uma versão mais nova, esta tem alguns bugs, que foram corrigidos pela versão 7 e mesmo essa esta ja foi substituida por uma versão mais nova, de uma olhada no site da mikroelektronica .

G.A.

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor ze » 04 Mar 2008 09:01

elziro,
creio que deverá desenvolver seu próprio protocolo (é lógico!). algo como if (rxstring=="AB12345") tx=count. Ex.: seu uC ficará monitorando a serial e montando a string [por interrupção p.ex.]. Sugiro que ela tenha um caracter terminador [ou aproveite o 0 do final]. Outra parte do seu prog ficará comparando a string com o endereço fora da interr. no loop principal. Se for igual DESLIGA a interr. de recepção e envia o dado desejado. Acho que o protocolo i2c é +- assim.
Este é um ex. de protocolo simplérrimo. Devem haver outros + sofisticados que de repente alguma alma + caridosa e + especialista do que eu lhe possa iluminar. Como byte começador e terminador, chsum, confirmação de recebimento, consistência dos dados, etc e o escambal.

Alguma coisa me diz que já tinha pensado nisto e apenas chovi no molhado! Mas mesmo assim espero que [não] lhe seja [in]útil. (rs)

Ah, desculpe, não analisei seu código, apenas seu problema.

abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

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

x