Comunicação entre 2 Pic´s

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Comunicação entre 2 Pic´s

Mensagempor amboni » 16 Out 2008 12:53

Olá,

estou com um problema pois não estou conseguindo enviar/receber dados entre 2 pic´s via serial,

no meu primeiro teste de envio de uma palavra funcionou, do livro do fabio, o codigo abaixo...
Código: Selecionar todos
#include <16f877.h>
#fuses nowdt, xt
#use delay ( clock = 4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7 )

void main()
{
   port_b_pullups(true);
   while(true)
   {
   delay_ms(1000);
   puts("testando..");
   }
}


aqui ele recebe no outro PIc e escreve na a serial...
Código: Selecionar todos
#include <16F877.h>                                     
#include <stdio.h>
#fuses xt,NOWDT,NOPROTECT,NOLVP
#use delay ( clock=4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7  )
//---------------------------------------

char buffer[30];
//---------------------------------------

void main()
{
  while(true)
   {
   gets (buffer);
   printf ("%s\r\n",buffer);
   }
}


até aqui ate tá... era pra teste inicial....
só que agora preciso enviar o resultado de uma conversão a/d, por exemplo o valor 5462 , e receber no outro PIC e executar umas continhas...

alguem pode me da uma luz de como fazer?.... emcima deste codigo ai estou a manhã inteira e ainda não consegui...


aguardo...
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor r.bertini » 16 Out 2008 13:15

Declara uma variável no primeiro PIC e iguala ela ao canal A/D. No caso do MikroC a instrução é Adc_Read(0); onde 0 é o número do canal A/D que vai ser lido.
EX:
Leitura = Adc_Read(0);

Depois você pode enviar o valor armazenado na variável para o outro PIC
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Mensagempor tcpipchip » 16 Out 2008 13:29

Algumas dicas para ti...

#DEVICE ADC=10

unsigned long int value;

main()
{
setup_port_a( RA0_ANALOG_RA3_RA2_REF);
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
.
.
. value = Read_ADC();
.
.
printf ("%u\r",value);
.
.
.

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor amboni » 16 Out 2008 13:42

tcpipchip escreveu:Algumas dicas para ti...

#DEVICE ADC=10

unsigned long int value;

main()
{
setup_port_a( RA0_ANALOG_RA3_RA2_REF);
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
.
.
. value = Read_ADC();
.
.
printf ("%u\r",value);
.
.
.

TCPIPCHIP


Ola TCPIPCHIP...

mesmo antes de colocar o AD estava fazendo teste com um INT16

Código: Selecionar todos
int16 valor;
.
.
.
valor= 5263;
printf("%lu", valor);


vai tudo bunitim...
o problema é como eu recebo estes dados no outro PIC via serial e quero utilizar ele como int16 igual como ele saiu la do primeiro PIC....
espero não estar errado... mais pelo que vi não consigo receber mais que 8 bits com o GETC(); se enviar um valor 60 por exemplo... consigo receber, mais se enviar 5263 como no exemplo... dai não da certo...

valeu por responder...
se tiver mais alguma dica...
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor amboni » 16 Out 2008 16:36

UP!
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor Muga » 16 Out 2008 21:17

quebra o int16 em dois bytes, envia ele e no outro lado remonta ele

data é teu int16

pra enviar:

for (i = 0; i < 2; i++)
putc(*((int8*)&data + i) ) ;

pra receber:

for (i = 0; i < 2; i++)
*((int8*)&data + i) = buffer[i];
Muga
Bit
 
Mensagens: 33
Registrado em: 21 Out 2006 09:41
Localização: Guaira - SP

Mensagempor buiz » 17 Out 2008 08:22

Olá Amboni,

Para enviar:

int16 valor;
putc(valor);


Para receber:

int16 valor;
valor=getc();

Um abraço Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor amboni » 17 Out 2008 09:12

buiz escreveu:Olá Amboni,

Para enviar:

int16 valor;
putc(valor);


Para receber:

int16 valor;
valor=getc();

Um abraço Buiz.


--
Buiz, primeiramente obrigado por responder...
ja tinha testado deste seu jeito....
se eu fazer assim funciona

Código: Selecionar todos
#include <16f877.h>
#fuses nowdt, xt
#use delay ( clock = 4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7 )

int16 valor;
void main()
{
   port_b_pullups(true);
   while(true)
   {
   delay_ms(1000);
   valor=52;         <<<<<  só 52
   putc(valor);
   }
}


mais se mandar um valor maior que 255 ele não manda o valor certo....
e eu preciso mandar o valor 5364 por exemplo.... e pegar este valor do outro lado e usá-lo em uma continha....

valeu por enquanto... vou me bater mais um pouco....
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor amboni » 17 Out 2008 13:21

Muga escreveu:quebra o int16 em dois bytes, envia ele e no outro lado remonta ele

data é teu int16

pra enviar:

for (i = 0; i < 2; i++)
putc(*((int8*)&data + i) ) ;

pra receber:

for (i = 0; i < 2; i++)
*((int8*)&data + i) = buffer[i];



Ola Muga,

fiz o teste como vc deu a dica
divide o INT16 por 2 e envia, 8bits 2 vezes...


Código: Selecionar todos
#include <16f877.h>
#fuses nowdt, xt
#use delay ( clock = 4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7 )

int16 valor;
int i;
void main()
{
   port_b_pullups(true);
   while(true)
   {
   delay_ms(1000);
    valor=9861;
   
for (i = 0; i < 2; i++)
putc(*((int8*)&valor + i) ) ;
  }
}


agora o recebimento.... to simulando no proteus... e da pra ver nas variaves que no Buffer[1] esta o primeiro valor enviado, e no Buffer[2] esa o segundo, tudo bunitinhu.... e a variavel Valor(INT16), esta com o valor certinhu....
só que tem um porém...
não consigo de jeito nenhum imprimir o valor da variavel Valor(INT16)...
pelo que percebi a rotina fica em loop e nao passa do for....

Código: Selecionar todos
#include <16F877.h>                                     // uc utilizado
#include <stdio.h>
#fuses xt,NOWDT,NOPROTECT,NOLVP
#use delay ( clock=4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7  )
//---------------------------------------

int buffer[2];
int16 valor;
int i;
//---------------------------------------
   

void main()
{
  while(true)
   {
   gets(buffer);
   for (i = 0; i < 2; i++)
   *((int8*)&valor + i) = buffer[i];
 
  printf ("%ld",valor);    <<<< COLOQUEI UM BREAKPOINT AQUI E 
                                   <<<< NUNCA CHEGA, PARECE ESTAR EM LOOP
  }
}


Valeu ,
Amboni
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor Sergio38br » 17 Out 2008 14:08

Não esta faltando a chave no for????

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

Mensagempor amboni » 17 Out 2008 14:58

funcionou assim.....

enviando....
Código: Selecionar todos
#include <16f877.h>
#fuses nowdt, xt
#use delay ( clock = 4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7 )

int16 valor;
void main()
{
   port_b_pullups(true);
   while(true)
   {
   delay_ms(1000);
   valor=32518;

putc(valor); //LSB
putc(valor/256); //MSB

  }
}


recebendo e mostrando na serial.....
Código: Selecionar todos
#include <16F877.h>                                     // uc utilizado
#include <stdio.h>
#fuses xt,NOWDT,NOPROTECT,NOLVP
#use delay ( clock=4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7  )
//---------------------------------------

int16 valor;
//---------------------------------------
void main()
{

  while(true)
   {
 
  valor=getc(); //LSB
  valor+=getc()*256; //MSB 

  printf ("%ld",valor);
 
  }
}
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor Muga » 20 Out 2008 14:51

perfeito Amboni, voce sacou a ideia, agora sugiro empacotar isso tudo dentro de um protocolo com crc.
para se testar na bancada, do jeito que esta funciona, mas se for implementar outros dispositivos ou complicar um pouco a sua rede uma camada de protocolo é necessaria.
abraco
Muga
Bit
 
Mensagens: 33
Registrado em: 21 Out 2006 09:41
Localização: Guaira - SP

Mensagempor Muga » 20 Out 2008 16:04

amboni escreveu:
Muga escreveu:quebra o int16 em dois bytes, envia ele e no outro lado remonta ele

data é teu int16

pra enviar:

for (i = 0; i < 2; i++)
putc(*((int8*)&data + i) ) ;

pra receber:

for (i = 0; i < 2; i++)
*((int8*)&data + i) = buffer[i];



Ola Muga,

fiz o teste como vc deu a dica
divide o INT16 por 2 e envia, 8bits 2 vezes...


Código: Selecionar todos
#include <16f877.h>
#fuses nowdt, xt
#use delay ( clock = 4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7 )

int16 valor;
int i;
void main()
{
   port_b_pullups(true);
   while(true)
   {
   delay_ms(1000);
    valor=9861;
   
for (i = 0; i < 2; i++)
putc(*((int8*)&valor + i) ) ;
  }
}


agora o recebimento.... to simulando no proteus... e da pra ver nas variaves que no Buffer[1] esta o primeiro valor enviado, e no Buffer[2] esa o segundo, tudo bunitinhu.... e a variavel Valor(INT16), esta com o valor certinhu....
só que tem um porém...
não consigo de jeito nenhum imprimir o valor da variavel Valor(INT16)...
pelo que percebi a rotina fica em loop e nao passa do for....

Código: Selecionar todos
#include <16F877.h>                                     // uc utilizado
#include <stdio.h>
#fuses xt,NOWDT,NOPROTECT,NOLVP
#use delay ( clock=4000000 )
#use rs232 ( baud = 4800, xmit = pin_c6, rcv = pin_c7  )
//---------------------------------------

int buffer[2];
int16 valor;
int i;
//---------------------------------------
   

void main()
{
  while(true)
   {
   gets(buffer);
   for (i = 0; i < 2; i++)
   *((int8*)&valor + i) = buffer[i];
 
  printf ("%ld",valor);    <<<< COLOQUEI UM BREAKPOINT AQUI E 
                                   <<<< NUNCA CHEGA, PARECE ESTAR EM LOOP
  }
}


Valeu ,
Amboni


acho que nao chegou no breakpoint pq voce nao especificou o numero de dados recebidos no gets(), travou ali...
normalmente se usa um buffer[++x]=getc() dentro da intrda para carregar o buffer, no seu caso quando x = 2 fecharia o minipacote e sinalizaria um flag para processar a concatenacao do int16 e apresentacao dele pelo printf
Muga
Bit
 
Mensagens: 33
Registrado em: 21 Out 2006 09:41
Localização: Guaira - SP

Mensagempor _blackmore_ » 07 Set 2009 14:05

pessoal, boa tarde.

para não abrir outro tópico sobre comunicação entre pics, eu resolvi desenterrar este.

Estou com a necessidade de fazer a comunicação serial entre 2 pics (18F252) pela serial, programando em C com compilador CCS.
Estou utilizando a biblioteca do livro Programação em C do Fábio Pereira, já li alguns tópicos, em outros fóruns inclusive, mas sem sucesso na solução do meu problema.
O que tem acontecido comigo é que o PIC transmissor está devidamente configurado tx, rx e o baud e na simulação com o proteus eu recebo o dado normalmente.
O sistema receptor quando configurado para enviar dados pelo proteus ele recebe normalmente, porém quando ligo ele para receber o sinal de outro PIC ele não funciona devidamente, ou os valores ficam inconstantes, ou não são os valores enviados ou apenas o ultimo algarismo do valor é recebido corretamente.
Estou enviando apenas 8 bits limpos ... sem nada a mais.

edit: ecoei o sinal recebido e comparei os dois sinais com o scope no proteus, e para minha surpresa ... iguais !!

Porquê será que não consigo ver o valor do sinal no display corretamente??!

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor _blackmore_ » 08 Set 2009 22:37

RESOLVIDO!!

para os interessados segue o fragmento do código, pode ser utilizado inclusive para PIC´s que não tem serial:

Código: Selecionar todos

#use rs232 ( baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <rs232.c>
#include <input.c>


main ()
{

   char valor[8];

      lcd_ini();
      lcd_escreve ('\f');                  // Apaga o display
      lcd_pos_xy(2,1);                  // Posiciona cursor linha 1
      printf (lcd_escreve,"Valor Recebido");

   while (true)
      {

         get_string ( valor,8);
         printf ("%s\r\n",valor);
         lcd_pos_xy(6,2);      
         printf (lcd_escreve,"%s",valor);

      }
   }
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26


Voltar para PIC

Quem está online

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

cron

x