This post is also available in: English

forum-banner


Forum Navigation
Forum breadcrumbs - You are here:ForumBilim: YazılımMikroCI2C Protokolü
Konu ve mesaj oluşturabilmek için giriş yapmanız gerekmektedir.

I2C Protokolü

Konu kapanmıştır.

Merhabalar

  • Yukarıda ki örnek eeprom için mi yoksa sadece deneme amaçlı mı ? Çünkü eeprom da adres şablonu bu şekilde değil.
  • Ayrıca işlemden sonra "k=k*2" ne için onu anlayamadım

İyi Çalışmalar

Konu kapanmıştır.

Merhabalar

Ercan hocama ayırca I2C_ADRES_GONDER(ADRESS,OKU VEYA YAZ); burada bir yanlışık var bu saat entegresinde nasıl calışmış cok şaşırdım. cünkü ben eepromu en son okumayınca ack gelip gelmediğine baktım ve gördüm ki entegreden onay gelmiyor. sonra incelediğimde adress kısmına 8 bit yazıldığını gördüm son okuma ve yazma biti peşine eklenince 9 bitlik bir gönderim oluyor. o yüzden entegre ile bir türlü haberleşme kuramamıştım daha sonra ilk biti silip deneyince do-while döngüsünden cıkmıştı yani entegre cevap vermişti iletişime.

  • Burada bir hata yok. Fonksiyonda adres bilgisi ile sona gelen yazma yada okuma biti adres bilgisi kaydırılarak yine 8 bitlik yapılıyor. Bu kütüphane sadece DS1307 de değil önümüzdeki ay sonunda yayınlayacağım MCP4561 de de çalıştı. Çünkü I2C genel mantığı bu şekilde.
  • Eğer adresi yazarken okuma bitinide dahil ederek adres bölümüne yazdıysan o zaman o sebeple hata vermiş olabilir.
  • Yani yukarı gelecek olursak adres diyelimki "0b00001000" ve okuma yapacaz dedik yani "1" yazdık gidecek veri "0b00001001" bu şekilde düzenlenip gönderiliyor. Bit kaydırılarak.
  • Örnek olarak EEPROM adresi "1010010" ise bunu "01010010" olarak I2C fonksiyonuna yazmalısın yazmalısın. Eğer "10100100" yazarsan o zaman hata verir.
  • Yani yukarıda "k=k*2" yanlıştır. Çünkü k neyse adreste odur. Birleştirmeyi fonksiyon içerisinde yapmaktadır.
  • Eğer bu tarz sorunlar yaşadığından o kodlar ile beraber yazarsan daha fazla yardımcı olabilirim. Çünkü yaptığın silme işlemi ileride sorun yaratabilir yada kullanım hatasından kaynaklanabilir.
  • Ayrıca okumayı nasıl yaptın okuma prosedürü yazmadan biraz farklıdır sorun o da olabilir. Onuda yazabilirsen inceleyelim
  • Gerçek şartlarda deniyorsa SCL ve SDA pinini mutlaka 20k ile pull-up yapmayı unutma.
  • NOT: Bu tarz çalışmalarda gelen ve giden cevapları(ACK yada NACK gibi) osiloskop ile test ederek yayınlıyorum.

Konu kapanmıştır.

Merhabalar

  • Zaten fonksiyon birleştirmeyi yapıyor yani k sadece adrestir :)
  • Evet mantık olarak şöyle I2C protokolünde tam bir adres verisi olsun diyorsak dediğin doğru adres+yazma biti bir bütün olarak geçiyor ancak EEPROM adresi demek kavram olarak pek mantıklı değil çünkü o birleşik değere adres dersek okuma yapacağımız zaman adres verisi hangisi olacak :) Okuma yapınca o zaman adres 169 mu diyeceğiz. Adres demek gerçek anlamda okuma ve yazma yapılan RAM gözlerinin adresidir. Bu gözlere yapılacak okuma-yazma işlemi adresten ayrıdır.
  • S 0 1 A2  A1  A0  R/W ACK
    • Yukarıdaki tabloya göre EEPROM adresi sadece kırmızı olan kısımdır. Sonraki yazma/okuma biti adrese dahil değildir. Cihazın adresi atıyorum
      • 1010111 olsun
        • okuma yaparsak bu 10101111 olur
        • yazma yaparsak bu 10101110 olur
        • Yani adres değişmez sadece yapılan işleme göre sonuna 1 yada 0 gelir.
        • Biraz daha işlevsel düşünürsek k=k*2 den adresi aldık diyelim ve ben bu adresi bulunca sonra buraya okuma yap dedim ve k değerini fonksiyona atadım. Bu halde birleşik veri gideceğinden hata verecek ve adres bulma işlemi aslında işe yaramamış olacaktır. Çünkü 168 verisinin sonuna bu sefer yine 1 ekleyecektir.
  • Evet çalışmalar için ufak test cihazları en iyisidir. Birde belki isisdeki eeprom eski olabilir bilemiyorum hiç kullanmadım en iyi gerçekte denemek.
  • Aslında sonda söylediğiniz kısmın kodlarını paylaşabilirsen üzerinden gidebiliriz . Yani okuma ve yazma ile ilgili kısmı.

İyi Çalışmalar

 

Konu kapanmıştır.

Merhabalar

  I2C_ILETISIM_BASLAT();
  I2C_ADRES_GONDER(80,0);
  I2C_VERI_YAZ(5);
  I2C_ILETISIM_DURDUR();

  I2C_ILETISIM_BASLAT();
  I2C_ADRES_GONDER(80,1);
  deger=I2C_VERI_OKU(1);
  I2C_ILETISIM_DURDUR();
  • Okuma bölümünü yukarıdaki gibi yapabilirmisin birde böyle dene.
#define I2C_ILETISIM_HIZI Delay_us(10);// ı2c iletişim hız ayarlaması 10=100khz
  • Yukarıda ki kodu sil bunu zaten header dan okuması lazım
  • Bu kodlar PIC 18 lerde denendi isisdeki PIC i  PIC18f4620 yaparak dene
  • Birde eepromu illa PIC in scl sda sına bağlanaman gerek yok bu kütüphanenin bir özelliğide dilediğin porta bağlayıp çalıştırabilirsin.
  • Pull-up dirençleri de 20 k yapmalısın.
  • Bunları tek tek denersen sorunu bulabilirsin.
  • NOT: Bu 127 hatası benimde başıma geldi sonra pull-up ları 20 k yapınca düzeldi ancak isiste ne kadar geçerlidir bilemiyorum önce bunu dene bence.

Konu kapanmıştır.

Merhaba

SDA ve SCL yi başka portlara bağlayarak dene .

Bence sorun isisteki parçada. I2C de SCK olmaz SCL olur. Ama isis te SCK gözüküyor. Onu da kontrol et bence.

Eepromun vdd ve vss uçlarıda yok onlar bağlanmıyor mu isiste.

Bence sen çinden bu eepromdan da al pahalı değildir gerçekte dene isiste doğru bildiğinide unutursun. :-)

Denemeye devam :)