MikroC üzerinde I2C protokolü hakkında kafama takılan

  • Konbuyu başlatan Karasavay
  • Başlangıç tarihi

Karasavay

Üye
Katılım
24 Mar 2021
Mesajlar
6
Puanları
1
Yaş
27
Merhaba arkadaşlar. Doğru yerde sorduğumdan emin olmamakla birlikte bir şey danışmak istiyorum.

Ben I2C haberleşmesi hakkında çalışıyordum MikroC üzerinde (Aslında direk MikroC ile alakalı değil). I2C'de slave cihazların adressleri var biliyorsunuz. Buraya kadar tamam. Bazı adresler binari olarak 1 ile başlıyoR (MSB) (mesela ds1307'nin adresi 0xD0 ( 11010000)), bazıları ise 0 ile başlıyor(MSB) ( mesela MLX90614 sıcaklık sensörünün adresi 0x5A (01011010)) .

Şunu farkettim örnek kodları incelerken kodun adress yazdırma kısmında adress eğer 1 ile başlıyorsa kaydırma (<<) olmuyor, eğer 0 ile başlıyorsa 1 bit sola kaydırılıor (mesela 0x5A<<1 gibi)

Daha iyi anlatmak açısından;

I2C2_Wr( 0x5A << 1 ); ---Bu cihaz için kaydırma yapılmış.
I2C2_Wr( 0xD0 ); ---Bu cihaz için kaydırma yapılmamış.

Bunlar gibi bir kaç örnek daha gördüm, bu şekil yazılmış kodlar. Örneklerde bunu çıkardım. Fakat bunun teorik açıklaması ne bilen var mı ?
 

mehmet.bey

Usta Üye
Katılım
19 Ara 2011
Mesajlar
1,403
Puanları
183
7. bit ile ilgili değil. 0. bit ile ilgili bu durum.

0. bit (1) ise okuma,
0. bit (0) ise yazma.
 
Konu Sah

Karasavay

Üye
Katılım
24 Mar 2021
Mesajlar
6
Puanları
1
Yaş
27
7. bit ile ilgili değil. 0. bit ile ilgili bu durum.

0. bit (1) ise okuma,
0. bit (0) ise yazma.
Teşekkür ederim Mehmet bey ama bu kısmını biliyorum. galiba eksik anlattım. Örnek üzerinden tekrar anlatmaya çalışayım.

şimdi 0xD0 örneğinde adress yazma komutunda direk I2C2_Wr( 0xD0 ); yazıyoruz. Sonra okuma yapacaksak I2C2_Wr( 0xD1 ); yazıyoruz. (11010000 - 7. biti 1)

Fakat adresi 0x5A olan sensör için I2C2_Wr( 0x5A << 1 ); komutuyla adress yazıyoruz.
(01011010 7. biti 0)

Şimdi bu ikisi arasındaki farkın mantığı ne tam olarak. Birinin 7. biti 1 diğerinin ise 0 .

Farklı örneklerden gördüğüm kadarıyla 7. biti 1 olan cihazlar için kodda adress yazarken kaydırma yapılmamış. Fakat 7. biti 0 olan cihazlarda kaydırma yapılarak kodda adres yazılmış.


0x5A (01011010) - Bir bit sola kaydırdıgımız zaman 10110100 elde ediliyor. yani bu cihaz için adres yazma komutunda I2C2_Wr(01011010); yerine I2C2_Wr(10110100); yazıyoruz. Bu sıcaklık sensörünü denedim bu şekilde çalışıyor. Bit kaydırma yapmadığım zaman ise haberleşme yapmıyor. Sensör MLX90614 bu arada


kodda I2C2_Wr( 0x5A << 1 ); şeklinde yazmadığım zaman çalışmıyor yani. Bunun sebebini merak etmiştim.
 

silvestir

Profesyonel Üye
Katılım
10 Ağu 2011
Mesajlar
2,707
Puanları
658
Kimi üretici 7bit adres veriyor kimi 8 bit olarak veriyor. Datasheete bakmak lazım ya da 2 dk deneme çekip bulacaksın.
 

Forum istatistikleri

Konular
116,053
Mesajlar
817,514
Kullanıcılar
423,737
Son üye
Fatih9161

Yeni konular

Üst