2 Pic Rs232 Karşılıklı Haberleşmesi

Başlatan kadir55555, 11 Kasım 2018, 17:37:08

kadir55555

Merhaba arkadaşlar 2 adet pic i rs232 ile #intrda kullanarak haberleştirmeye çalışıyorum piclerden birisi 877a diğeri 628a her denetleyicide bir adet led mevcut bunun yanı sıra 877a üzerinde bir adet buton ve bir adet de lcd mevcut 877a üzerindeki butona basarak a0 girişinden bilgiyi alıyorum rs232 ile 628a ya gönderiyorum burada int_rda kesmesi içerisinde an0 çıkışını aktif ederek ledi yakıyorum 628a ya gelen bilgiyi daha sonra if komutuyla karşılaştırarak sonuca göre geri 877a entegresine gönderiyorum fakat 877a int_rda kesmesine girmiyor. Bu konuda beni yönlendirirseniz çok sevinirim. Kodlarıda aşağıdaki gibidir.

#include <16f877a.h>
#fuses XT,NOWDT,NOWRT,NOCPD,NOLVP,NOPUT,NODEBUG,NOPROTECT,NOBROWNOUT
#use delay(clock=4m)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd2.c>

int a;
void uyan()
{
putc(0x55);
putc(0x00);
putc(0xff);
return;
}



#int_rda
void serihaberlesme ()
{
disable_interrupts(int_rda);


a=getch();
if(a=='b')
{
lcd_init();
delay_ms(10);

lcd_gotoxy(1,1);
printf(lcd_putc,"LED_1");



output_high(pin_a1);
}

}







void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

enable_interrupts(GLOBAL);


set_tris_c(0b10000000);
output_c(0x00);


set_tris_a(0b00000001);
output_a(0x00);



set_tris_b(0x00);
output_B(0x00);



int c;
lcd_init();
delay_ms(10);

lcd_gotoxy(1,1);
printf(lcd_putc,"HOSGELDINIZ");

while(true)
{enable_interrupts(int_rda);



if(input(pin_a0))
{
uyan();
putc(0x01);
}

}


}


#include <16f628a.h>
#fuses INTRC,NOWDT,NOPUT,NOLVP,NOCPD,NOBROWNOUT,NOPROTECT
#use delay(clock=4m)
#use rs232 (baud=9600, xmit=pin_b2, rcv=pin_b1)

int c;
void uyan()
{
putc(0x55);
putc(0x00);
putc(0xff);
return;
}

#int_rda
void serihaberlesmekesmesi()
{
disable_interrupts(int_rda);
c=getch();
if(c==0x01)
{
output_high(pin_a0);



}
}

void main()
{
enable_interrupts(GLOBAL);
  
   setup_timer_1(T1_DISABLED);     
   setup_timer_2(T2_DISABLED,0,1); 
   setup_CCP1(CCP_OFF);            
   
int A=0x01;   

while(1)
{
enable_interrupts(int_rda);
if(c==0x01)
{
delay_ms(100);
uyan();
putc('b');
}

}

}

ziyaretci

Stop biti ve parity biti ayarı yapılmamış. Bu ayarlar yazılmadığında varsayılan olarak tanımlımıdır(stop=1, parity=n gibi) bilmem. Bunun dışında devre şemanızdan emin olmak gerekiyor.

Rx->Tx
Tx->Rx

Ek olarak giriş-çıkış ayarları kontrol edilmeli. Rx giriş, Tx çıkış.

fide

Pin_A0 pull_up ile vcc ye bağlı bir anahtar olarak düşünürsek
İf(input(pin_a0) ==0) şeklinde düzeltme gerekir ki anahtara basınca 0 olduğunu algılayıp veri göndersin.

Diğer bir konu(forumda da defalarca yazıldı çizildi.) :
İki mcu haberleşecekse önce veri alacak tarafta yazılımı geliştirin ve bilgisayardan usb seri dönüştürücü ile diğer mcunun göndereceği veriyi bilgisayardan gönderip test edin.

Her iki yazılımda bulunabilecek küçük kod hataları sizi günlerce uğraştırır.
Bu yüzden alıcı tarafı hazırlayın. Bilgisayardan gönderip, veriyi alıp almadığına bakın. Hatayı ona göre ayarlayın.

@erkantr67 belirttiği gibi rs232 çapraz bağlanır. Rx karşıda tx e, tx -> rx e bağlanır.

Önce bilgisayardan veri gönderip kontrol edin, alıcı çalıştıktan sonra aynı şekilde verici tarafı bilgisayara bağlar denersiniz. İki taraf da düzgün çalışıyorsa birbirine bağlayıp denersiniz.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com