Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

Editado por MatheusLPS
  • 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

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

×