Ir ao conteúdo
  • Cadastre-se

Comunicação RS485 entre PIC's


Posts recomendados

Estou fazendo um projeto no qual consiste em 3 PIC's, dois deles serão escravos e um mestre.

 

Os escravos sempre vão ter dados a enviar ao mestre, e ocasionalmente o mestre irá enviar algum dado a um dos escravos.

 

Vou usar comunicação rs485, para isso estou usando o MAX485.

 

Minha dúvida é como posso implementar um protocolo para que somente um escravo transmita de cada vez, e o mestre saber de qual escravo é o dado.

 

Pelo que eu estava pesquisando vou ter que utilizar MODBUS, mas pelo que procurei não achei nenhuma biblioteca ou exemplo para PIC.

 

Alguém teria alguma ideia de como posso implementar isto?

Link para o comentário
Compartilhar em outros sites

Para testar eu fiz estes códigos.

 

Master:

 

TR=1;     //Ativa pino de transmissao
Transmite_Const("ptrtu");     //Transmite constante
while(!TXSTAbits.TRMT);
TR=0;
while(!PIR1bits.RCIF);
TESTE=RCREG;
Conv_Bin_Asc(TESTE, TESTE_VAR, 4, 3);    //Converte Constante para mostrar em display
Pos_Cur(5);     //Posiciona cursor
Envia_Var(TESTE_VAR);      //Envia Variavel para Display
 
Escravo:
 
if((Buffer[0]=='t')&&(Buffer[1]=='r')&&(Buffer[2]=='t'))
      {
Converte_AD0();   //Converte AD0 e armazena na variavel TESTE
TR=1;
TXREG=TESTE;
while(!TXSTAbits.TRMT);
TR=0;
Buffer[0]=0;
Buffer[1]=0;
Buffer[2]=0;
      }

 

Tem uma função na interrupção alta do escravo na qual verifica se o dado começa com 'p' para começar a armazenar no buffer, e depois verifica se o ultimo caractere é 'u' para terminar a transmissão.

 

Porém não está funcionando. Pelo que verifiquei o Mestre envia a mensagem somente uma vez e o escravo não retorna nada.

Link para o comentário
Compartilhar em outros sites

Consegui fazer funcionar, meu erro era que estava tentando trasmitir uma int, troquei por char e foi.

 

Agora o problema é que se eu uso o while(!PIR1bits.RCIF); para depois igualar a variavel ao RCREG, simplesmente o programa trava ai.

 

Agora se eu troco esta while por um delay da certo.

 

Só que o ideal seria eu usar a while. O que pode estar errado?

Link para o comentário
Compartilhar em outros sites

Eu tentei mudar um pouco o código, agora ta assim:

 

Código no Mestre:
void Tr_485(rom char *str, char Var) //Aqui eu insiro um comando exemplo "prstu" no qual só um escravo irá executar um comando
{
TR=1; //Ativa pino do MAX485 para poder transmitir
while(*str)
{
while(!PIR1bits.TXIF);
TXREG=*str;
str++;
}
while(!TXSTAbits.TRMT);
TR=0;
while(!PIR1bits.RCIF);
Var=RCREG;
}
 
Código no escravo:
if((Buffer[0]=='r')&&(Buffer[1]=='s')&&(Buffer[2]=='t')) //No escravo quando tiver interrupção irá reconhecer os primeiro e ultimos caracteres de endereçamento e armazenar na buffer os dados
{
KWH=255;
TR=1;
TXREG=KWH;
while(!TXSTAbits.TRMT);
TR=0;
Buffer[0]=0;
Buffer[1]=0;
Buffer[2]=0;
}
 
 
Porém sempre o código trava no mestre na linha "while(!TXSTAbits.TRMT);" tanto que se eu alterar isto por um delay ele não trava mais o programa.
 
Que erro posso estar cometendo pra ocasionar esta possível "trava" no programa?
Link para o comentário
Compartilhar em outros sites

@henrique T.,

Fazem alguns anos, na Revista Elektor saiu um projeto de um Bus caseiro RS485, onde um master conversava com vários slaves. O que eles fizeram no hardware é definir um endereço para cada slave, quando o mestre transmitia todos recebiam, e decodificavam o endereçamento, e apenas aquele que batia o endereçamento recebia o resto da comunicação, e enviava os dados pedidos ao mestre.

Era um sistema de protocolo muito simples, o artigo defifnia muito bem o funcionamento e voce pode adaptar fácil ao Pic.

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk, vou pesquisar aqui pra ver qual edição é, e se acho pra baixar. Dai já vai me ajudar a implementar o protocolo.

 

Por fim consegui arrumar o erro, o problema era que a interrupção do receptor do mestre estava ativada, foi só desativar que o programa não trava mais.

 

Agora estou tentando transmitir uma string que contem os valores de uma float, mas o problema é que no receptor na hora de atribuir o valor a uma string o programa só faz alguns ciclos e trava. E percebi que o problema é exatamente na string, já que se eu atribuir o valor a uma variável não trava.

 

Sendo que estou transmitindo e recebendo byte a byte da string.

Link para o comentário
Compartilhar em outros sites

 

Minha dúvida é como posso implementar um protocolo para que somente um escravo transmita de cada vez, e o mestre saber de qual escravo é o dado.

 

O dono do vídeo do link abaixo me mandou o código usado (há muiiiiiiito tempo atrás).

https://www.youtube.com/watch?v=ySBLuRbpCXA

 

Na época, o que eu percebi foi que a comunicação ocorria da seguinte forma:

- Todos possuíam  um endereço (inclusive o mestre);

- Somente o mestre iniciava a comunicação, o escravo só se comunicava quando o mestre pedia;

- Quando o mestre escrevia a string '01XXXXXX' (01 é o endereço do escravo e X são os dados) no barramento, todos os PICs escravos recebiam a mensagem mas somante o programado com endereço 01 respondia.

 

Mais ou menos assim:

MESTRE:    Envia string '01XXXXXXXXXX'   ESCRAVO 01:     Recebe a string '01XXXXXXXXXX';    if((string[0]==0)&&(string[1]==1))       //mestre quer se comunicar com este escravo    {        if(string[2]==1)                     //mestre quer ler um dado           envia dado solicitado com o endereço do mestre (ex: '00XXXXXXX' endereço mestre '00');                   if(string[2]==0)                     //mestre quer escrever um dado           atualiza um valor de referencia;         }ESCRAVO 02:     Recebe a string '01XXXXXXXXXX';    if((string[0]==0)&&(string[1]==2))       //mestre não quer se comunicar com este escravo    {    }

Era mais ou menos assim, não sei se ajuda mas está ai...

Falou õ/

 

Ah é... Procurei o código aqui, mas ele sumiu =D...

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...