avatar_Mayhoş

2 Pic TX RX Haberleşme

Başlatan Mayhoş, 21 Ocak 2020, 13:10:59

Mayhoş

Merhaba arkadaşlar,

Şuan için 2 adet pic ile haberleşme yapmaya çalışıyorum.

Eğer olursa pic sayısını arttıracağım. 1 master birden fazla slave olacak şekilde.

Ancak şöyle bir sorun yaşıyorum.

1.Pic 2.Pic'e veri gönderecek. 2.Pic bu veriyi işleyip tekrar 1.Pic'e geri dönüş yapacak.

1.Pic veriyi yolluyor 2.Pic işliyor ancak 2.Pic veriyi 1.Pic'e gönderemiyor ya da 1.Pic işleyemiyor. Program kilitleniyor sonrasında okuma veya yazma olmuyor.


1.Pic Kodu:

#include <16f877a.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT       
#use delay(clock=20000000)       
#use rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7, bits=8)     
#include <stdlib.h>

int16 x;

void main() 
{
set_tris_b(0x00);
output_b(0);

set_tris_a(0xFF);
output_a(0);

set_tris_c(0x9F);

   while (TRUE) 
   {
      output_low(pin_b7);	// RE ve DE pinlerini 0 yap (veri okumaya hazır)
   
      if (input(PIN_A0)==1)
      {
      output_high(pin_b7);	// A0 butonu 1 ise RE ve DE pinlerini 1 yap (veri yaz)
      fputc('1');		// 1 bilgisi gönder
      output_low(pin_b7);	// RE ve DE pinlerini 0 yap (veri okumaya hazır) 
      }
      
      if (input(PIN_A0)==0)     
      {
      output_high(pin_b7);	// A0 butonu 0 ise RE ve DE pinlerini 1 yap (veri yaz)
      fputc('0');		// 0 bilgisi gönder
      output_low(pin_b7);	// RE ve DE pinlerini 0 yap (veri okumaya hazır) 
      }
      
      if (kbhit()) 	
      {
      x = getc();
      }
       
      if (x=='2')		
      {
      output_high(pin_b0);	// 2.Picten 2 bilgisi geldiyse çıkış 1
      }
      
      if (x=='3')
      {
      output_low(pin_b0);	// 2.Picten 3 bilgisi geldiyse çıkış 0
      }
   }
}

2.Pic Kodu:

#include <16f877a.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT       
#use delay(clock=20000000)     
#use rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7, bits=8)
#include <stdlib.h>

int16 x;

void main() 
{
set_tris_b(0x00);
output_b(0);

set_tris_a(0xFF);
output_a(0);

set_tris_c(0x9F);

   while (TRUE) 
   {    
       output_low(pin_b7);	// RE ve DE pinlerini 0 yap (veri oku)
       
       if (kbhit()) 
       {
       x = getc();
       }
       
       if (x=='1')
       {
       output_high(pin_b0);	// 1.Picten 1 bilgisi geldiyse çıkış 1
       output_high(pin_b7);	// RE ve DE pinlerini 1 yap (veri yaz)
       fputc('2');		// 2 bilgisi gönder
       output_low(pin_b7);	// RE ve DE pinleirni tekrar 0 yap (okumaya geç)
       }
       
       if (x=='0')
       {
       output_low(pin_b0);	// 1.Picten 0 bilgisi geldiyse çıkış 0
       output_high(pin_b7);	// RE ve DE pinlerini 1 yap (veri yaz)
       fputc('3');		// 3 bilgisi gönder
       output_low(pin_b7);	// RE ve DE pinleirni tekrar 0 yap (okumaya geç)
       }        
   } 
}

2 adet MAX485 entegresi ile 2 pic'i birbirine bağlıyorum. RE ve DE pinlerini okuma ve yazmaya göre kendim kontrol edip aktif etmeye çalışıyorum ama başarılı olamadım.

Zamanlama ile ilgili sorun olduğunu düşünüyorum. 1.pic veriyi gönderiyor ama 2.pic ne zaman gönderecek, 1.pic ne zaman alma moduna geçecek bunlar denk gelmiyor sanki. Konuya çok hakim olmadığım için düzgün bir algoritma oluşturamadım.

Tek taraflı çalışmasında sorun yok. Eğer 1.pic veri göndersin, 2.pic alsın dersem başarılı bir şekilde çalışıyor. Karşılıklı haberleşmede atladığım konu nedir yardımcı olabilir misiniz?

Not: rs232 ayarlarında enable pin_c5 yapıp RE ve DE'yi onunla kontrol ettiğimde de istediğim sonucu alamadım.

Powered by EzPortal