Página 1 de 1
Comunicação entre 2 Pic´s

Enviado:
16 Out 2008 12:53
por amboni
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...

Enviado:
16 Out 2008 13:15
por r.bertini
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

Enviado:
16 Out 2008 13:29
por tcpipchip
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

Enviado:
16 Out 2008 13:42
por amboni
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...

Enviado:
16 Out 2008 16:36
por amboni
UP!

Enviado:
16 Out 2008 21:17
por Muga
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];

Enviado:
17 Out 2008 08:22
por buiz
Olá Amboni,
Para enviar:
int16 valor;
putc(valor);
Para receber:
int16 valor;
valor=getc();
Um abraço Buiz.

Enviado:
17 Out 2008 09:12
por amboni
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....

Enviado:
17 Out 2008 13:21
por amboni
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

Enviado:
17 Out 2008 14:08
por Sergio38br
Não esta faltando a chave no for????
[ ]'s
Sergio

Enviado:
17 Out 2008 14:58
por amboni
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);
}
}

Enviado:
20 Out 2008 14:51
por Muga
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

Enviado:
20 Out 2008 16:04
por Muga
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

Enviado:
07 Set 2009 14:05
por _blackmore_
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!

Enviado:
08 Set 2009 22:37
por _blackmore_
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);
}
}