avatar_Burak

* DS3231 RTC KULLANIMI *

Başlatan Burak, 13 Eylül 2015, 15:05:02

ete

DS3231'i yeni bir projede kullanmadım henüz. Elimiz alışmış hemen DS1307 ye atlıyoruz. Bunun bir sebebide PCB ye direk monte edilebilme kolaylığıdır. Diğerini modül olarak alıyoruz karta entegre ediyoruz. Bu nedenlerden dolayı sıcaklık ölçümünü deneme amaçlı kullandım ama DS18B20 ile karşılaştırma fırsatım olmadı.
DS3231 in sıcaklık ölçümünde bir sorun gözlemlemedim.

Ete

TunaToprak

Alıntı yapılan: Burak - 13 Eylül 2015, 15:05:02Herkese Merhaba ;

Farklı üreticiler tarafından üretilen bir takım RTC'leri incelediğimde birçoğunda zaman gecikmesi oluşması ile ilgili birtakım problemler ve şikayetler oluştuğunu zaman zaman duyuyorum , genellikle kod paylaşımı bu skalada üretilmiş entegrelerden DALLAS'ın üretmiş olduğu RTC'ler üzerine yoğunlaşmış durumda .. Dallas 1302 isimli entegreyi piyasaya ilk sürdüğünde herhangi bir 32.768 KHz'lik bir kristal ile hassas bir zaman saati yapılabileceğini duyurmuş olsada çok ama çok aşırı kritik uygulamalarda uzun vadede ciddi gecikmeler meydana geldiğini birçoğumuz deneyim edinmiş bulunuyoruz , ardından 1307'yi sürerek sadece iletişim protokolü ve kayıtçı vektörlerinde kısmi düzeltmeler yaptığını görmüş olduk .. Üretilen entegrelerin arefesinde sıcaklık kompanzeli dallas tarafından üretilen sıcaklıktan çok zor etkilenen bir kristal ürettiğini duyurdu ama fiyat olarak entegrenin kendisinin kat be kat üstünde olduğundan satışını sadece endüstriyel üreticilere yapabildi .. Bütün bunların ardından EPSON ve diğer firmalarla rekabetini artırmak için dahili TCXO özellikte kristala sahip olan bu entegreyi piyasaya çıkardı ; DS3231'i diğer muadillerinden üstün kılan özellikleri şu şekilde sıralayalım ;

* Hem 3.3 Voltta hemde 5V'ta çok efektif bir çalışmaya sahip ..
* Dahili TCXO özellikte bir kristale sahip , TCXO ingilizce çevrimi itibari ile Sıcaklık kompanzeli kristal osilatör anlamına gelir
* Yılda en ama en fazla 2 dakikalık bir sapma oluşması (ki benim 1307'lerim zaman zaman sıcalık ve nemle bağdaşık olarak ayda 2 dakikalık bir sapmaya sahip ..)
* Üzerinde bir adet sıcaklık sensörüde bulunmakta .. Bu avantaj diğer RTC'lerden onu tek başına zaten izole ediyor ..

Altını çizerek belirtmem gerek ki hiçbir zaman uydu saati veyahut GPS kullanarak yapılan saat uygulamaları kadar hassas olmasada bu yeni entegre DS3231 , bize bir çok uygulamamızda avantaj sağlayacaktır ...

Dezavantajı ise , bir eprom belleğe sahip olmaması ama , bu entegreyi modül halinde satın alan arkadaşlar için ATMEL'in bir eprom'u ile kompakt bir yapı şeklinde bu modülü elde edebilmeleride sağlanmış ...

Bu modül ile oynamak için bir kaç adet satın aldım yurtdışından ve çözmek için datasheet'ini oturup baştan sona okudum ... Sadece RTC modülü ile iletişim sağlayabilen örnek bir kod paylaşıyorum .. İsteyenler bu kodu kendi RTC uygulamalarına entegre edip ihtiyar DS1307'lerden kurtarabilirler .. Entegrenin kayıtçı çözümlemesi ve kullanımı ile ilgili daha fazla detay isteyenler sorularını bu başlık altında sorabilirler ..

Herkese iyi çalışmalar ..

Burak

Merhaba bu pbp uzantılı dosyayı nasıl açacağım? Hangi derleyici için yazıldı. Yardımcı olursanız sevinirim

ete

PBP uzantısı , Pic Basic Pro derleyicisinin yazım formatına aittir. Herhangi bir Text editör ile açılır ama en iyisi Micro Code Studio ara yüzü ile açmaktır. MCS hem açar hemde derlemeye aracılık eder elbette derleyici makinada kurulu ise.

Şayet farklı bir derleyici kullanıyor isen işin mantığından yürüyerek kendi kodunu oluşturman gerekebilir.

DS3231 RTC entegresi I2C sistemi üzerinden işlemci ile haberleşir. Bunun için Bir Data hattı (SDA) bir CLK hattı (CLS) kullanır. Her iki hat birer 10K direnç ile veya daha iyisi 4K7 direnç ile pullup yapılmalıdır. Pullup olmadan çalışmaz sistem.

RTC nin cihaz numarası $D0 (yazma işleminde) ve $D1 (Okuma işleminde) dir. Basic derleyicilerinde her ikisinide biz $D0 kullanırız. Derleyici okuma yaparken kendisi 1 ekler.

RTC nin Register adresleri $00 dan başlar. Bu adreste Saniye registeri yer alır. Register bu adrese BCD formatı ile kayıtlıdır. Bu şu demektir. İlk 4 bit (%0000) SN değerinin birler hanesini gösterir. Örnek 5 değeri için %0101 şeklinde bir değer içerir. SOndaki 4 bit ise sayının onlar hanesini gösterir. Bunada örnek verecek olursak SN=45 iken registerdeki yerleşim şekli %0100 0101 şeklindedir. Hemen anlaşılacağı üzere %0100 bilgisi Saniyenin onlar hanesindeki 4 rakamına karşılık gelir. Bu nedenle RTC den saniye registeri okunduğu zaman okunan sayının desimal formata çevrilmesi gerekir. Bunun için SOndaki 4 bit okur , bunu 4 bit sağa kaydırır ve 10 ile çarparız. Şöyle %01000101 sayısını %0100 ve %0101 şeklinde iki kısma ayırıyoruz. %01000000 şeklinde okunan onlar hanesini 4 bit sağa kaydırınca %00000100 (desimal 4) sayısını elde ediyoruz. Bunu 10 ile çarpınca 40 oluyor. Bu sayıya birler hanesini (%01001) 5 olarak okuyup ekliyoruz dolayısıyla 45 sayısını elde etmiş oluyoruz.

Diğer registerler olan Dakika, Saat, Ayın günü (1-31), Ay (1-12) ve Yıl (0-99) da benzer formatta RTC içinde değer almaktadır.
Saat regsiter 6, nolu biti saatin çalışma formatını belirliyor . Bu bit=0 olursa saat 24 saat formatına göre çalışıyor. Bu bit=1 olursa saat 12 saat formatına göre çalışıyor.
BCD kodun nasıl çalıştığını anlattıktan sonra RTC ye zaman bilgisi yazılmasında desimal sistemdeki değerlerin BC formatına çevrilerek yazılması, RTC den değer okunurkende okunan BCD değerinin desimal formata yukarıdaki anlattığım şekilde çevrilmesi gerekiyor.
Yazma işleminde Desimal sayının onlar hanesi alınır 4 bit sola kaydırılır buna birler hanesi eklenir. Bunu program formatında yukarıda açıkladığım işlemin tersi şeklinde uygulayabilirsin. Yapamaz isen sorarsın yardımcı oluruz.

Bu RTC aynı zamanda sıcaklık sensörünede sahiptir ve içeride $11 adresinde (sıcaklık bilgisi MSB) , $12 adresinde ise LSB yer alır. MSB=HIGH_byte, LSB=LOW_Byte şeklinde de adlandırılabilir.
I2CRead RTC_SDA,RTC_SCL,$D0,$11,[HAM.BYTE1,HAM.BYTE0] şeklinde $11 nolu adresi göstererek 2 byte bilgiyi okuyup ardından,
ISI=HAM.BYTE1:EKSI=ISI.7
TEMP=((HAM.BYTE0)>>6)*25
şeklinde sıcaklığı hesap etmiş oluruz.
Açıklamak gerekir ise HIGH_Byte dediğimiz MSB kısmı aslında sıcaklığın kaç olduğunu kabaca tutmuş oluyor. Okunan LOW_Byte değerinin 7. ci biti sıcaklığı eksi mi yoksa artı konumdamı olduğunu bildiriyor bize. Sıcaklık çözünürlüğü 0,25 derece dir. Bu nedenle okunan sıcaklık değerini 6 bit sağa kaydırıyoruz ve 25 ile çarparak sıcaklığın 100 ile çarpılmış halini hesaplamış oluyoruz. Bundan sonrası kolay 100 e bölerek tam sayı kısmını ve MOD100 yaparak da ondalık kısmını ekrana verebilirsin.
Sayı (Sıcaklık) eksi ise İkinin tamamlayıcısı yönetimini kullanmak gerekiyor (The temperature is encoded in two's complement format.)
Bunun için  ISI=(ISI ^ $FF)+1 şeklinde bir formül kullanmak yeterli oluyor. Bu sıcaklığı 255 değeri ile XOR yapıp üzerine bir ekliyor. Böylece eksi sıcaklığı bulmuş oluyorsunuz.

Eksik bir şey kaldı ise sorarsınız.
Bir şey daha ekleyeyim. Sıcaklık okuma kısmı hariç saat için önceden DS1307 RTC için yazılmış kodunuz var ise bu kodlarla DS3231 de (DS3232 de) çalışmaktadır.


Ete

Powered by EzPortal