Comunicação RS232 através do software

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Comunicação RS232 através do software

Mensagempor Nibble » 30 Mai 2011 11:34

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.
Nibble
Bit
 
Mensagens: 25
Registrado em: 25 Mai 2011 11:59

Mensagempor Rubens_Caetano » 30 Mai 2011 12:07

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.
Rubens_Caetano
Bit
 
Mensagens: 24
Registrado em: 14 Abr 2009 09:01

Mensagempor Nibble » 30 Mai 2011 13:59

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.
Nibble
Bit
 
Mensagens: 25
Registrado em: 25 Mai 2011 11:59

Mensagempor Rubens_Caetano » 30 Mai 2011 14:38

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.
Rubens_Caetano
Bit
 
Mensagens: 24
Registrado em: 14 Abr 2009 09:01

Mensagempor Nibble » 30 Mai 2011 15:01

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.
Nibble
Bit
 
Mensagens: 25
Registrado em: 25 Mai 2011 11:59

Mensagempor Rubens_Caetano » 30 Mai 2011 16:38

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().
Rubens_Caetano
Bit
 
Mensagens: 24
Registrado em: 14 Abr 2009 09:01

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

Mensagempor andre_luis » 30 Mai 2011 19:08

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.

+++
"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

Mensagempor Nibble » 01 Jun 2011 11:37

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?
Nibble
Bit
 
Mensagens: 25
Registrado em: 25 Mai 2011 11:59

Mensagempor andre_luis » 01 Jun 2011 15:40

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 ?

+++
"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

Mensagempor ze » 02 Jun 2011 07:13

ainda acho que um multiplex/demultiplex dá conta do recado
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor andre_luis » 02 Jun 2011 15:07

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 ).

+++
"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

Mensagempor ze » 02 Jun 2011 16:43

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!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

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

Mensagempor andre_luis » 03 Jun 2011 13:13

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.


+++
"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

Mensagempor vtrx » 03 Jun 2011 18:25

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?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor mhagnumdw » 28 Out 2011 12:24

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
Avatar do usuário
mhagnumdw
Bit
 
Mensagens: 49
Registrado em: 26 Out 2009 15:30

Próximo

Voltar para PIC

Quem está online

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

cron

x