Página 1 de 1

Problemas com RDA e RDA2 juntas

MensagemEnviado: 22 Fev 2013 17:33
por hemasc
Olá senhores!

Estou tentando trabalhar com duas seriais no mesmo PIC, mas estou tendo dificuldades com algumas coisas.
Utilizo o CCS V4.120 e PIC 18F87K90

Testei a RDA e funciona perfeitamente, o problema começa quando incluo a outra serial RDA2.

Ambas RDAs estão ligadas e também fiz a função para receber os dados qdo chegam na serial. Abaixo outras config que fiz.

#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,ERRORS,UART1,STREAM=COMM_1,enable=PIN_B4)

#use rs232(baud=9600, xmit=PIN_G1,rcv=PIN_G2,ERRORS,UART2,STREAM=COMM_2)

Quando eu não configuro a stream da RDA2, consigo receber dados nela tranquilamente. Por ex:
#use rs232(baud=9600, xmit=PIN_G1,rcv=PIN_G2,ERRORS,UART2)

Mas se eu não configurar a stream, não tem como eu avisar o PIC em qual serial ele deve enviar os dados.

E quando a stream é configurada, ao receber um dado da RDA2 o firmware fica travado na linha
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,ERRORS,UART1,STREAM=COMM_1,enable=PIN_B4)

Peguei vários exemplos na internet e não consigo avançar.

Re: Problemas com RDA e RDA2 juntas

MensagemEnviado: 22 Fev 2013 22:50
por andre_luis
Há relatos na Web acerca de BUG no comando enable da API #use rs232(.
Pessoalmente, nunca usei.


+++

MensagemEnviado: 23 Fev 2013 09:02
por vtrx
Troque de 'compilador'.

MensagemEnviado: 23 Fev 2013 12:38
por andre_luis
vtrx escreveu:Troque de 'compilador'.


Isso não ajuda muito na solução do problema apresentado.
O que me referi é que nunca usei a diretiva enable dessa API.

MensagemEnviado: 23 Fev 2013 16:33
por vtrx
Essas diretrizes do CCS não garantem que esteja usando a segunda UART por HArdware,me parece que é por software(ponto negativo).
Teria que verificar o 'manual 'do CCS...

MensagemEnviado: 23 Fev 2013 17:21
por andre_luis
Por definição do compilador CCS, o padrão é a implementação das 2 UARTs por HW se os pinos escolhidos forem aqueles dos módulos nativos.
Esse é o caso do PIC18F87K90, cujas UART 1,2 correspondem aos pinos C6/C7 e G1/G2.




+++

MensagemEnviado: 23 Fev 2013 21:56
por vtrx
òtimo então,voce deve solucionar brevemente o problema do colega com suas informações sobre o CCS.
Quando voce relata:
Há relatos na Web acerca de BUG no comando enable da API #use rs232(.

Isso quer dizer que o compilador não vai produzir código(hora de trocar de compilador)ou poderia éle terá que ficar em 'stand-by' indefinido?

MensagemEnviado: 23 Fev 2013 23:55
por andre_luis
A sua sugestão por trocar de compilador está fora do escopo daquilo que foi pedido pelo colega.

Minha contribuição não teve a pretensão de resolver o problema, mas alertar que o uso do comando enable pode ser a causa do problema.

A decisão de descartar o uso do compilador, fica á critério do colega, esgotadas todas as opções de contorno que forem sugeridas.

A propósito, não sou expert no CCS, apesar de já ter feito programas bem completos e com sucesso no mesmo.

A propósito, não é apenas a API de comunicação do CCS que apresenta problemas, mas o próprio printf, é pivot de muita dor de cabeça em outros compiladores.

Por favor, vamos evitar criar polêmica desnecessária, ok ?



+++

MensagemEnviado: 28 Fev 2013 16:42
por hemasc
Bem, obrigado pela colaboração e atenção de andre_teprom e vtrx.

Trocar de compilador, atualmente, é algo inviável, pois meu código possui mais de 17 mil linhas.

Acabei encontrando uma solução em um site, mas não tenho osciloscópio para garantir que as comunicações estão sendo feitas apenas em uma das saídas seriais.

Na UART1 faço uma comunicação MODBUS e na UART2 uma comunicação com um protocolo próprio.

Vale ressaltar que não coloquei osciloscópio confirmando que quando envio dados na UART2, ele também não sai na UART1.

Fiz as configuração da seguinte forma e ambas comunicaram legal com os softwares.

na UART1 mantive:
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,errors,stream=COMM_1,enable=PIN_B4)

na UART2 fiz as funções próximas umas as outras:

#use rs232(baud=9600, xmit=pin_g1, rcv=pin_g2)
void put_to_2(char c)
{
putc(c);
}

#int_RDA2 //HIGH
void RDA_isr2(void)
{
//////
}

utilizo esta função para a UART2
put_to_2(buffer_saida[0]);

e este comando para a UART1
fputC(Comm1.y, COMM_1);

fonte: http://www.ccsinfo.com/faq.php?page=multiple_rs232