i2c karmaşası.

Başlatan enrique34, 06 Nisan 2016, 16:25:43

enrique34

Merhaba arkadaşlar,
Kafamdaki i2c karmaşasını bir türlü çözemedim....
Şimdi örnek kodlara bakıyorum;
kimisi
i2cin SDA,SCL,$D0,[gelen]
kimisi
i2cin SDA,SCL,$98,$B1,[gelen] yazmış,
control dediğimiz kısım sensörün sabit adresi değilmi?
adres dediğimiz kısım control adresli sensörün registeri mi oluyor?
peki neden bazı örneklerde yazarken 1 okurken 0 diye açıklama görüyorum. control adresi sabit adres değilmi?

Aşağıda MPU-6550 Gyro sensörüne ait device adresi görülüyor. Diyor ki $68 benim device adresim, ama uygulamalarda $D0 kullanılıyor... :S


enrique34

#1
Mesela $68 device id 'si olan aynı sensörü arkadaş şu şekilde yazmış okumuş, okurken D1 yazarken D0 kafam karıştı açıkçası..


oku:
I2CIn SDA,SCL,$D1,$43,[gelenx.HighByte] 
I2CIn SDA,SCL,$D1,$44,[gelenx.LowByte ]
I2CIn SDA,SCL,$D1,$45,[geleny.HighByte]
I2CIn SDA,SCL,$D1,$46,[geleny.LowByte ]
I2CIn SDA,SCL,$D1,$47,[gelenz.HighByte]
I2CIn SDA,SCL,$D1,$48,[gelenz.LowByte ]     
Return

yaz:
I2COut SDA,SCL,$D0,$6B,[%10000000]
I2COut SDA,SCL,$D0,$6B,[%00000000]
I2COut SDA,SCL,$D0,$1A,[%00000001]
I2COut SDA,SCL,$D0,$1B,[%00001000]
Return

ete

I2C sisteminde her bir cihazın bir ID numarası yada cihaz numarası vardır. Farklı aletlerde bu farklı bir numaradır.
Bu sayede aynı I2C hattına birden fazla alet bağlanarak Cihaz numarası verilerek ilgili alete ulaşılır.

Yine I2C sisteminde Cihaz numarasının sıfır nolu biti Yazma/Okuma bitidir. Bu bit okuma yapılırken 1 yapılır, yazma yapılırken sıfır. PicBasicPro bu işi otomatik yapıyor zaten. Bunu ayrıca düşünmeniz gerekmiyor. Cihaz numaraları genelde okuma yazma biti dikkate alınmadan verilir. Dolayısıyla siz sadece o rakamı verirsiniz. Gerisini Basic halleder. Yok ben kendimde bununla ilgileneceğim dersende itiraz etmez. Çünki o zaten sizin vereceğini rakamın ilk bitini sıfırlayıp kendine göre değiştirerek kullanır.

İlgili cihaza ulaştıktan sonra cihaz içindeki farklı adresler var ise ulaşmak için ayrıca adres belirtmek gerekebilir. Belirtmezseniz her zaman sıfır nolu adres dikkate alınır.

Ete

enrique34

Hocam teşekkür ederim;
Anladığımı doğrulamak için yazıyorum;

$68 = $1101000x 'Device id x belirtilmeden
$D0= $11010001 'Okuma yapılacağı zamandaki değer
$D1= $11010000 'Yazma yapılacağı zamandaki değer

Ama siz diyorsunuz ki;
Yazarken;
ic2out,SDA,SCL,$D0....... 
ic2out,SDA,SCL,$D1.......
Okurken;
ic2in   ,SDA,SCL,$D0.......
ic2in   ,SDA,SCL,$D1.......
şeklinde yazsak değişen birşey olmaz.

Yanlış varsa lütfen düzeltiniz...
Saygılarımla..

ete

Senin sensörün device adresi $D0 olmalı. $68 bence register adresi. $D0 bilgisini ister $D0 ister $D1 olarak kullan PBP da farketmez diğer derleyicileri bilemem. Çünki derleyici sen $D0 da yazsan okuma yaparken onu $D1 olarak kullanır.

Bana kalırsa $68 mesleesini iyice araştır. Hiç bir zaman Device adresi $68 olan bir cihaz uygulamasında $D0 olarak kullanılmaz.
Data sheet'i iyi oku bence.

Ete

enrique34

Tamam hocam buldum datasheet şöyle anlatıyor;

Alıntı Yap
The slave address of the MPU-60X0 is b110100X which is 7 bits long. The LSB bit of the 7 bit address is
determined by the logic level on pin AD0. This allows two MPU-60X0s to be connected to the same I2C bus.
When used in this configuration, the address of the one of the devices should be b1101000 (pin AD0 is logic
low) and the address of the other should be b1101001 (pin AD0 is logic high)

Bu durumda x en düşük olan bit sıfır baz alındığında $D0 oluyor, device id'de buna bağlı olarak $D0 oluyor..
Bu durumda üretilen tüm sensörler için $D0 ve $D1 olarak tanımlanan başka bir id yok, buradan bunu anlıyorum.Mac adresi gibi. Şimdi anlaşıldı. Çok teşekkürler...

erdtur

Aslında Adres $68, fakat I2C haberleşmeside 8 bitlik registerin düşük anlamlı bitini R/W olarak kullanmak için registerin içindeki bitleri sola doğru 1 bit kaydırdığınızda registerin değeri $D0 oluyor.

Erdtur

ete

#7
Bence yanlış değerlendiriyorsun. Bit0 dikkate alınmadan Cihaz kodu $D0 olarak verilmelidir. $68'i kim söylemiş ise yanlış söylüyor ve değerlendiriyor. Doğru Cihaz numarası $D0 dır bu aletin. Bak yukarıda ne diyor Bu aletin cihaz numarası 7 bit olarak %110100X ve aslında sıfır olması gereken x biti burada aynı hatta iki adet sensör bağlanabilmesine olanak veriyormuş.
Birisine %11010000 cihaz numarası ile diğerine ise %11010010 ile ulaşılabilir diyor. Kısaca bu aletin cihaz numarası $D0 ve diğeride $D2 olmalı $D1 olarak kullanan vatandaş bunu yapmaya çalıştı belkide ama yanlış yapmış. Zira 7 bit üzerinde LSB biti 1 ve ya sıfır olabiliyor. 8 bit üzerinden ise 1 nolu bit olur bu.


Ete

Powered by EzPortal