İki pic birbiriyle haberleştirilebilir mi?

Başlatan Recep METE, 23 Ocak 2016, 12:31:24

Recep METE

Benim merak ettiğim bir konu, iki tane pici birbirine bağlanarak işlem yaptırılabilir mi? Şöyle ki; İki tane 16f877 pici birbirine bağlıyacağız. Birinci picin b0 ile iknici picin a0 birbirine bağlanacak. Birinci picin a0 pinine buton bağlanacak. Butona basınca ikinci picde ki program çalışacak. Bu mümkün müdür. Ben çok uğraştım ama yapamadım. Birinci picde yüklü program çalışıyor. İkinci picteki programı çalıştıramadım.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Hadi

hocam iki pice de ayni hexi mi yukluyorsunuz?

sadogan

Butona basınca  birinci pic in a0 pinini low olsun, birinci pic in a0 pini low olunca brirnci pic in b0 ini low yapın,
ikinci pic in a0 low mu diye kontrol edin low ise programınızı çalıştırın.

vitruvius

Yapılır. Aşağıdaki gibi bbir şeyin çalışması lazım. Önemli olan bayrakları ayarlamayı ve sıfırlamayı doğru yapmak. İlk picin ilgili pinini çıkış, ikinci picin ilgili pinini giriş yapmayı unutma. Ona rağmen araya bir direnç atabilirsin akımı sınırlamak için.

Birinc pic:
#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT,NODEBUG, NOCPD
#use delay(clock=4000000)

#define  startButton       pin_a0
#define  startSignal       pin_b0
int1 pic2Start = 0;

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

   set_tris_a(0x01);
   set_tris_b(0x00);
   
   output_a(0x00);
   output_b(0x00);
      
   while(1)
   {
      if(input(startButton))        // Butona basilmis mi bak
      {
         delay_ms(20);
         while(input(startButton));
         
         pic2Start = 1;             // Bayragi ayarla
      }
      
      if(pic2Start)                 // Butona basilmissa
      {
         output_high(startSignal);  // 2. pici calistir sinyalini ver
         delay_ms(20);              // Ufak bir sure bekle
         pic2Start = 0;             // Bayragi temizle
      }      
      else
         output_low(startSignal);   // Sinyali kes
   }
}



İkinci pic:
#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT,NODEBUG, NOCPD
#use delay(clock=4000000)

#define  startSignal    pin_a0
#define  led            pin_d7
int1 start = 0;

void startLedAnimation()
{
   output_toggle(led);
   delay_ms(500);
}

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

   set_tris_a(0x01);
   set_tris_d(0x00);
   
   output_a(0x00);
   output_d(0x00);
      
   while(1)
   {
      if(input(startSignal))           // Diger pic'ten baslat sinyali gelmisse
      {
         delay_ms(20);
         while(input(startSignal));
         
         start = 1;                    // Bayragi ayarla. Bu bayragi ne zaman istiyorsan sifirlaman gerekir.
      }
      
      if(start)
         startLedAnimation();
   }
}

dursuncemal

:=

Recep METE

#5
Alıntı yapılan: Hadi - 23 Ocak 2016, 12:36:35
hocam iki pice de ayni hexi mi yukluyorsunuz?
Hayır, her pice ayrı hexi yüklüyorum

mesaj birleştirme:: 24 Ocak 2016, 10:18:02

Alıntı yapılan: dursuncemal - 23 Ocak 2016, 18:45:24
buton hangi picte ?

Birinci picin a0 pinine bağlıyorum.

mesaj birleştirme:: 23 Ocak 2016, 20:47:05

Alıntı yapılan: vitruvius - 23 Ocak 2016, 15:26:44
Yapılır. Aşağıdaki gibi bbir şeyin çalışması lazım. Önemli olan bayrakları ayarlamayı ve sıfırlamayı doğru yapmak. İlk picin ilgili pinini çıkış, ikinci picin ilgili pinini giriş yapmayı unutma. Ona rağmen araya bir direnç atabilirsin akımı sınırlamak için.

Birinc pic:
#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT,NODEBUG, NOCPD
#use delay(clock=4000000)

#define  startButton       pin_a0
#define  startSignal       pin_b0
int1 pic2Start = 0;

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

   set_tris_a(0x01);
   set_tris_b(0x00);
   
   output_a(0x00);
   output_b(0x00);
      
   while(1)
   {
      if(input(startButton))        // Butona basilmis mi bak
      {
         delay_ms(20);
         while(input(startButton));
         
         pic2Start = 1;             // Bayragi ayarla
      }
      
      if(pic2Start)                 // Butona basilmissa
      {
         output_high(startSignal);  // 2. pici calistir sinyalini ver
         delay_ms(20);              // Ufak bir sure bekle
         pic2Start = 0;             // Bayragi temizle
      }      
      else
         output_low(startSignal);   // Sinyali kes
   }
}



İkinci pic:
#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT,NODEBUG, NOCPD
#use delay(clock=4000000)

#define  startSignal    pin_a0
#define  led            pin_d7
int1 start = 0;

void startLedAnimation()
{
   output_toggle(led);
   delay_ms(500);
}

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

   set_tris_a(0x01);
   set_tris_d(0x00);
   
   output_a(0x00);
   output_d(0x00);
      
   while(1)
   {
      if(input(startSignal))           // Diger pic'ten baslat sinyali gelmisse
      {
         delay_ms(20);
         while(input(startSignal));
         
         start = 1;                    // Bayragi ayarla. Bu bayragi ne zaman istiyorsan sifirlaman gerekir.
      }
      
      if(start)
         startLedAnimation();
   }
}


Hocam proteusta denedim çalıştıramadım.Acaba gerçek devrede çalışır mı? Ben proteusta hazırladığım şemada verdiğiniz koda göre bağlamaya çalıştım. Şöyleki; Birinci pice buton a0  takılı, birinci picin b0 pini ikinci picin a0 pinine bağlı ve led d7 pinine bağlı, doğru mudur sayın hocam. Ama ledi yakıp söndüremedim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

dursuncemal

#6
1. pice;

int1 buton_izin = 0;

if(input(!PIN_A0)){buton_izin= 1;}///a0 daki butona sasilmamisa buton okuma icin buton_izin i 1 yaptik  not: bu arada buton direnclerini pulldown kabul ediyoruz

if(input(PIN_A0)  & buton_izin  ){output_toggle(PIN_B0); buton_izin = 0;} ///    eger A0 1 ise ve buton izin = 1 ise >   b0 i toogle yap yani bir ise 0 sifir ise 1;  buton_izin = 0; elimi butondan cekmeden islem yapmamak
icin

if(PIN_B0){ birinci picin programinın yapmasi gerekenler  buraya yazilacak }else{birinci picten ciktigimiz icin yapmamasi gerekenler buraya yazilacak}// not b0 1 ise 1. pic 0 ise 2. pic isleyecek

2. pice

if(!PIN_B0){ ikinci picin programinın yapmasi gerekenler  buraya yazilacak }else{ikinci  picten ciktigimiz icin yapmamasi gerekenler buraya yazilacak}

mesaj birleştirme:: 23 Ocak 2016, 21:04:29

ccs nin fonksiyonlarini cok kullanmadigim icin ufk tefek yanlislar olbili mantigi anlatmak icin yazdim
:=

vitruvius

#7
Çalışır. Buton bağlantısı önemli tabi. Ben pozitif lojik olacak şekilde bağlıyorum butonları.

Buraya yükledim dosyaları.

http://www.filedropper.com/pp_4