Spi ile PIC'ler Arası Haberleşmede Sorun

Başlatan OnderGrmz, 01 Aralık 2014, 16:01:53

OnderGrmz

Merhabalar;
2 tane PIC'i Spi üzerinden haberleştirip bilgi alış verişi yapmak istiyorum. Bu konuda birkaç sorum olacaktı.
İlk olarak PIC'leri kendi aralarında haberleştirip gönderilen bilgi alındıysa alıcı tarafında led yakmayı düşündüm. Ama Spi Debugger'dan baktığımda bilginin gönderildiğini ama led'in yanmadığını gördüm. Sonra bunu teyit etmek için görsel arayüz elemanı olarak Virtual terminal ekledim. Burada şunu anladım aşağıda Slave için verdiğim koddaki şu satırlar yapmak istediğim işi görmüyor.

if(okunan = 0x05)
        {        
        
       output_high(pin_b6);
       delay_ms(250);
       output_low(pin_b6);
       delay_ms(250);
       spi_write(bilgi);        // Belirtilen adrese yazdırılacak veri gönderiliyor
       delay_ms(5);            // Gecikme veriliyor
     
     }

Açıkçası if döngüsünün içinde hexadesimal bir sayı kullanılır mı bilmiyorum. Ama yukarıdaki kodu yazınca bilgi gelse dahi bu satırı yazınca if deyiminin içine girmiyor.

Master
/******************************************************
 PIC8F4680 ile Donanımsal SPI İletişimi Uygulaması
*******************************************************/

#include <18f4680.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=20000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor



#define cs PIN_C2    // CS ifadesi PIN_C2 pini yerine atanıyor

int8 okuma_istek=0x05,okunan_deger;  // int8 tipinde değişkenler tanımlanıyor



#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{
   output_high(pin_b7); // RB7'ya bağlı LED yansın
   delay_ms(100);       // Gecikme veriliyor
   output_low(pin_b7);  // RB7'ya bağlı LED sönsün
   
}


/******************* 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ışı
   
   
   setup_spi(spi_master| spi_L_to_H | spi_clk_div_4);  // SPI iletişim ayarları belirtiliyor
   
   enable_interrupts(int_ssp);   // SPI kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen tüm kesmelere izin ver  

  
   output_high(cs); // Harici EEPROM CS ucu lojik-1 yapılıyor

   while(1) // Sonsuz Döngü
   { 
   
     if(input(pin_b5)==1)
     {  
         while(input(pin_b5));                
         output_low(cs);         // Entegre seçiliyor
         spi_write(okuma_istek);
         delay_ms(5);
         okunan_deger=spi_read();
         delay_ms(5);
         output_high(cs);
         
     }   
      if(okunan_deger==0x10)
         {
            output_high(pin_b6);
            delay_ms(250);
            output_low(pin_b6);
            delay_ms(50);         
         }    
  }
      
  
}


Slave
/******************************************************
 PIC8F4680 ile Donanımsal SPI İletişimi Uygulaması
*******************************************************/

#include <18f4680.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

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 iletişim ayarları belirtiliyor
  // Dikkat: Nedense Rs232 iletişiminde #use delay(clock=20000000) ' de sıkıntı çıkıyor !!!
  // Yazdırılmak istenen değerler ekrana gelmiyor.
#include <input.c>   // input.c dosyası programa ekleniyor
#include <stdlib.h>  // stdlib.h dosyası programa ekleniyor

#define cs PIN_C2    // CS ifadesi PIN_C2 pini yerine atanıyor

int8 bilgi=0x10,okunan;  // int8 tipinde değişkenler tanımlanıyor
char islem; 


#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{
  okunan=spi_read();
  output_high(pin_b7); // RB7'ya bağlı LED yansın
   delay_ms(100);       // Gecikme veriliyor
   output_low(pin_b7);  // RB7'ya bağlı LED sönsün
   
}


/******************* 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ışı
   

   
   
   
   setup_spi(spi_slave| spi_L_to_H | spi_ss_disabled);  // SPI iletişim ayarları belirtiliyor
   
   enable_interrupts(int_ssp);   // SPI kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen tüm kesmelere izin ver  

  
 
  
   while(1) // Sonsuz Döngü
   {  
       if(spi_data_is_in()==1)// Bilgi gelip gelmediği kontrol ediliyor !!!
       {
       printf("\n\r\Bilgi alindi !!!");
       printf("\n\r\Alinan Deger=0x%02X",okunan );
       if(okunan = 0x05)
        {        
        
       output_high(pin_b6);
       delay_ms(250);
       output_low(pin_b6);
       delay_ms(250);
       spi_write(bilgi);        // Belirtilen adrese yazdırılacak veri gönderiliyor
       delay_ms(5);            // Gecikme veriliyor
     
     }
       
       }
      

       
       
              

  
      }
      
  
   }

Birde devrede RB5 butonuna basılınca devreyi çalıştırdığımda 0x2F bilgisi ortaya çıkıyor. Bunun ne olduğunu anlayamadım. Ayrıca Butona 2-3 kez basınca Virtual Terminale bilgi alındı verisi geliyor.
[IMG]http://i62.tinypic.com/2iagc4x.png[/img]
Yardımcı olursanız sevinirim.
Saygılarımla ...

Salih

Master programında da slave de olduğu gibi okuma işlemini spi kesmesinde niye yapmadın?

okunan=spi_read();

OnderGrmz

#2
Alıntı yapılan: salih - 01 Aralık 2014, 19:51:40
Master programında da slave de olduğu gibi okuma işlemini spi kesmesinde niye yapmadın?

okunan=spi_read();


Hocam sizin söylediğiniz gibi yapınca da değişen bir şey olmadı. Atladığım bir durum var sanırım.
Slave'de
setup_spi(spi_slave| spi_L_to_H | spi_ss_disabled);

bu kod satırını kullanınca Slave select veya Chip slect ( SS/CS ) pinini devre dışı bırakıyoruz. Peki Master'dan çıkan CS pinini bu koşullar altında nereye bağlamamız gerekiyor ?
Ben bunu Slave'de PIN_C2 üzerine bağladım. Ama programı yazarken hiç kullanmadım bu pini.

Ayrıca Slave denetleyiciden Master'a bilgi göndermek istediğimizde clock sinyali nasıl oluşacak? Onu ayrıca tanımlamak gerekiyor mu?

Pyrodigy

#3
SPI haberleşmede master ve slave aynı clock 'u paylaşır ve gönderilen ve alınan bilgi aynı komut saykı ile yapılır. Yani spi bilgi gönderirken işlenen sürede sen alım da yapmış alıyorsun. SPI haberleşmesi hakkında daha fazla kaynak döküman ve kaynak kod incelemeni öneririm.
Örnek kodlarında ( setup kısmında hata yapmadığını ve benim c bilmediğimi farz edersek ) 
spi_write(TX_bilgi); 
// Gecikme YOK !!
RX_bilgi = spi_oku();

Sadece Gönderim yapmak istediğin ve Alım bilgisine ihtiyacın olmasa veya Sadece alım yaptığın ve Gönderim bilgisine ihtiyacın olmadığı durumlarda bile aynı formülü kullanmak zorundasın.
Persistance is the name of the game in this business....

vitruvius

Alıntı yapılan: OnderGrmz - 01 Aralık 2014, 16:01:53
...Burada şunu anladım aşağıda Slave için verdiğim koddaki şu satırlar yapmak istediğim işi görmüyor.

if(okunan = 0x05)
{
     ...
}


Şurası gözden kaçmış sanırım.

if(okunan == 0x05)


olmalı.

Pyrodigy

Dandik c bilgim ile spi bilgi akışını anlatmaya çalışmak istersem şöyle bir kod çıkar, bilmem c ci hocalar ne der bu işe ?

Master Yazmak için
spi_write(TX_bilgi); 
RX_dummy_data=spi_read();


Slave Okumak için
spi_write(TX_dummy_data); 
RX_bilgi=spi_read();
Persistance is the name of the game in this business....

OnderGrmz

Merhabalar;
Alıntı yapılan: vitruvius - 01 Aralık 2014, 22:38:59
Şurası gözden kaçmış sanırım.
if(okunan == 0x05)

Kodu yukarıdaki şekilde değiştirdim. Master'dan gönderdiğim bilgiyi Slave'den alabildim ve Slave bilgiyi aldığında
if(okunan == 0x05)
        {     
           spi_write(bilgi);    
        }

satırıyla bilgiyi aldığına dair mesajı Master'a gönderdi. Fakat bunu yaparken her butona bastığımda göndermiyor. Bazen Master'dan gönderdiğim bilgi Slave'den Master'a tekrar gönderiliyor. Yani kısacası ben her butona bastığımda Slave bilgiyi aldım mesajı göndermesi gerekirken 2 kere butona bastığımda bilgi alındı mesajı gönderiyor.
kodların düzenlenmiş hali ve simülasyon görüntüsü aşağıdadır.

Master:
#include <18f4680.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=20000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor
#define cs PIN_C2    // CS ifadesi PIN_C2 pini yerine atanıyor
int8 okuma_istek=0x05,okunan_deger;  // int8 tipinde değişkenler tanımlanıyor

#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{  
}

/******************* 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ışı
   
   setup_spi(spi_master| spi_L_to_H | spi_clk_div_4);  // SPI iletişim ayarları belirtiliyor
   
   enable_interrupts(int_ssp);   // SPI kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen tüm kesmelere izin ver  
   output_high(cs); // Harici EEPROM CS ucu lojik-1 yapılıyor

   while(1) // Sonsuz Döngü
   { 
   
     if(input(pin_b5)==1)
     {  
         while(input(pin_b5));                
         output_low(cs); // Entegre seçiliyor
         spi_write(okuma_istek);
         okunan_deger=spi_read();         
         output_high(cs);    
     }        
  }  
}


Slave:
#include <18f4680.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

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

#include <input.c>   // input.c dosyası programa ekleniyor
#include <stdlib.h>  // stdlib.h dosyası programa ekleniyor
#define cs PIN_C2    // CS ifadesi PIN_C2 pini yerine atanıyor

int8 bilgi=0x10,okunan;  // int8 tipinde değişkenler tanımlanıyor
char islem; 

#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{      
       okunan=spi_read();
       if(okunan == 0x05)
        {     
            spi_write(bilgi);        // Belirtilen adrese yazdırılacak veri gönderiliyor    
          } 
}

/******************* 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ışı
   setup_spi(spi_slave| spi_L_to_H | spi_ss_disabled);  // SPI iletişim ayarları belirtiliyor
   enable_interrupts(int_ssp);   // SPI kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen tüm kesmelere izin ver  

   while(1) // Sonsuz Döngü
   {  
           
      }
 }


Spi Debugger Ekran Alıntısı: ( Baştaki 0x2F neden Slave'den gönderiliyor onu da anlamış değilim ?)
[IMG]http://i62.tinypic.com/9940b6.png[/img]

Pyrodigy

#7
Yazdığım formüle tekrar gözden geçirmeni öneririm ve ayrıca spi ın çalışma manıtığını tekrar okumalısın. SPI haberleşmede en fazla yapılan hata asenkron haberleşme zannedilmesidir. Halbuki SPI senkron haberleşir.
Tekrar üzerine basarak söylüyorum. Master veri gönderirken aynı zmanda alır ! Slave veri alırken aynı zamanda gönderir ! Bu verileri ister al kullan ister değerlendir o senin bileceğin iş ama mutlaka slave alırken data gönderir master da eğer istemiyorsa bile veriyi alır !!!!!!!
İşte o yüzden slave den anlamsız veri gönderildiğini görürsün.
SPI buffer ı olarak SSPBUF mı kullanıyorsun ? Evet ise slave master a örneğin 0xff göndert, sonra master alıp atsın ama mutlaka kodlarında ve özellikle kesme kullanıyorsan alım yap sonra sil at.
Not: Verdiğim kod örneğinde Dummy_Data demişim o dummy_datalar işe yaramayan ama mutlaka alınması / gönderilmesi gereken datadır.
Ayrıca buton için 20 ila 50 ms lik gecikme koy yoksa ark oluşur aynı datalar 2-3 defa gider gelir.

mesaj birleştirme:: 02 Aralık 2014, 10:55:31

Bir diğer önemli konu ise;
SPI da haberleşme Master ' ın clock' u üzerinden gerçekleşir. Master ve slave aynı clock üzerinden data alış verişi yaptığı için clock larıda aynı olmalı.
Kodlarında Master da 20MHZ Slave de 40MHz gördüm. Bunları değiştir aynı frekansı kullan yani ikiside ya 20 MHZ veya 40MHz olsun.
Persistance is the name of the game in this business....

OnderGrmz

Alıntı yapılan: Pyrodigy - 02 Aralık 2014, 10:44:38
Ayrıca buton için 20 ila 50 ms lik gecikme koy yoksa ark oluşur aynı datalar 2-3 defa gider gelir.
Ekledim hocam.

Alıntı yapılan: Pyrodigy - 01 Aralık 2014, 22:58:48

Master Yazmak için
spi_write(TX_bilgi); 
RX_dummy_data=spi_read();

Slave Okumak için
spi_write(TX_dummy_data); 
RX_bilgi=spi_read();

Tekrar üzerine basarak söylüyorum. Master veri gönderirken aynı zamanda alır ! Slave veri alırken aynı zamanda gönderir ! Bu verileri ister al kullan ister değerlendir o senin bileceğin iş ama mutlaka slave alırken data gönderir master da eğer istemiyorsa bile veriyi alır !!!!!!!
İşte o yüzden slave den anlamsız veri gönderildiğini görürsün.
Not: Verdiğim kod örneğinde Dummy_Data demişim o dummy_datalar işe yaramayan ama mutlaka alınması / gönderilmesi gereken datadır.

Bu bilgilere dayanarak kodları şu şekilde düzenledim ve sistem tam istediğim gibi çalıştı  :D
Master:
int8 okuma_istek=0x05,okunan_deger,master_tx_gereksiz=0x55; 
while(1) // Sonsuz Döngü
   {    
     if(input(pin_b5)==1)
     {   
         delay_ms(20);
         while(input(pin_b5));                

         output_low(cs); // Entegre seçiliyor
         spi_write(okuma_istek);//Bilgi yazmak için gerekli kodlar yazılıyor
         output_high(cs);
         delay_ms(50);

        output_low(50);
        okunan_deger=spi_read();
        spi_write(master_tx_gereksiz);//Bilgi almak için gerekli kodlar yazılıyor     
         output_high(cs);
  }       
  }


Slave:
int8 bilgi=0x10,okunan,slave_tx_gereksiz=0x12;
void SPI_kesmesi()
{      
       okunan=spi_read();
       spi_write(slave_tx_gereksiz);      
}
 while(1) // Sonsuz Döngü
{            
        if(okunan == 0x05)
    {        
       printf("\n\r\Bilgi alindi !!!");
       printf("\n\r\Alinan Deger=0x%02X",okunan );
       spi_write(bilgi);      // Belirtilen adrese yazdırılacak veri gönderiliyor
    }
}

Buda Spi Debugger ve Virtual Terminal Görüntüsü:
[IMG]http://i58.tinypic.com/2ufwzsn.png[/img]

Pyrodigy

Hayırlı olsun. Çalışan Kodlarını paylaşman güzel bir davranış.
Persistance is the name of the game in this business....

OnderGrmz

Alıntı yapılan: Pyrodigy - 04 Aralık 2014, 00:49:22
Hayırlı olsun. Çalışan Kodlarını paylaşman güzel bir davranış.
Yardımlarınız için teşekkür ederim hocam. Aynı durumlar ile karşılaşan arkadaşlara faydalı olması temennimizdir.
Alıntı yapılan: Pyrodigy - 02 Aralık 2014, 10:44:38
Bir diğer önemli konu ise;
SPI da haberleşme Master ' ın clock' u üzerinden gerçekleşir. Master ve slave aynı clock üzerinden data alış verişi yaptığı için clock larıda aynı olmalı.
Kodlarında Master da 20MHZ Slave de 40MHz gördüm. Bunları değiştir aynı frekansı kullan yani ikiside ya 20 MHZ veya 40MHz olsun.
Hocam aslında Master ve Slave'de 20 MHz'lik bir kristal kullanmayı düşünüyorum. Proteus'ta kurduğum Slave devre için yazdığım kodda kristali 20 MHz yapınca devredeki Virtual Terminal saçmalamaya başlıyor.

Aynen şu şekilde:
[IMG]http://i62.tinypic.com/33atod4.png[/img]

Bu devreyi kurduğumda RS232 ile bilgisayara bağlasam acaba Proteusta olduğu gibi saçmalar mı ?
Birde bu devreyi kurunca muhakkak beklenmedik problemler ortaya çıkıcak. Spi Debugger gibi gönderdiğim bilginin doğru gidip gitmediğini görüntüleyebilmek için gerçek zamanda kullanabileceğim bir aygıt var mı ?

RaMu

Kodu derlerken 20MHz seçiyorsun
daha sonra
isis üzerinde pic in üzerine çift tıklayıp frequency seçeneğini 20MHz e alıyorsun.

Böyle mi yapıyorsun?
Sadece isisde veya sadece kodda değiştirmen yetmez, ikisinide aynı yapmalısın.
Virtual terminal in uygun bir baudrate de olmasıda önemli.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Pyrodigy

#12
Alıntı yapılan: OnderGrmz - 04 Aralık 2014, 01:25:43
Yardımlarınız için teşekkür ederim hocam. Aynı durumlar ile karşılaşan arkadaşlara faydalı olması temennimizdir.Hocam aslında Master ve Slave'de 20 MHz'lik bir kristal kullanmayı düşünüyorum. Proteus'ta kurduğum Slave devre için yazdığım kodda kristali 20 MHz yapınca devredeki Virtual Terminal saçmalamaya başlıyor.

Aynen şu şekilde:
[IMG]http://i62.tinypic.com/33atod4.png[/img]

Şemayı bir gönder bakalım

Alıntı yapılan: OnderGrmz - 04 Aralık 2014, 01:25:43

Bu devreyi kurduğumda RS232 ile bilgisayara bağlasam acaba Proteusta olduğu gibi saçmalar mı ?
Birde bu devreyi kurunca muhakkak beklenmedik problemler ortaya çıkıcak. Spi Debugger gibi gönderdiğim bilginin doğru gidip gitmediğini görüntüleyebilmek için gerçek zamanda kullanabileceğim bir aygıt var mı ?


Microchip in debuggerleri var PICkit in virtual debuggeri var ama SPI varmı hatırlamıyorum.
Persistance is the name of the game in this business....

OnderGrmz

Alıntı yapılan: Pyrodigy - 04 Aralık 2014, 09:39:06
Şemayı bir gönder bakalım.
Hocam şu anda bilgisayarım yanımda değil.
Alıntı yapılan: RaMu - 04 Aralık 2014, 08:31:04
Kodu derlerken 20MHz seçiyorsun
daha sonra
isis üzerinde pic in üzerine çift tıklayıp frequency seçeneğini 20MHz e alıyorsun.
Böyle mi yapıyorsun?
Sadece isisde veya sadece kodda değiştirmen yetmez, ikisinide aynı yapmalısın.
İkisini de yapıyorum hocam. Yine kontrol eder buradan paylaşırım.   
Alıntı yapılan: RaMu - 04 Aralık 2014, 08:31:04
Virtual terminal in uygun bir baudrate de olmasıda önemli.
Virtual Terminal'in baudrate kısmına dikkat etmemiştim. Ona da bakacağım.

OnderGrmz

Alıntı yapılan: RaMu - 04 Aralık 2014, 08:31:04
Kodu derlerken 20MHz seçiyorsun
daha sonra
isis üzerinde pic in üzerine çift tıklayıp frequency seçeneğini 20MHz e alıyorsun.
Böyle mi yapıyorsun?
Sadece isisde veya sadece kodda değiştirmen yetmez, ikisinide aynı yapmalısın.
Hocam şimdi baktım da ben sadece kristal ile kodların frekansını değiştirmişim  :D
Entegreye tıklayıp oradan kristal frekansını değiştirince hiçbir sorun kalmadı.