PIC'leri Hem Verici Hem de Alıcı Kullanırke Hata Alıyorum

Başlatan semih, 19 Şubat 2013, 17:41:13

semih

Başlık pek aydınlatıcı olmadı sanrım.  :)

Projede iki pic kullanıyorum. Birincisi bilgisayara bağlı. Diğeri ise bilgisayara bağlı olan picle haberleşiyor. Bilgisayar tarafındaki pic'e seri porttan veri gönderdiğim zaman diğer pic'e sorunsuz bir şekilde iletim var. Fakat uzaktaki pic'ten bilgisayar tarafındaki pic'e veri yollarken RX pinini hem bu pic hem de seri port kullandığı için sorun çıkıyor.

Bilgisayar tarafındaki pic kodları:
#include <16f877a.h>
#fuses xt,nowdt,nowrt,nolvp,nocpd,nodebug,nobrownout
#use delay(clock=4M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)

#int_rda
void seriport()
{    
  switch(getch())
  {
      case 'z' : printf("A");
                 break;
      case 'c' : pritnf("B");
                 break;
  }
}

void main()
{
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);
      
   while(1)
   {
      switch(getch())
      {
         case 'y' : printf("Led Yandı"); 
                    break;
         case 's' : printf("Led Söndü!"; 
                    break;
      } 
}


Diğer pic komutları:

#include <16f877a.h>
#fuses xt,nowdt,nowrt,nocpd,nolvp,nodebug,nobrownout,noprotect
#use delay(clock=4M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)

void main()
{
   while(1)
   {
     switch(getch())
     {
         case 'A' : output_high(pin_b0); printf("y"); break;
         case 'B' : output_low(pin_b0);  printf("s"); break;
     }
   }
}


Kodlar görüldüğü gibi gayet basit. Bilgisayardan gönderdiğim kodlar ile ledi yakıp söndürüyorum. Led yandığında ise pic'ten bilgisayar tarafındaki pic'e komut yollayarak "Led Yandı" yazmasını ve bunun bilgisaya tarafından okunması sırasında sorun oluyor. Ben önce bilginin pic tarafından okunmasını sonra ise bilgisayara pic ile gönderilmesini istiyorum. Aşağıda devre şeklini verdim. Devredende görüldüğü gibi bilgisayar ile pic gönderilen metni aynı anda okumaya çalışıyor. Umarım sorunu anlatabilmişimdir.


semih

Hiç bir bilgisi olan yok mu acaba? İşlemcileri kendi aralarında nasıl haberleştirebilirim ?

z

Aynı seri portu hem bilgisayarla hem de bir diğer işlemci ile konuşmak için kullanıyorsan olmaz tabiki ben mi yanlış anladım.

Ya ayrı bir seri iletişim kanalı oluşturacaksın ya da konuşmak istediğin cihazla konuşmaya başlamadan önce konuşmak istemediğin cşhazla olan bağlantıyı fiziksel olarak koparacaksın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Sanırım bu devre gerçekte denenmedi.
Bu bağlantı şekli ile Bilgisayara bağlı picden diğerine veri gönderememen gerekli.. Bir şekilde ISIS internal pull-up ları denk getirmiş.

Kural şu. Cross bağlantı olmalı. TX ve RX ler birleşmeli. Bir TX çıkışına birden fazla RX pini bağlanabilir. Ama TX çıkışları birleşmemeli.. (Bu arada ISIS'i pek bilmem ama,  bilgisayardan veri gönderebildiğine göre; seri port ta gördüğün TX ve RX aslında karakterlerine göre (cross bağlantı dan dolayı) ters isimlendirilmiş. Yani seriport taki RX adlı 2. pin çıkış yapıyor aslında. Çıkış yapıyor derken pini low'a çekiyor.)

İki TX pini birleşecekse, UART çıkışı idle high, aktif low olduğuna göre, pinlerin çıkışlarına katotları TX pinlerine gelecek şekilde bir diyot bağlanmalı. Anotlar birleşerek RX pinine gitmeli. Yada bir TX ler AND kapısı ile birleştirilmeli. Varsa AND kapısının kullanılmayan girişleri high yapılmalı.

Senin şemana gelirsek;
Seriportun 2.pinine ve ikinci pic'in TX pinine  katot tarafı bağlı birer diyot (tercihen shottky) eklenecek, anotlar birleşerek bilgisayara bağlı pic'in RX pinine bağlanacak. Bu durumda ikinci pice gönderdiğin herşey bilgisayara da gelecek.

semih

Alıntı yapılan: z - 23 Şubat 2013, 13:08:09
Aynı seri portu hem bilgisayarla hem de bir diğer işlemci ile konuşmak için kullanıyorsan olmaz tabiki ben mi yanlış anladım.

Ya ayrı bir seri iletişim kanalı oluşturacaksın ya da konuşmak istediğin cihazla konuşmaya başlamadan önce konuşmak istemediğin cşhazla olan bağlantıyı fiziksel olarak koparacaksın.

Kastettiğiniz şu şekilde kod kullanmak mı?

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1,stream=bilgisayar)
#use rs232(baud=9600,xmit=pin_d6,rcv=pin_d7,parity=N,stop=1,stream=islemci)


BU şekilde denedim. Ledi yakıp söndürebiliyorum. Ayrıca ikinci picin d1 bacağı ve birinci picin d2 bacağını birleştirdikten sonra virtual terminal bağladığımda ikinci picten birinci pice olan veri akışını görebiliyorum. Ama birinci pic galiba bu kodu işleyemiyor. Kodları düzenlediğim şekilde aşağıda veriyorum. Hatam nerede acaba?

Bilgisayar tarafındaki pic yazılımı

#include <16f877a.h>
#fuses xt,nowdt,nowrt,nolvp,nocpd,nodebug,nobrownout
#use delay(clock=4M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1,stream=csharp)
#use rs232(baud=9600,xmit=pin_d1,rcv=pin_d2,parity=N,stop=1,stream=islemci)


void main()
{
      
   while(1)
   {
      switch(getch())
      {
         case 'y' : fprintf(csharp,"Led Yandı"); 
                    break;
         case 's' : fprintf(csharp,"Led Söndü!"); 
                    break;
         case 'z' : fprintf(islemci,"A");
                    break;
         case 'c' : fprintf(islemci,"B");
                    break;
      } 
   }
}


Diğer pic komutları

#include <16f877a.h>
#fuses xt,nowdt,nowrt,nocpd,nolvp,nodebug,nobrownout,noprotect
#use delay(clock=4M)
#use rs232(baud=9600,xmit=pin_d1,rcv=pin_d2,parity=N,stop=1,stream=islemci)

void main()
{
   while(1)
   {
     switch(getch())
     {
         case 'A' : output_high(pin_b0); fprintf(islemci,"y"); break;
         case 'B' : output_low(pin_b0);  fprintf(islemci,"s"); break;
     }
   }
}



Alıntı yapılan: iyildirim - 23 Şubat 2013, 17:51:30
Sanırım bu devre gerçekte denenmedi.
Bu bağlantı şekli ile Bilgisayara bağlı picden diğerine veri gönderememen gerekli.. Bir şekilde ISIS internal pull-up ları denk getirmiş.

Kural şu. Cross bağlantı olmalı. TX ve RX ler birleşmeli. Bir TX çıkışına birden fazla RX pini bağlanabilir. Ama TX çıkışları birleşmemeli.. (Bu arada ISIS'i pek bilmem ama,  bilgisayardan veri gönderebildiğine göre; seri port ta gördüğün TX ve RX aslında karakterlerine göre (cross bağlantı dan dolayı) ters isimlendirilmiş. Yani seriport taki RX adlı 2. pin çıkış yapıyor aslında. Çıkış yapıyor derken pini low'a çekiyor.)

İki TX pini birleşecekse, UART çıkışı idle high, aktif low olduğuna göre, pinlerin çıkışlarına katotları TX pinlerine gelecek şekilde bir diyot bağlanmalı. Anotlar birleşerek RX pinine gitmeli. Yada bir TX ler AND kapısı ile birleştirilmeli. Varsa AND kapısının kullanılmayan girişleri high yapılmalı.

Senin şemana gelirsek;
Seriportun 2.pinine ve ikinci pic'in TX pinine  katot tarafı bağlı birer diyot (tercihen shottky) eklenecek, anotlar birleşerek bilgisayara bağlı pic'in RX pinine bağlanacak. Bu durumda ikinci pice gönderdiğin herşey bilgisayara da gelecek.

Ben ikinci pice gönderdiğim verileri bilgisayara da göndermek istemiyorum. Şu şekilde anlatıyım. Bilgisayar tarafındaki picim ile motorlara hareket etmeleri için bilgi gönderiyorum. Diğer picte bu bilgileri işliyor. Aynı zamanda sıcaklık gibi farklı ölçümler yaparak bilgisayar tarafındaki pice gönderecek.

toyo

Yanlış anlamadıysam diğer pic dediğiniz taraf led durum bilgisini bilgisayar kısmındaki pice gönderiyor.
o halde
fprintf(islemci,"y"); break;
fprintf(islemci,"s"); break;


satırlarını
fputc('y',islemci);break;
fputc('y',islemci);break;



olarak değiştirip deneyebilirmisiniz acaba ?
Gelirken ne getirilir ki giderken ne götürülür.

semih

Alıntı yapılan: toyo - 25 Şubat 2013, 19:35:24
Yanlış anlamadıysam diğer pic dediğiniz taraf led durum bilgisini bilgisayar kısmındaki pice gönderiyor.
o halde
fprintf(islemci,"y"); break;
fprintf(islemci,"s"); break;


satırlarını
fputc('y',islemci);break;
fputc('y',islemci);break;



olarak değiştirip deneyebilirmisiniz acaba ?

Evet led durum bilgisini bilgisayar tarafındaki bilgisayara gönderiyor. Dediğiniz gibi değiştirdim ama yine olmadı. İkinci pinin d1 pinine virtual terminal bağladığım zaman led yandığında y led söndürüldüğünde ise s bilgisinin iletildiğini görüyorum. Fakat compimin 3 numaralı pini (rx bacağı) yanmıyor.

toyo

isis dosyalarınızı upload etme şansınız vamı acaba?
Gelirken ne getirilir ki giderken ne götürülür.

semih

Ne zamandır çözmeye uğraşıyorum. Yardım edebilecek, bilgisi olan kimse yok mu?

digifuzyon


semih

Dediğiniz gibi de denemiştim olmamıştı. En sonunda pic'i değiştirdim. Çift seri porta sahip pic ile sorunu çözdüm