Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
adalberto.maicon

Comunicação entre pic

Recommended Posts

boa noite

Estou tentando fazer uma comunicação entre dois pic 16f877a:

quando eu pressionar um botão quero que ligue a saida correspondente do outro pic, mais ou menos assim se eu apertar o rb0 quero que ligue o rb0 e assim por diante;

Meu problema e o seguinte quando eu aperto um botao esta enviando tudo de uma vez, segue meus codigos:

Transmissor

#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=10000000)
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)_mul()

void main()
{
char a[2];
char b[2];
char c[2];
char d[2];
char e[2];
char f[2];
char g[2];
char h[2];
char i[2];

a[1] = 'a';
b[1] = 'b';
c[1] = 'c';
d[1] = 'd';
e[1] = 'e';
f[1] = 'f';
g[1] = 'g';
h[1] = 'h';
i[1] = 'i';

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_a (0b111111);
set_tris_b (0b11111111);
set_tris_c (0b10111111);
set_tris_d (0b11111111);
set_tris_e (0b111);

output_a (0b000000);
output_b (0b00000000);
output_c (0b00000000);
output_d (0b00000000);
output_e (0b000);

while (true){

if(!input(PIN_B0)==0 & !input(PIN_C3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (a[1]);
putc (a[1]);
output_low (PIN_C6);

if(!input(PIN_B1)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (b[1]);
putc (b[1]);

output_low (PIN_C6);

if(!input(PIN_B2)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (c[1]);
putc (c[1]);
output_low (PIN_C6);

if(!input(PIN_B3)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (d[1]);
putc (d[1]);
output_low (PIN_C6);

if(!input(PIN_B4)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (e[1]);
putc (e[1]);
output_low (PIN_C6);

if(!input(PIN_B5)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (f[1]);
putc (f[1]);
output_low (PIN_C6);

if(!input(PIN_B6)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (g[1]);
putc (g[1]);
output_low (PIN_C6);

if(!input(PIN_B7)==0 & !input(pin_c3)==0); // aguarda entrada ativar
output_high (PIN_C6);
putc (h[1]);
putc (h[1]);
output_low (PIN_C6);
}
}

Receptor

#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=10000000)
#use rs232(baud=1200,parity=N,xmit=PIN_C5,rcv=PIN_C7,bits=8)


int byte_1 = 0;
int byte_2 = 0;
int byte_3 = 0;
char z[3];


void main(){
setup_comparator (nc_nc_nc_nc);

while (true){

if(kbhit()){
byte_1=getc();
byte_2=getc();
byte_3=getc();
}

if (byte_1=='a' && byte_2=='a')
output_high (PIN_B7);

if (byte_1=='b' && byte_2=='b')
output_high (PIN_B6);

if (byte_1=='c' && byte_2=='c')
output_high (PIN_B5);

if (byte_1=='d' && byte_2=='d')
output_high (PIN_B4);

if (byte_1=='e' && byte_2=='e')
output_high (PIN_B3);

if (byte_1=='f' && byte_2=='f')
output_high (PIN_B2);

if (byte_1=='g' && byte_2=='g')
output_high (PIN_B1);

if (byte_1=='h' && byte_2=='h')
output_high (PIN_B0);


}
}

se alguem puder me dar uma ajudinha!!!

post-945277-13884965981818_thumb.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conferi tudo mas você esqueceu de colocar debouncing no código do transmissor. E por que você está enviando o mesmo dado 2 vezes?

Veja: debouncing-iniciantes

Outra coisa é que a transmissão é serial. Você está tentando pegar 3 dados de uma vez no receptor. Você precisa pegar uma de cada vez.

EDIT: Muitos erros de sintaxe.

Mais uma:

Essa parte do código:

if(!input(PIN_B0)==0 && !input(PIN_C3)==0);

Isso é redundante. Quando você faz um IF assim:

if(!input(PIN_B0)

Você já está perguntando que ele é igual a zero. Veja:

!input(PIN_XX) --> Nível baixo

input(PIN_XX) --> Nível alto

Não se coloca ; depois do IF.

Você se esqueceu das chaves de abertura e fechamento do bloco IF. Por isso o código não funciona.

Operador AND é && e não &.

Vou fazer um esboço.

Qualquer dúvida pergunte.

EDIT 2:

Teste o código abaixo. Há várias formas de se fazer a mesma coisa. Deixei de um modo simples para você poder compreender e segui o mesmo raciocínio que você estava tendo.

Circuito (falta os leds):

16F877A_Serial_simples.png~original

Transmissor:

#include <16F877A.h>

#define WireTX PIN_C6
#define WireRX PIN_C7

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay (clock = 4000000)

#use rs232 (baud = 9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=serial)

char a[2];
char b[2];
char c[2];
char d[2];
char e[2];
char f[2];
char g[2];
char h[2];
char i[2];

void main ()
{
a[1] = 'a';
b[1] = 'b';
c[1] = 'c';
d[1] = 'd';
e[1] = 'e';
f[1] = 'f';
g[1] = 'g';
h[1] = 'h';

while (true)
{
if((!input(PIN_B0)) && (!input(PIN_C3)))
{
putc (a[1]);
do{} //debouncing
while((!input(PIN_B0)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B1)) && (!input(PIN_C3)))
{
putc (b[1]);
do{} //debouncing
while((!input(PIN_B1)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B2)) && (!input(PIN_C3)))
{
putc (c[1]);
do{} //debouncing
while((!input(PIN_B2)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B3)) && (!input(PIN_C3)))
{
putc (d[1]);
do{} //debouncing
while((!input(PIN_B3)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B4)) && (!input(PIN_C3)))
{
putc (e[1]);
do{} //debouncing
while((!input(PIN_B4)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B5)) && (!input(PIN_C3)))
{
putc (f[1]);
do{} //debouncing
while((!input(PIN_B5)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B6)) && (!input(PIN_C3)))
{
putc (g[1]);
do{} //debouncing
while((!input(PIN_B6)) && (!input(PIN_C3))); //debouncing
}

if((!input(PIN_B7)) && (!input(PIN_C3)))
{
putc (h[1]);
do{} //debouncing
while((!input(PIN_B7)) && (!input(PIN_C3))); //debouncing
}
}
}

Receptor:

#include <16F877A.h>

#define WireTX PIN_C6
#define WireRX PIN_C7

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay (clock = 4000000)

#use rs232 (baud = 9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=serial)

char byte1;

void main(void)
{
output_b(0);
delay_ms (300);
while(1)
{
if (kbhit())
{
byte1 = getc();
}

if (byte1 == 'a')
{
output_toggle (PIN_B0);
byte1 = 0;
}

if (byte1 == 'b')
{
output_toggle (PIN_B1);
byte1 = 0;
}

if (byte1 == 'c')
{
output_toggle (PIN_B2);
byte1 = 0;
}

if (byte1 == 'd')
{
output_toggle (PIN_B3);
byte1 = 0;
}

if (byte1 == 'e')
{
output_toggle (PIN_B4);
byte1 = 0;
}

if (byte1 == 'f')
{
output_toggle (PIN_B5);
byte1 = 0;
}

if (byte1 == 'g')
{
output_toggle (PIN_B6);
byte1 = 0;
}

if (byte1 == 'h')
{
output_toggle (PIN_B7);
byte1 = 0;
}
}
}

Falou

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mathus LPS preciso de uma ajuda sua!

queria saber como faço para habilita o pwm nesse seu código

pois já procurei sobre o assunto mas o unica que vir simplificado sobre comunicação entre dois pic foi Você

Pode me ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×