CCS i2c_GLOBAL-1

Başlatan omereliusuk, 26 Mart 2011, 14:14:51

omereliusuk

#ifndef SDA
#define scl  PIN_C3
#define sda  PIN_C4

#endif


BOOLEAN i2c_ready(byte entegre_adres) {
   int1 ack;
   i2c_start();            // If the write command is acknowledged,
   ack = i2c_write(entegre_adres);  // then the device is ready.
   i2c_stop();
   return !ack;
}

void i2c_out(byte entegre_adres ,BYTE ADRES, BYTE data)
/*Burada entegre adresi ds1307 için 0xd0; adres(mesela saniye için 0x00); ve değer de desimal olarak aktarılmalıdır. 
aksi halde kırmızı olan bölüm silinmelidir(desimali hexadesimale çeviriyor.). */

{
BYTE I10;
while(!i2c_ready(entegre_adres));
[color=red]I10=((DATA/10)<<4);
DATA=I10+(DATA%10);[/color]

   i2c_start();
   i2c_write(entegre_adres);
   i2c_write(ADRES);
   i2c_write(data);
   i2c_stop();
}

byte i2c_init_read(byte entegre_adres, BYTE ADRES)

{
while(!i2c_ready(entegre_adres));
      i2c_start();
      i2c_write(entegre_adres);
      i2c_write(ADRES);
      i2c_start();
   i2c_write(entegre_adres+1); 
  return(1);
}
BYTE i2c_in(BYTE SAYI,BYTE KNTRL) 
{   BYTE data;
   IF (SAYI<KNTRL)
{   
   data=i2c_read(1);
  }
ELSE {
   DATA=I2C_READ(0);
   I2C_STOP();
/* ds1307 pazar gününü 1 olarak kabul eder; buna göre cmt 7  */
} 
   RETURN(data);      
}/


yazım için örnek kod:
for (i=0;i<7;i++)                {
i2c_out(0xd0,i,time[i]);
                                    }

yazma yapmak için entegre adresi; ardından hangi adrese yazılacağı ardından da ne yazılacağı gösteriliyor.
0xd0 ds1307 için adres; i (saniye için 0x00); ve ardından time (buraya saniye veya başka bir değişken yazabilirsiniz.). aktarılıyor. bu işlem 7 defa tekrarlandığı için saniye dakika saat haftanın günü gün ay yıl bilgisi sırasıyla aktarılmış oluyor. eğer for döngüsünü kaldırırsanız sadece bir adrese bilgi aktarımı yapar.

okuma için örnek kod:
i2c_init_read(0xd0,0x00);
for (i=0;i<7;i++)                {
   time[i]=i2c_in(i,0x06);
   date=(time[i]>>4)*10;
   time[i]=date+((time[i]<<4)>>4);
                                 }


burada i2c_init_read entegrenin adresi ve hangi adresten başlanacağını <yukarıdaki kodda saniye baz alınmış.>
for döngüsü içinde hangi adres okunacak ve kaç tane okunacaksa o bilgi yazılmalıdır. bcd formatındaki bilgi onluk tabana çevrilerek alınmıştır. i, 0x06 bilgisi kaçıncı bilginin okunacağını ve ne kadar okunacağını ifade eder. ack bilgisi için

her okumadan önce
i2c_init_read(entegre adresi,kaçıncı bilginin okunacağı); bilgisi gönderilip ardından
time=i2c_in(i,0x06); entegreden kaçıncı bilginin okunduğunu ve bunun nereye kadar süreceğini ifade etmektedir. ack sinyali için.
sadece bir bilgi okunması halinde

i2c_init_read(0xd0,0x03);
saat=i2c_in(1.sayı,2.sayı);bilgisinin gönderilmesi yeterlidir(1.sayı>2.sayı olacak şekilde).

protondaki str\7 gibi yapmaya çalıştım. umarım yeterli olmuştur.