Sıcaklık Değerinin Yazılımsal Olarak Elde Edilmesi
Bu bölümde, daha önce Linux Altında I2C İşlemleri konusunda bahsettiğimiz yöntemlere ilişkin birer örnek vereceğiz.
Örnek kodları derlerken, i2c-tools içinden çıkan i2c-dev.h başlık dosyasına ihtiyacımız olacak, bu sebeple derleme işleminde bu başlık dosyasının bulunduğu dizini de derleyiciye göstermeliyiz.
Her 3 örnekte de MCP9808 adresi, sıcaklık değerini okuyacağımız yazmaç adresi ve sıcaklık çözünürlük değeri aşağıdaki sembolik sabitlerle gösterilmiştir.
3 örneğimizde yalnızca sıcaklık değerinin okunma kısımları farklıdır. Sıcaklık yazmacındaki değer elde edildikten sonraki yorumlama kısmı ise değişmemektedir. Daha önce i2cget
ile elde ettiğimiz değeri inceleyerek sıcaklık değerine ulaşmıştık. Benzer işlemi burada C kodu ile yapacağız.
Her 3 uygulamada da temelde yapılan işlemler, MCP9808 ile iletişim kurmak, sonrasında sıcaklık yazmacının adresini göndermek ve periyodik olarak sıcaklık yazmacının değerini okuyarak yorumlamak şeklindedir.
İlk olarak sıcaklık yazmaç değerinin t isimli int bir değişkene çektiğimizi varsayalım. Bu aşamadan sonraki işlemler aşağıdaki gibi olacaktır.
Bu kod üzerinden tekrar eski bilgilerimizi tekrarlayalım. Sıcaklık yazmacındaki yüksek anlamlı 4 bit'in sıcaklığın mutlak değeriyle alakalı olmadığını hatırlayın. 15., 14. ve 13. bitler alert bitleri, 12. bit ise işaret bitidir. Bu sebeple başlangıçta bu bitleri göz ardı edebiliriz. Aşağıdaki kod bu duruma ilişkindir.
Bu değer daha sonra sıcaklık ölçüm çözünürlüğüyle çarpılarak, mutlak sıcaklık değerine erişilir.
Bu aşamadan sonra sıcaklığın polaritesi için işaret bitine (12. bit) bakılmalıdır. 0x1000 ile bitsel and işlemi sonucu 1 çıkıyorsa sayı negatif demektir. Sıcaklığın sayının ikiye tümleyeni şeklinde tutulduğunu daha önce söylemiştik. Bu sebeple bu durumda sayıdan 256 değeri çıkarılmaktadır.
256 sayısının nereden geldiğini daha iyi anlamak için aşağıdaki nota bakabilirsiniz.
Not: Bir sayının 2'ye tümleyeni alınırken, ilk önce 1'e tümleyenin alındığını daha sonra elde edilen sonucun 1 ile toplandığını hatırlayınız. 1'e tümleme işlemi için sayının 1 olan bitleri 0, 0 olanlar ise 1 yapılmalıdır.
Bir byte sınırlarındaki bir sayı için konuşacak olursak. Sayının bitlerinin ters çevrilmesi neticesinde elde edilen sayı, sayının kendisinin 255 sayısı ile arasındaki farkı vermektedir. Çünkü sayının kendisiyle bitlerinin ters çevrilmiş halinin toplamı 255 sayısını verecektir.
Sonrasındaki 1 ile toplama işlemi ise sayının 255 ile arasındaki farktan 1 fazlasının elde edilmesine neden olacaktır. Aynı işlem sayının 256 sayısı ile arasındaki fark ile de elde edilebilir.
Bu aşamadan sonra temp değişkeni Celsius derece cinsinden sıcaklık değerini göstermektedir.
Örnek kodları sırasıyla i2c_1.c
, i2c_2.c
ve i2c_3.c
adlarıyla saklayıp, çapraz derleyicinize i2c-dev.h
dosyasının yerini göstererek derleyebilirsiniz. Bizim sistemimiz için geçerli derleme aşağıdaki gibidir.
Her 3 örnekte de sıcaklık 1 saniye aralıklarla okunarak konsola basılmaktadır.
Yazma ve Okuma İşlemlerinde read
, write
Sistem Çağrılarının Kullanılması
read
, write
Sistem Çağrılarının KullanılmasıÖrnek kodda, I2C üzerinden okuma işlemleri read/write sistem çağrılarıyla yapılmaktadır.
Yazma ve Okuma İşlemlerinde ioctl
Çağrılarının Kullanılması
ioctl
Çağrılarının KullanılmasıÖrnek kodda, I2C üzerinden okuma işlemleri ioctl çağrısı ile yapılmıştır. Bu yöntemde okuma ve yazma işlemleri, hattın kullanımını bırakmaksızın, combined bir şekilde yapılabilmektedir.
Yazma ve Okuma İşlemlerinde i2c-dev.h
Fonksiyonlarının Kullanılması
i2c-dev.h
Fonksiyonlarının KullanılmasıBu yöntemde, i2c-tools fonksiyonlarını kullandık. Gerekli fonksiyonlar i2c-dev.h başlık dosyasında inline olarak tanımlıdır.
Örnekteki bir noktaya dikkatinizi çekmek istiyoruz. i2c_smbus_read_word_data ile okunan değerin yüksek ve düşük anlamlı byte'ları swap edilmiştir.
Daha önce benzer işlemi i2cget ile elde ettiğimiz değer için de yaptığımızı hatırlayınız. i2c_smbus_read_word_data, ilk okuduğu değeri düşük anlamlı olarak ifade etmektedir. Fakat MCP9808 üzerinden ilk olarak yüksek anlamlı byte gönderilmektedir. Bu sebeple, sıcaklık değeri yorunlanmadan önce, bir swap işlemi yapılmaktadır.
Last updated
Was this helpful?