MLX90614 kullanımı ?

Başlatan mustafa_cmbz, 20 Kasım 2020, 20:02:07

mustafa_cmbz

Merhabalar..

Merak ettim şu temazsız termometre yaparım diye MLX90614 aldım netten ama bir türlü çalıştıramadım..SMBUS diyor haberleşmesi için ama ı2c ile aynı gibi geldi yada farklımıdır onuda bilmiyorum.



Datahseette bu tarz bir örnek  protonda ı2c komutları ile aynı şekil denemeler yaptığımda ekranda 65535 değerini görüyorum.



mantık bunun gibi olması gerek diye aşağıdaki kodu oluşturdum..

 
SENSOR_OKU:  ' B4 8. BİT = 0 ---- B5 8. BİT = 1
   HBStart 
   HBusOut $B4 ,[$04]
   DelayMS 5    
   HBusIn  $B5 ,[SICAKLIK.LowByte,SICAKLIK.HighByte,PEC]  
   HBStop
   'Ta[°K] = Tareg × 02.0 , or 0.02°K / LSB. 
   ISI= SICAKLIK * 0.02 / SICAKLIK.LowByte
   Return


yanlız bu alttaki resimdeki olayı anlamadım.



burada ram adresleri olarak birkaç adres verilmiş sıcaklık okurken bunların hangisini sorgulamam gerekli ?

mustafa_cmbz

@ete hocam özellikle senin yorumunu merak ediyorum

ete

#2
Zor bir eleman seçmişsin. Üstelik data sheet de bir amatörün anlayacağı dilde ve açıklıkta değil.
Açıkçası bir kaç defa okudum ve şu kanaate vardım. Bu data sheet, sensör nasıl okunur okunan bilgi nerede bulunur ve onu kullanarak nasıl sıcaklık hesaplanır açık şekilde anlatmıyor. Elbette anladığım yerleri var. Ama anladıklarım bana sağlıklı okuma yapıp sıcaklık hesaplamaya yetmeyecek seviyede. Belki ingilizcesi daha iyi olanlar daha farklı sonuca ulaşabilirler.
Bu sensör ile yapılabilecek ilk iş bence okuma ve yazma yapılabiliyormu onu test etmek gerekir.
Okuma işi için 4 adet ID değeri okunabilir. Bu değerler $1C - $1D - $1E ve $1F adreslerinde yer alıyor.

Yazma için 8.3.3.1. ERPROM write sequence isimli başlığı okumak gerekiyor. Şöyle diyor.
EEPROM da bir ahfıza değeri değişmesi gerektiği zaman Melexis aşağıdaki prosedürü öneriyor
1. Cihazı açın
2. Önce ilgili hücreye (hafızaya) 0x0000 yazın ve efektif olarak hafızayı temizlemiş olun.
3. Yaklaşık 5ms bekleyin (10ms dahada emniyetli olur)
4. Yeni değeri yazın
5. Yine 5ms bekleyin(10ms daha emniyetliolur)
6. Yazdığınızı geri okuyun ve karşılaştırın ve yazmanın başarılı olup olmadığını anlayın.
7. Gücü kapatın ve değişikliğin bir sonraki açılışta etkili olacağını unutmayın.

Şimdi bu yazılanları dikkate alarak EEPROM da yazılabilir bir adres seçin çünki her adrese yazma yapılamıyor. Mesela 0x00 nolu adrese To(max) bir değer yazıp geri okuyabilirsiniz. İçeriği bozmamak açısından önce okuyup okuduğunuzu bir yere not alın en sonunda aynı değeri oraya yeniden yazamanız doğru olacaktır.
MBUS protokolü esas olarak I2C nin aynısı gibi gözüküyor. Genel format şu şekilde ,
I2CREAD DataPin,ClockPin,Control,{Address,}[Var{,Var...}]{,Label}
bu derleyiciler bazında isimlendirmede farklılık gösterebilir ancak format aynıdır değişmez.
Mesela sen okuma için  HBusIn komutunu kullanmışsın ama komutunda eksiklikler var.
Formatı okuma için yazacak olursak;
I2COKU SDA,SCL,SLAVE_ADRES,OKUMA_ADRESİ,[Değişken,Değişken....] şeklinde olmalı.
SDA ve SCL pinlerinde 10K pullup direnci mutlaka bağlı olmalı.
Diyelimki 0x00 nolu adresi okuyacaksın, Data Sheet 18 ci sayfada okumanın nasıl yapılacağı anlatılmış.
Önce Okuma emrini ve nerden okuyacağını bildireceksin. 20ci sayfada Commands lara bakarsan
%001x xxxx formatını EEPROMA a yazma yada okuma için kullanmış.
Burada xxxxx lerin yerine okunacak adres gelecektir. Bu arada Slave Address olarak fabrika default değeri $C5 demiş ama örneklerinde hep $B5 kullanmış. )Yazma $B4 , okuma $B5) buda ayrı bir karışıklık örneği. Her neyse biz $C5 kullanalım ve 0x00 nolu adresi okuyalım.
YAZI2C SDA,SCL,$C4,$00100000
OKUI2C SDA,SCL,$C5,[Veri.Byte0,Veri.Byte1,PEC]
şeklinde olmalı.
Kendi örneğine bakacak olursak, RAM in 7 nolu adresinden okuma yapmış. Slave adresi $B5 kullanmış.
YAZI2C SDA,SCL,$B4,%00000111
OKUI2C SDA,SCL,$B5,[Veri.byte0,Veri.byte1,PEC]
PEC burada CRC8 sonucunda hesaplanan değeri göstermektedir. Nasıl hesaplandığı internette bolca anlatılmış ama anlayabilirsen. Ben anlamıyorum doğrusu.
Örnekte, okunan değeri $3AD2 olaraka vermiş ve bundan hesaplanan PEC değeride $30 olarak verilmiş. Anlayan birisi bunu bana nasıl bulmuş açıklarsa sevineceğim doğrusu.
Bu arada Polinom hesaplama değeri X8+X2+X1+1 olarak verilmiş. Bu bana kalırsa %100000111 binary değerine eşdeğer olması gerek. Bunu bölen olarak kullanıp sonuçta $30 değeri bulunacak kalan olarak ama nasıl bildik metodlara göre bulamadım.
 

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ozgurelkt

MLX90614 kütüphane dosyası belki yardımcı olabilir. Adafruit in kütüphanesi mevcut.

mustafa_cmbz

Alıntı yapılan: ete - 21 Kasım 2020, 11:22:54Zor bir eleman seçmişsin. Üstelik data sheet de bir amatörün anlayacağı dilde ve açıklıkta değil.
Açıkçası bir kaç defa okudum ve şu kanaate vardım. Bu data sheet, sensör nasıl okunur okunan bilgi nerede bulunur ve onu kullanarak nasıl sıcaklık hesaplanır açık şekilde anlatmıyor. Elbette anladığım yerleri var. Ama anladıklarım bana sağlıklı okuma yapıp sıcaklık hesaplamaya yetmeyecek seviyede. Belki ingilizcesi daha iyi olanlar daha farklı sonuca ulaşabilirler.
Bu sensör ile yapılabilecek ilk iş bence okuma ve yazma yapılabiliyormu onu test etmek gerekir.
Okuma işi için 4 adet ID değeri okunabilir. Bu değerler $1C - $1D - $1E ve $1F adreslerinde yer alıyor.

Yazma için 8.3.3.1. ERPROM write sequence isimli başlığı okumak gerekiyor. Şöyle diyor.
EEPROM da bir ahfıza değeri değişmesi gerektiği zaman Melexis aşağıdaki prosedürü öneriyor
1. Cihazı açın
2. Önce ilgili hücreye (hafızaya) 0x0000 yazın ve efektif olarak hafızayı temizlemiş olun.
3. Yaklaşık 5ms bekleyin (10ms dahada emniyetli olur)
4. Yeni değeri yazın
5. Yine 5ms bekleyin(10ms daha emniyetliolur)
6. Yazdığınızı geri okuyun ve karşılaştırın ve yazmanın başarılı olup olmadığını anlayın.
7. Gücü kapatın ve değişikliğin bir sonraki açılışta etkili olacağını unutmayın.

Şimdi bu yazılanları dikkate alarak EEPROM da yazılabilir bir adres seçin çünki her adrese yazma yapılamıyor. Mesela 0x00 nolu adrese To(max) bir değer yazıp geri okuyabilirsiniz. İçeriği bozmamak açısından önce okuyup okuduğunuzu bir yere not alın en sonunda aynı değeri oraya yeniden yazamanız doğru olacaktır.
MBUS protokolü esas olarak I2C nin aynısı gibi gözüküyor. Genel format şu şekilde ,
I2CREAD DataPin,ClockPin,Control,{Address,}[Var{,Var...}]{,Label}
bu derleyiciler bazında isimlendirmede farklılık gösterebilir ancak format aynıdır değişmez.
Mesela sen okuma için  HBusIn komutunu kullanmışsın ama komutunda eksiklikler var.
Formatı okuma için yazacak olursak;
I2COKU SDA,SCL,SLAVE_ADRES,OKUMA_ADRESİ,[Değişken,Değişken....] şeklinde olmalı.
SDA ve SCL pinlerinde 10K pullup direnci mutlaka bağlı olmalı.
Diyelimki 0x00 nolu adresi okuyacaksın, Data Sheet 18 ci sayfada okumanın nasıl yapılacağı anlatılmış.
Önce Okuma emrini ve nerden okuyacağını bildireceksin. 20ci sayfada Commands lara bakarsan
%001x xxxx formatını EEPROMA a yazma yada okuma için kullanmış.
Burada xxxxx lerin yerine okunacak adres gelecektir. Bu arada Slave Address olarak fabrika default değeri $C5 demiş ama örneklerinde hep $B5 kullanmış. )Yazma $B4 , okuma $B5) buda ayrı bir karışıklık örneği. Her neyse biz $C5 kullanalım ve 0x00 nolu adresi okuyalım.
YAZI2C SDA,SCL,$C4,$00100000
OKUI2C SDA,SCL,$C5,[Veri.Byte0,Veri.Byte1,PEC]
şeklinde olmalı.
Kendi örneğine bakacak olursak, RAM in 7 nolu adresinden okuma yapmış. Slave adresi $B5 kullanmış.
YAZI2C SDA,SCL,$B4,%00000111
OKUI2C SDA,SCL,$B5,[Veri.byte0,Veri.byte1,PEC]
PEC burada CRC8 sonucunda hesaplanan değeri göstermektedir. Nasıl hesaplandığı internette bolca anlatılmış ama anlayabilirsen. Ben anlamıyorum doğrusu.
Örnekte, okunan değeri $3AD2 olaraka vermiş ve bundan hesaplanan PEC değeride $30 olarak verilmiş. Anlayan birisi bunu bana nasıl bulmuş açıklarsa sevineceğim doğrusu.
Bu arada Polinom hesaplama değeri X8+X2+X1+1 olarak verilmiş. Bu bana kalırsa %100000111 binary değerine eşdeğer olması gerek. Bunu bölen olarak kullanıp sonuçta $30 değeri bulunacak kalan olarak ama nasıl bildik metodlara göre bulamadım.
 

Ete

I2c ile çalışan hangi sensöre el atsam bu datashettleri gizemlerle dolu net bir anlatım yok biz bu ürünü ürettik ama sanki belirli bir gurh anlasın ve çalıştırabilsin gibi hazırlanmış.

Adres olayını bende anlamadım mesela dediğin gibi default değer belli ama örnekte başka kullanmış başka bir sayfada 10101xxx gibi command kodu verilmiş sakin bir kafayla dediklerinin üzerinden birkez daha geçeceğim sayın hocam.



mustafa_cmbz

Alıntı yapılan: ozgurelkt - 21 Kasım 2020, 20:30:08MLX90614 kütüphane dosyası belki yardımcı olabilir. Adafruit in kütüphanesi mevcut.

Bakındım hocam ama net bir çıkarımım olmadı malesef anladığın bir yer varsa kütüphanelerden burada anlatım yaparmısın üzerine konuşalım

mustafa_cmbz



Ben hala burasını anlayamadım.

Örnekte ADRESİ "B4" göndereceksin diyor hemen bir alt görselde binary olarak verdiği 1ve0 lar 5A ya denk geliyor.

Burada bilmediğimiz ne var yada anlayamadığımız ?

mustafa_cmbz

Alıntı yapılan: mustafa_cmbz - 22 Kasım 2020, 16:21:39

Ben hala burasını anlayamadım.

Örnekte ADRESİ "B4" göndereceksin diyor hemen bir alt görselde binary olarak verdiği 1ve0 lar 5A ya denk geliyor.

Burada bilmediğimiz ne var yada anlayamadığımız ?

write ve read bitini görmemişim çok pardon..

mustafa_cmbz

@ete  hocam çalıştırdım..



sitesindeki uygulama notlarında bu şekil bir açıklama buldum..Hatta altta sarı ile işaretlediğim yeri bir oku bak.. deli ederler adamı..

 
SENSOR_OKU:  ' B4 8. BİT = 0 ---- B5 8. BİT = 1
   HBStart 
   HBusOut $B4
   HBusOut $07 
   HBStart    
   HBusIn  $B5,[SICAKLIK.LowByte,SICAKLIK.HighByte,PEC]  
   HBStop
   'Ta[°K] = Tareg × 02.0 , or 0.02°K / LSB. 
   KELVIN = SICAKLIK * 0.02 
   ISI = KELVIN - 273.15
   Return

ilerleyen zamanlarda ihtiyacı olan olursa kodlar güzel çalışıyor sadece crc yok.

ete

Oldum olası şu I2C işindeki Device yada Slave adres işine sinir olmuşumdur.
Burada da benzer durum var.
Adres 5A olarak verilmiş normalde $5A binary olarak %01011010 olarak gösterilir.
Ancak burada Slave adres şöyle kullanılmış $5A+R/W biti. Bu durumda Write için kullanacağımız Slave adresi %10110100 ki buda $B4 sayısına eşittir. Okuma için kullanacağımız Slave adres ise %10110101 şeklini alır ve buda $B5 sayısına eşdeğerdir. Ortada yanlışlık yok,  biz yanlış anladık sanırım. Aslında adamlar da pek açık anlatamamış ya her neyse.
İşin doğrusu slave adresi $B4 ve $B5 şeklinde kullanınca her şey yerli yerine oturmuş oluyor.
PBP da kullanmak isteyenler;
I2CWRITE DTA,CLK,$B4,$07
I2CREAD  DTA,CLK,$B5,[Sıcaklık.Byte0,Sıcaklık.Byte1,PEC]

Yada direk şu komut lada okunması gerekir diye düşünüyorum.
I2CREAD DTA,CLK,$B5,$07,[Sıcaklık.Byte0,Sıcaklık.Byte1,PEC]
Unutmayın PBP start ve stop durumlarını otomatik yollamakta ACK yi de kendi halletmektedir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com