Ir ao conteúdo
  • Cadastre-se

Comunicação entre pic


Posts recomendados

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

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...
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...