spi tipi haberlesme

Başlatan selvi, 09 Eylül 2013, 15:00:06

salihonur

SPI sürekli aktif kalması master tarafında while döngüsü içinde sürekli

t=spi_read();

okumasından kaynaklanıyor. Herhangi bir sorun teşkil etmez. Ledlerin yanmaması verinin doğru iletilememesinden kaynaklanıyordur. Anladığım kadarıyla Proteus'da deneme yapıyorsun. Ölçü aletinin arasında "SPI DEBUGGER" var. SPI DEBUGGER'ı da slave gibi düşünerek bağlayıp verileri karşılaştırmanı rica edeceğim. Yani masterın gönderdiğini SPI Debugger'ın SDO pininde aynen görebilmen lazım. Yarın aynı devreyi kendim de kurup deneyeyim.

selvi

 spi debugger bagladigimda herhangi bir butona basmadan alttaki degerler gosteriyor.butona basildiginda herhangi bir degisim yok sadece ss pinin aktif ve pasif durumunu gosteriyor.anladigim kadariyla butona basildiginda herhengi bir bilgi gitmiyor.
  85.500us 92.500us 34
  85.500us 92.500us FC

deneme imkaniniz oldu mu.olduysa sonuclari paylasabilirmisiniz.
Yaşam anlamlandırıldıkça kutsaldır....

salihonur

Epeydir fırsat bulamadım, henüz bakabildim.

Kodlarda bazı değişiklikler yaptım. Proteusda denedim ama sanırım Proteus yeterli hıza ulaşamadığından 2. ve 4. karakterleri atlıyor. Gerçek devre üzerinde denemenizi tavsiye ederim. Çalışması gerekiyor. Bu kodları UART haberleşmesinde kullanıyorum. SPI için yeniden uyarladım.

https://hotfile.com/dl/247556470/b8ffa52/SPI_HABERLESME_v2.zip.html

selvi

  spi protokolu ile iletisim yapmak basit deniliyor ama basit bir iki data yollamak istiyorum bir turlu olmuyor.manchecter kodlama sistemi istedigin kadar bilgi yolla bir sorun cikmiyor(pbp).
  o kadar zaman vermeme ragmen bir turlu istedigim sonuclari alamiyorum.simdiye kadar bir byte bilgi disinda bir sonuc alamadim.bir byte bilgi yollamada sorun cikmiyor.2.byte yollayip okumak istedigimde bir sey cikmiyor.anlasildigi kadar cok kullanisli bir protokol degil(basit gorunumune ragmen).
   forumda da  oyle sonuc alan bir program da goremedim.
Yaşam anlamlandırıldıkça kutsaldır....

selvi

  programda master dan 3 veri yollayip slave dan alma seklinde programi duzenledim calisti.slave 3 veri aldigina dair master a geri bildirim yapmasi icin bir data bilgisi yolladigimda genel programi etkiledi ayriyeten geri bildirim kismi calismadi.programlarin son sekli asagidadir.

master:
#include <16f877.h>     // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarlarý

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanýlan osilatör frekansý belirtiliyor

#define buton pin_a0
#define led   pin_c2

int8 ver1=0x10,ver2=0x20,ver3=0x30,data=0; // int8 tipinde deðiþkenler tanýmlanýyor                             

#int_ssp
void spi_kesmesi ()
{
  //data=spi_read();
  delay_ms(1);
}

/******************* ANA PROGRAM FONKSÝYONU *************************/
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dýþý
   setup_timer_1(T1_DISABLED);     // T1 zamanlayýcýsý devre dýþý
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriþ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dýþý
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dýþý
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dýþý
      
   set_tris_a(0x01);
   set_tris_c(0b00010000);
   
   output_c(0x00);
   
   setup_spi(spi_master| spi_L_to_H | spi_clk_div_4);  // SPI iletiþim ayarlarý belirtiliyor
  
   enable_interrupts(int_ssp);
   enable_interrupts(GLOBAL);
 
   while(TRUE) // Sonsuz Döngü
   {      
        if(input(buton))
        {
         spi_write(ver1);        // Belirtilen adrese yazdýrýlacak veri gönderiliyor
         delay_us(5);            // Gecikme veriliyor
         spi_write(ver2);
         delay_us(5);
         spi_write(ver3);
         delay_us(5);
         while(input(buton));
        }
        data=spi_read();
        if(data==0x05)
        {
          output_high(led);delay_ms(500);output_low(led);
        }
   }
}


slave:
#include <16f877.h>     // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarlarý

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanýlan osilatör frekansý belirtiliyor

#define led1  pin_a3
#define led2  pin_c0
#define led3  pin_c2

int8 data[3]={0,0,0},i=0,ver=0x05;  // int8 tipinde deðiþkenler tanýmlanýyor                               
int1 dondur=0;

#int_ssp
void spi_kesmesi ()
{
  data[i]=spi_read();
  i++;
  if(i==3) i=0;
}

/******************* ANA PROGRAM FONKSÝYONU *************************/
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dýþý
   setup_timer_1(T1_DISABLED);     // T1 zamanlayýcýsý devre dýþý
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriþ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dýþý
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dýþý
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dýþý
   
   set_tris_a(0x00);
   set_tris_c(0b00011000);
   
   setup_spi(spi_slave| spi_L_to_H | SPI_SS_DISABLED);  // SPI iletiþim ayarlarý belirtiliyor
   
   enable_interrupts(int_ssp);
   enable_interrupts(GLOBAL);

   while(TRUE) // Sonsuz Döngü
   {      
      if(data[0]==0x10 && data[1]==0x20 && data[2]==0x30)
      {
         output_high(led3);delay_ms(500);output_low(led3);
         data[0]=0;data[1]=0;data[2]=0;dondur=1;
      }
      
      if(dondur==1) spi_write(ver);
    
      delay_us(5);dondur=0;  
   }
}


geri bildirim icin master ve slave kisimnlarina asagidaki sekilde eklemeler yapinca sorunlar cikti.
master:
     data=spi_read();
        if(data==0x05)
        {
          output_high(led);delay_ms(500);output_low(led);
        }


slave:
  if(dondur==1) spi_write(ver);
    
      delay_us(5);dondur=0;
Yaşam anlamlandırıldıkça kutsaldır....

selvi

  programda bazi degisiklikler yaptim.butona ilk bastigimda genelde geri bildirim(tranceiver tarzi) yapiyor.yeni ledler normal yaniyor.belli araliklarla butona bastigimda slave deki led bazen yaniyor ama butona her basildiginda master daki geri bildirim sonucunda led yaniyor.ilk butona basma haric diger butona basmalarda istikrarsiz bir durum var.
   normalde master daki led slave  bilgi aldiginda mastera bilgi aldigina dair bilgi yolluyor.master bu bilgiyi aldiginda ledi yakiyor.yukarda bahsettigim gibi butona her basildiginda slave deki led yanmadiginda bile master daki led yaniyor.
    ledin yanmasi icin masterda kesme olusmasi gerekiyor.slave dan bilgi gelmedigi halde master da kesme olusabilir mi.yoksa gercekten slave mi bilgi yolluyor.bu durumda slave daki led niye yanmiyor sorusu geliyor.
master:
#include <16f877.h>     // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarlarý

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanýlan osilatör frekansý belirtiliyor

#define buton pin_a0
#define led   pin_c2

int8 ver1=0x10,ver2=0x20,ver3=0x30,data=0; // int8 tipinde deðiþkenler tanýmlanýyor 
int1 i=0;

#int_ssp
void spi_kesmesi()
{
 // data=spi_read();
  i=1;
  //delay_us(5);
}

/******************* ANA PROGRAM FONKSÝYONU *************************/
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dýþý
   setup_timer_1(T1_DISABLED);     // T1 zamanlayýcýsý devre dýþý
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriþ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dýþý
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dýþý
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dýþý
      
   set_tris_a(0x01);
   set_tris_c(0b00010000);
   
   output_c(0x00);
   
   setup_spi(spi_master| spi_L_to_H | spi_clk_div_4);  // SPI iletiþim ayarlarý belirtiliyor
  
   enable_interrupts(int_ssp);
   enable_interrupts(GLOBAL);
 
   while(TRUE) // Sonsuz Döngü
   {      
        if(input(buton))
        {
         spi_write(ver1);        // Belirtilen adrese yazdýrýlacak veri gönderiliyor
         delay_us(5);            // Gecikme veriliyor
         spi_write(ver2);
         delay_us(5);
         spi_write(ver3);
         delay_us(5);
         while(input(buton));
        }
        
        if(i==1){
        data=spi_read(0);
        if(data==0x05)
        {
          output_high(led);delay_ms(300);output_low(led);data=0;i=0;
        }
        }
   }
}


slave:
#include <16f877.h>     // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarlarý

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanýlan osilatör frekansý belirtiliyor

#define led1  pin_a3
#define led2  pin_c0
#define led3  pin_c2

int8 data[3]={0,0,0},i=0,ver=0x05;  // int8 tipinde deðiþkenler tanýmlanýyor                               
int1 dondur=0;

#int_ssp
void spi_kesmesi ()
{
  data[i]=spi_read();
  i++;
  if(i==3) i=0;
  //if(dondur==1){i=0;spi_write(ver);spi_write(ver);dondur=0;}
}

/******************* ANA PROGRAM FONKSÝYONU *************************/
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dýþý
   setup_timer_1(T1_DISABLED);     // T1 zamanlayýcýsý devre dýþý
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriþ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dýþý
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dýþý
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dýþý
   
   set_tris_a(0x00);
   set_tris_c(0b00011000);
   
   setup_spi(spi_slave| spi_L_to_H | SPI_SS_DISABLED);  // SPI iletiþim ayarlarý belirtiliyor
   
   enable_interrupts(int_ssp);
   enable_interrupts(GLOBAL);

   while(TRUE) // Sonsuz Döngü
   {      
      if(data[0]==0x10 && data[1]==0x20 && data[2]==0x30)
      {
         output_high(led3);delay_ms(500);output_low(led3);
         data[0]=0;data[1]=0;data[2]=0;dondur=1;
      }
      
      if(dondur==1) { spi_write(ver);spi_write(ver);dondur==0;}
     
   }
}
Yaşam anlamlandırıldıkça kutsaldır....