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

Karasavay

Üye
Katılım
24 Mar 2021
Mesajlar
27
Puanları
1
Yaş
31
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ı ?
 
7. bit ile ilgili değil. 0. bit ile ilgili bu durum.

0. bit (1) ise okuma,
0. bit (0) ise yazma.
 
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.
 
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
129,807
Mesajlar
930,287
Kullanıcılar
452,608
Son üye
murat620

Yeni konular

Geri
Üst