Página 1 de 2

Comunicação RS232 através do software

MensagemEnviado: 30 Mai 2011 11:34
por Nibble
Bom dia,

Estou utilizando o PIC16F648A, que possui no seu hardware apenas uma porta serial, mas preciso de duas portas. Então pelo que sei o CCS cria postas seriais no software automaticamente, então para isso fiz:
#use rs232(baud=15600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=TMS)
#use rs232(baud=9600,parity=N,xmit=PIN_A1,rcv=PIN_B4,bits=8,stream=PC)


Na hora de criar a interrupção para a primeira porta faço da seguinte maneira:
#int_RDA // TMS3705
RDA_isr(void)
{ }

Quanto tento criar a interrupção para segunda porta tento fazer assim:
#int_RDA2 // PC
void RDA2_isr(void)
{ }

Mas não funciona, sendo assim gostaria de saber como fazer a interrupção para a segunda porta.

MensagemEnviado: 30 Mai 2011 12:07
por Rubens_Caetano
O Pic não tem interrupção, para essa segunda serial que o CCS gerou, uma idéia seria usar um timer pra checar de tempos em tempos oque chegou por essa serial, ou ainda, usar uma interrupção externa ou de mudança de estado ligada ao pino de RX cara detectar o start bit, e processar oque chegou, nunca implementei mas deve funcionar.

MensagemEnviado: 30 Mai 2011 13:59
por Nibble
Código: Selecionar todos
O Pic não tem interrupção, para essa segunda serial que o CCS gerou, uma idéia seria usar um timer pra checar de tempos em tempos oque chegou por essa serial, ou ainda, usar uma interrupção externa ou de mudança de estado ligada ao pino de RX cara detectar o start bit, e processar oque chegou, nunca implementei mas deve funcionar
.

Mas estou com algumas duvidas, se eu for utilizar o timer para checar a serial, o ccs armazena os valores em um buffer de modo que eu possa chegar e ler, se sim como eu faço isso.

MensagemEnviado: 30 Mai 2011 14:38
por Rubens_Caetano
O buffer do PIC é um byte :cry: vc terá que implementar seu buffer por software, da mesma forma que na primeira porta padrão do PIC, o CCS não armazena em buffer algum.

MensagemEnviado: 30 Mai 2011 15:01
por Nibble
Rubens acho que vc não compreendeu bem a minha duvida.
Vou tentar me expressar melhor, a minha duvida é a seguinte: os dados são transmitidos bit a bit, na porta serial, então o pic armazena esses bits ate formar um byte que é quando ele gera a interrupção. Sendo assim gostaria de saber se ao gerar o time vou simplesmente ler o valor que esta na porta ou se o software ccs gera uma parte do programa em que eu possa simplesmente ler um byte inteiro que ele armazenou.

MensagemEnviado: 30 Mai 2011 16:38
por Rubens_Caetano
Então o CCS não gera automáticamente nenhuma parte do programa em que vc possa ler um byte inteiro que ele armazenou (buffer)vc terá q implementar por software usando kbhit() e getc().

Re: Comunicação RS232 através do software

MensagemEnviado: 30 Mai 2011 19:08
por andre_luis
Nibble escreveu:...sendo assim gostaria de saber como fazer a interrupção para a segunda porta.


Voce já experimentou desabilitar a 1a interrupção ?
( tipo, comentar o código da #int_RDA )

Existe a possibilidade de que a causa do problema não seja exatamente um conflito no compartilhamento de recursos pelas 2 funções.

+++

MensagemEnviado: 01 Jun 2011 11:37
por Nibble
Tudo bem acho q minhas esperanças do ccs criar uma rotina para receber os dados da serial se acabaram e vou ter que fazer manualmente mesmo, mas quanto a transmissão de dados ele cria automaticamente e posso simplesmente utilizar o comando fputc(Rec_dados_TMS[P], PC); ou tenho que criar a rotina de envio manualmente também?

MensagemEnviado: 01 Jun 2011 15:40
por andre_luis
Ainda não estou totalmente convencido de que os 2 tipos de seriais não possam conviver juntas.
Chegou a fazer o teste que sugeri acima ?

+++

MensagemEnviado: 02 Jun 2011 07:13
por ze
ainda acho que um multiplex/demultiplex dá conta do recado

MensagemEnviado: 02 Jun 2011 15:07
por andre_luis
lellis escreveu:ainda acho que um multiplex/demultiplex dá conta do recado


Isso pressupõe um caso particular no qual o funcionamento seria exclusivo ( uma serial por vêz ).

+++

MensagemEnviado: 02 Jun 2011 16:43
por ze
bom complemento!
por ser tal MC mui simples [pre]supus que o projeto também o era. Seria relativamente fácil adaptar o projeto a esta nova realidade além de facilitar a vida do guri.

Além do + tô com dificuldade em visualizar este pic sendo interrompido simultaneamente e recebendo 2 pacotes de dados simultaneamente 2 vezes pleonasticamente por sw e com tal compilador. mas esta limitação é só minha hein!

já que é pra complicar (ou facilitar), pra uso simultâneo sugiro MC com + de 1 serial no hw.

Ah e tô com vontade mas minha ética me impede de falar mal desta m**** de compilador.

sucessos!

Re: Comunicação RS232 através do software

MensagemEnviado: 03 Jun 2011 13:13
por andre_luis
Essas soluçõe são muto dependentes da particularidade de cada projeto.
Eu por exemplo já usei uma mesma UART do PC compartilhada por 2 dispositivos externos ( isolados por 1 diodo para cada : 2TX -> 1RX ), mas só funcionou por causa de alguns detalhes :

> O BaudRate era o mesmo. Assim a identificação de quem enviou a mensagem era feita por firmware, analisando o protocolo.
> Apenas a recepção foi usada. Esse mecanismo não funcionaria para o TX.

Assim, a implementação de cada solução alternativa vai depender da análise do programador, caso-a-caso.


+++

MensagemEnviado: 03 Jun 2011 18:25
por vtrx
Assim, a implementação de cada solução alternativa vai depender da análise do programador, caso-a-caso.

Perfeito.
Nibble,uma pergunta de nibble.
Qual a intenção de duas seriais?

MensagemEnviado: 28 Out 2011 12:24
por mhagnumdw
Uma dúvida/curiosidade... usando CCS, comunicação serial e porta C.

Tenho o PIC 16F874A comunicando serialmente pelos pinos C6/TX e C7/RX.
Preciso usar os pinos C0 a C5 para outras coisas.
Tem como escrever na porta C de modo que o compilador desconsidere a escrita nos pinos C6 e C7?
Algo como: output_c(0b%%110011). Onde o % indica para a função de escrita que esse pinos não serão alterados.

Se não, vou ter que escrever bit a bit nos pinos C0 a C5.

--
MhagnumDw