bir programcı için I2C :)

Başlatan apollaa, 11 Haziran 2008, 03:44:43

apollaa

/////////////////////////////////////////////////////////////////////////////////////////////////                                                                                
//                                                                                             // 
//             *****I2C YAZILIMI*****                                                          // 
//     Aşağıdaki fonksiyonlar I2C prtokolünü kısmen taklit                                     //
//     etmek (yazılımsal olarak) ve istenilen pic modelinde                                    //
//     çalıştırmak maksadıyla kullanılabilir.                                                  // 
//     Pin tanımlamalarını uygun şekilde değiştirin!!!                                         // 
//                                                                                             // 
//     seri_start();       iletişimi başlatır master==>>slave                                  // 
//     seri_stop();        iletişimi durdurur master==>>slave                                  // 
//     seri_write(data);   veri yazar (data: yazılacak 1 bayt) master==>>slave                 //                
//     seri_read(ack);     veri okur (ack: acknowledge gönder/gönderme => 1/0) slave==>>master //
//                                                                                             // 
//     not: output_float(....) komutu açık kollektör(yada drain) bağlantıları içindir          //
//          iki yönlü iletişim için kullanılır ve output_high(....) den farklıdır.             //
//                                                                                             //
//      ABDULLAH ASLAN                                                                         //
//         ELEKTRONİK MÜH.                                                                     //
/////////////////////////////////////////////////////////////////////////////////////////////////
                     
                   
   #define SCL  PIN_B3                                                                                 
   #define SDA  PIN_B4 
   #define delay_ee     delay_us(1)
   #define delay_e      delay_ms(20)                    
              
   void seri_start(){
                            
      output_float(SCL);
      output_float(SDA);
      delay_ee;                     
      output_low(SDA);
      delay_ee;
      output_low(SCL);
      delay_us(200);         
   }                 

   void seri_stop(){          
                             
      output_low(SDA);
      output_float(SCL);
      delay_ee;
      output_float(SDA);
      delay_e;  
   }    
                              
   int1 seri_write(int8 data){
      BYTE mask1=0x80;
      int8 i;
      int1 status;
      for(i=0;i<8;i++)
      {          
         if(data&mask1)     
            output_float(SDA);
         else
            output_low(SDA);
         delay_ee;                                
         output_float(SCL);  
         delay_ee;
         output_low(SCL);    
         delay_ee;
         mask1=mask1>>1;                         
   }  
      output_float(SDA);
      delay_ee;
      status=input(SDA);
      delay_ee;
      output_float(SCL);
      delay_ee;
      output_low(SCL);
      delay_ee;                      
      return(status);
            
   }

   BYTE seri_read(int1 ack){
      BYTE mask2=0x80;
      int8 i;
      BYTE temp=0x00;                                     
                            
      for(i=0;i<8;i++)
      {  
         
         if(input(SDA))                                           
            temp=temp|mask2;
         else
            temp=temp|0x00;
         delay_ee;
         output_float(SCL);
         delay_ee;              
         output_low(SCL); 
         mask2=mask2>>1;         
         delay_ee;
      }                  
      if(ack==1)
      {
         output_low(SDA);
         delay_ee;
         output_float(SCL);
         delay_ee;  
         output_low(SCL);
         delay_ee;
         output_float(SDA);
      }
      else
      {
         output_float(SDA);
         delay_ee;
         output_float(SCL);                       
         delay_ee;         
         output_low(SCL);
         delay_ee;
      }
      return(temp);
   }                                                                                    

///////////////////////////////////////////////////////////////////
//                                                               // 
//             eeprom_yaz(adres,data);                           //
//             eeprom_oku(adres);                                // 
//                                                               //
///////////////////////////////////////////////////////////////////

#include <seri_IO.c>

void init_eeprom()
{                                       
   
   output_float(SCL);
   output_float(SDA);
}

void eeprom_yaz(long int adres, BYTE data)
{
   short int status;
   seri_start();
   seri_write(0xa0);
   seri_write(adres>>8);
   seri_write(adres);
   seri_write(data);
   seri_stop();
   seri_start();
   status=seri_write(0xa0);
   while(status==1)
   {
      seri_start();
      status=seri_write(0xa0);
   }
}

BYTE eeprom_oku(long int adres)
{
   BYTE data;
   seri_start();
   seri_write(0xa0);
   seri_write(adres>>8);
   seri_write(adres);
   seri_start();
   seri_write(0xa1);
   data=seri_read(0);
   seri_stop();
   return(data);
}


mikrodenetleyicinizde I2C donanımınız yokmu???? ohalde bu kod işinizi görecektir ;)
program bana aittir, konu hakkında sorularınız olursa yardımcı olmaya çalışırım. I2C ayrıntıları için spesifikasyonunu internetten indirin.
Vatan Sizden Hizmet Bekler ( Her Alanda)

cevat

Biraz daha anlatım olabilrmi?

apollaa

Eğer programın ne işe yaradığını soruyorsanız, program üzerindeki açıklamama ek olarak şöyle ifade edeyim;
I2c yi tekyol üzerindeki iki yönlü haberleşmenin standartlaşmış bir formatı olarak tanımlayabiliriz. Günümüzde bu iletişimi kullanan pekçok elektronik cihaz bulunmakta(eeprom dan daha komplex cihazlara kadar). Bazı mikrodenetleyicilerde bu iletişim dahili i2c donanımlar tarafından yapılabilmektedir(16F877 gibi), yada harici i2c donanımları bağlanabilmektedir.Fakat 16f84,16f628 gibi bazı mikrodenetleyicilerde ise bu donanım bulunmamakta(ama harici olarak bağlanabilir). Dolayısıyla yukarıdaki programı I2C donanımının yaptığı işi yazılımsal olarak taklit etmek bağlamında 16F628A için yazdım. Örnek olarakta ikinci kod bloğunda da bu programı i2c iletişimi kullanan harici bir seri eepromla haberleşmek için kullandım.
Sonuç olarak eğer I2C donanımı olmayan bir mikrodenetleyici ile I2C uygulaması yapmak isterseniz bu programı kullanabilirsiniz. Tabi şunuda söylemek gerekir ki bu yazılım donanım olan i2c ile aynı performansı göstermeyebilir.
Umarım yardımcı olmuşumdur.
i2c spesifikasyonunu incelerseniz daha detaylı bilgiyi bulabilirsiniz.
Vatan Sizden Hizmet Bekler ( Her Alanda)

erkan06

Güzel çalışma ellerine sağlık Apollaa kardeş.
Soruyu soran arkadaşıma hitaben;
Mikroişlemciler donanımsal olarak çeşitli özelliklere sahiptir. Bir mikroişlemcinin neyi destekleyip desteklemediğinin en iyi cevabını ise o işlemciye ait datasheet verir. Features adı altında genelde bunlar listelenir. Sen bir mikroişlemci ile bişey yapmak istiyosun ama ona ait dökümanda bu özelliğin olmadığını gördün. Bu durumda imkan dahilince bunu yazılımı koşturarak yapabilirsin. Burda Apollaa, I2C protokolünü desteklemeyen bir işlemci için gereken temel kodu vermiştir. Gerisi senin bu kodu yorumlamana ve kendine göre değiştirerek kullanmana kalmış...
Ne mutlu Türküm diyene!

cevat

basicle ve yeni yeni proton öğrenmeye çalışıyorum.sizin yazdığınız neyle derliyeceğiz?

M_B

Alıntı yapılan: "cevat"basicle ve yeni yeni proton öğrenmeye çalışıyorum.sizin yazdığınız neyle derliyeceğiz?
CCS C ile
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet