avatar_ete

RTC (Real Time Clock) Yani Gerçek Zaman Saati Kullanımı

Başlatan ete, 01 Mayıs 2012, 10:35:23

ete

Hepinizin bildiği gibi saat yapma merakı pek çok kimsede bulunmakta. Saat yapmanın yolu ise bir RTC kullanmaktan geçiyor.
RTC denilen şey öyle enteresan bir malzemeki özellikle saat bilgilerinin RTC hafızasında tutulma şekli nedeni ile pek çok kimsenin aklı karışıyor ve genelde kestimeden gidip kullanılmaya çalışılıyor. Bunun ne anlama geldiğini yazının ileriki bölümlerinde açıklayacağım.

RTC dediğimiz malzemeler üzerlerinde bulunan kristal osilatör ile kendi saat pulslarını üretip zamanı tutan entegrelerdir.
Genelde çalıştıkları kristaller 32769Hz dir. Bunu bölerek 1Hz lik saat pulslarını elde etmektedirler.  En çok kullanılan modeller olarak DS1302 ve DS1307 malzemelerini sayabiliriz. Bu malzemeler genelde bir işlemciye bağlanarak kullanılırlar. Bağlantı şekline bakılırsa DS1302 3 pinden seri haberleşme protokolünü , DS1307 ise I2C protokolünü kullanmaktadır.

Her ikisinin ortak yönü ise zaman bilgilerini tutma yöntemidir. BCD yani Binary Coded Desimal formatında tutulur bu bilgiler.
Bu yüzden elinizdeki zaman bilgisini doğrudan entegreye ayar bilgisi olarak yazamaz ve aynı şekilde entegreden okuduğunuzuda direk zaman bilgisi olarak kullanamazsınız. Yukarıda bir laf eetim kestirmeden kullanma terimi burada ortaya çıkıyor. Her ne kadar doğrudan kullanamazsınız desemde bir yolu var. Zira entegreden okunan bilgileri HEX formatında ekrana verirseniz doğru saat bilgilerini görürsünüz. Ama bu yanıltıcıdır. Zira aslında desimal bir bilgiyi hex olarak ekrana veriyor ama onu desimal kabul ediyorsunuz. Her neyse biraz karışık gibi gözüksede format şeklini anlayınca dediklerimi daha kolay anlayacaksınız.
Her iki entegreninde register tablosuna bir bakarsanız hemen hemen aynı formatı görürsünüz.
Örneğin Saniye hafızasına bir bakalım isterseniz.
Bit7 ......................................Bit0
CH |....10Sec..... | .......SEC........|
Bu şekil şunu ifade etmektedir. Bit CH clock Halt bitidir. Fabrikasyon olarak 1 (HIGH) oalrak ayarlanmıştır. Yada siz o biti ne zaman 1 yaparsanız saat çalışmasını durdurur. Sonraki gelen 3 bit (bit6-Bit5-Bit4) saniye değerinin onlar basamağını tutar.
Sonraki gelen 4 bit ise saniye değerinin birler basamağını tutar.
Şimdi DS1302 den okuduğumuz saniye değeri şöyle olsun SN=%0010 0110  Bu sayının direk desimal karşılığı 38 sayısıdır.
Ama saniye karşılığı şöyle hesaplanmalıdır. %0010 sayısı desimal karşılığı 2 sayısıdır. Onlar basmağı olduğuna göre bu 20 olacaktır.
Diğer parça ise %0110=6 sayısına eşittir.  O halde okunan saniye değeri aslında 26 değerini göstermektedir.
Şimdi bunu çevirmeden nasıl kestirmeden gösterebildiğimize bir bakalım isterseniz. Sayı gerçekte 38 sayısına eşit idi.
38 sayısının hex karşılığı ise 26 dır.  O halde ben okunan sayıyı ekrana yazrken $SN şeklinde yazdırırsam ekranda 26 sayısını göreceğim demektir. İşte kestirme budur. Ama unutmayın bu işi ancak LCD ekranda yapabilirsiniz. 7 segment displayde göstermek için ne yapıyoruz? Önce onlar basamağını alıp onun 7 segment karşılığını buluyoruz. Bunu yaparkende Onlar=SN DIG 1 şeklinde bir komut kullanıyoruz. Bu durumda Onlar değeri örneğimize göre 3 olur 2 olmaz. Şayet komutu şöyle kullanabilse idik olabilirdi Onlar=$SN DIG 1 . BU durumda Onlar=2 olacak idi. Ama ne yazıkki böyle bir komut şekli yok.

Dakika değeride benzer şekilde  hafızada tutulmaktadır.
Bit7 | ---10Min---|-----Min------|
Yani ilk 4 bit dakika değerinin birler basamağını veriyor, sonra takip eden 3 bit onlar basamağını veriyor ve sonda yer alan 7. bit ise daima sıfır olarak okunuyor.
Aynı şekilde okuduğumuz dakika değeri diyelimki Dak=%01010011 şeklinde olsun. Şimdi bu sayının direk desimal karşılığı, 83 sayısıdır. Ama gerçek dakika karşılığı ise  %0101=5 sayısına eşit ama onlar basmağı olduğu için 50 olacaktır.
%0011 sayısı ise 3 desimal değerine eşittir.  O halde sayının dakika karşılığı 53 sayısı olacaktır. Benzer şekilde 83 sayısının desimal karşılığı ise 53 sayısıdır.

Sonuç olarak RTC ile doğru şekilde çalışabilmek için daima entegreye yazacağımız saat ayar değerini BCD formatına çevirip yazmalı, entegreden okunan zaman bilgilerinide BCD formatından desimal formata çevirerek kullanmalıyız.
Bunu yapmazsanız epeyce sorun yaşarsınız.
Şimdi çevirme işlemlerini nasıl yapacağız biraz onlara bakalım. Örneğimizi Saniye birimi üzerinden vereceğim ama diğerleri de aynı yöntemle çevrilebilecektir.
Şimdi bir saat ayarı yaptığımız düşünelim ve ayarladığımız saniye değeri de 45 olsun. Bu saniye değerini DS1302 (veya DS1307) ye yazacağımızı farz edelim. BCD formatına bakılırsa 4 sayısı saniyenin onlar basamağını teşkil edecek, 5 değeride birler basamağını teşkil edecektir. Bunu BCD formatında yazarsak  %0100 0101 şeklinde bir sayı elde etmemiz gerekecektir.
İşte adım adım bunu nasıl yaptığımızı aşağıda görebilirsiniz.
İşlem 1.     Temp=SN DIG 1 ,     buradan    Temp=%00000100 olacaktır. Onlar basamağını ayırarak almış olduk.
İşlem 2.     Temp=Temp<<4,     buradan    Temp=%01000000 şeklini alacaktır. Onlar basamağını olması gereken yere 4 bit kaydırdık.
İşlem 3.     RTC_SN=SN DIG 0   buradan RTC_SN=%00000101  , bir ler basamağını aldık.
İşlem 4.     RTC_SN=RTC_SN+Temp   buradan RTC_SN=%01000101 şeklini alacaktır. Bu istediğimiz formattır. Dolayısıyla bu sayıyı direk entegreye yazabiliriz artık.

Şimdi Okuma işleminden sonra BCD formatından Desimal formata nasıl çevirme yapacağız onu görelim.
Aynı örneği kullanırsak daha iyi anlarsınız her halde. Gerçek saniye değerimiz 45 iken bunu RTC ye %01000101 yani desimal olarak 69 değeri ile yazmış idik. O halde bu sefer RTC den okunan 69 değerini gerçek saniye değeri olan 45'e nasıl çevireceğimizi adımlar halinde görelim.

İşlem 1.  Temp=RTC_SN &  %01110000  Temp=%01000000 oldu.
İşlem 2.  Temp=Temp>>4                        Temp=%00000100 oldu.
İŞlem 3. SN=RTC_SN & %00001111        SN=%00000101  oldu
İşlem 4. SN=(Temp*10)+SN                     SN=45 oldu

Görüldüğü gibi son derece kolay bir işlem.  O halde yapmamız gerekenleri yeniden tekrarlayalım.
RTC de saat ayarı yapıldıktan sonra bu ayarları RTC ye yazmadan önce onları BCD formatına çevirmemiz gerekiyor.
RTC den zaman okuması yaptıktan sonra okunanları kullanmadan önce onları BCD formatından Desimal formata çevirmemiz gerekiyor.

Saat registerine bakacak olursak kayıt şeklinin aşağıdaki gibi olduğunu görürüz.
Bit7    | Bit6 |  Bit5   | Bit4 |  Bit3  -  Bit0 |
12/24 |   0   |10/A-P|  Hr   |       Hr          |
Bit7 saatin 12 saat mi yoksa 24 saat formatına göremi tutulduğunu belirlemektedir. Bu bit 1 ise format 12 saat esasına göredir. Bu durumda 5 nolu bit saatin AM mi (sabah) yoksa PM mi (öğleden Sonra) olduğuna karar verir. BU bit 1 ise PM sıfır ise AM dir.
Şayet Bit7 sıfır ise saat 24 saat formatına göre tutuluyor demektir ve 5 nolu bit bu sefer saat değerinin onlar basamağını verir. Onlar basmağı yalnıza 1 veya 2 olabilir. O nedenle bit5 High ise saat 20 ve üzeri sıfır ise 20 nin altında demek olur.
Şimdi her iki formatta örnek yaparak konuyu inceleyelim.
Saat formatımız 12 saat şeklinde olsun. Saat öğleden sonra 3:45 iken okumamız gereken saat değerine bir bakalım isterseniz.
Okunacak değeri %1010 0011 şeklinde olacaktır. Ne anlama geliyor bakalım.
Bit7=1 olduğuna göre formatımız 12 saat üzerinden çalışıyor demektir.
Bit5=1 olduğundan zaman öğleden sonrasını (PM) gösteriyor demektir.
Bit3-0= %0011 = 3 gösterdiğine göre saat=3 olduğunu gösteriyor demektir.
Tabiiki okunan saniye değeride bize 45 değerini verecektir.

Şimdi aynı saati 24 saat formatında görelim.
Okunacak saat değeri  %0001 0101  şeklinde olmalıdır. Ne anlama gelior bakalım.
Bit7=0 olduğundan saat formatı 24 saat esasına göredir.
Bit5=0 olduğuna göre onlar basamağı onlar hanesi=2 değildir.
Bit4=1 olduğundan saat onlar basamağı 1 dir.
Bit3-0= arası ise bize 5 değerini verdiği için saat değeri 15 olarak bulunmuş olacaktır.
Dikkat ederseniz 24 saat formatında Bit7-Bit4 arası bitlerin yalnızca ilk 2 tanesi yani %00xx  x ile işaretlenmiş olanlar önem arzediyor. Saat 10 dan küçük ise Bu bitler %0000 şeklinde okunacak, saat 9 dan büyük ve 20 den küçük ise Bu bitler %0001 şeklinde yani bir olarak okunacak ve 19 dan büyük ise %0010 şeklinde yani 20 olarak okunacaktır.
Diğer lerini izah etmeye gerek görmüyorum artık. Onlarda da benzer şekilde kullanılmaktadır.

Son olarak bir kaç tavsiyede bulunmak isterim.
Birincisi her iki entegrede de harici pil bağlanarak saatin elektrik kesintilerden etkilenmemesi sağlanmıştır.
DS 1302 de şebeke voltajı giriş bacağı  1 nolu pindir. Pil voltajı ise 8 nolu pinden girilir. Pil olarak 3V luk Lityum pillerin kullanılmasını tavsiye ederim. RTC hangi bacakta daya yüksek voltaj var ise beslemeyi oradan almaya çalışır. Şebeke beslemesi se 5V dolayında olur ise sistem sorunsuz çalışır.
DS1307 de Şebeke voltaj girişi 8 nolu pindendir. Pil girişi ise 3 nolu pinden yapılır.

Mümkün olduğunca DS1307 kullanmaya çalışın. Önemli özellikleri var. Her şeyden önce bir SQW/OUT bacağı varki pek çok işe yarayabilir. Bazılarını açıklayayım.
1. Saatlerin genelde ileri gittiğinden yada geri kaldığından şikayet edilmektedir. Bu sorun genelde kristal bacaklarına bağlanacak 5-30 pf kondansatörle giderilebilmektedir. Ancak yaptığınız işlemin doğruluğunu ancak bu çıkış bacağını kullanarak anlayabilirsiniz. Bu bacak size osilatörden bölünerek elde edilen bazı frekans değerleri verebilir.
Mesela ,
- 1 Hz
- 4096 Hz
- 8192 Hz
- 32768 hz
Şöyle bir bakarsanız bu çıkışları ne gibi işlerde kullanabileceğiniz kolaylıkla görebilirsiniz.
Mesela çıkışı 32768 Hz olarak ayarlarsamki bu direk kristal frekansıdır, osilatörümün doğru çalışıp çalışmadığını bu sinyalin frekansını ölçerek anlayabilirim. Şayet değer 32768 den küçük ise krital bacakalrına 5-33 pf arası bir kondansatör bağlayarak doğru değeri yakalamaya çalışırım.

1Hz çıkışı ise saat projelerinde orta ledlerin yakılıp söndürülmesinde kullanabilirim. Bu çıkış ile direk ledleri sürerseniz her sn de bir ledleriniz yanıp sönecektir.
Bu çıkışın nasıl ayarlanacağı konusuna da biraz değinelim isterseniz.
DS1307 de toplam 8 adet register vardır. Bunlar sırası ile SN - Dak - Saat - Haftnın Günü - Ayın günü - Ay - Yıl - CTRL
En sonda yer alan Kontrol (CTRL) registeri nin bitlerine bakacak olursak şu bilgileri tuttuğunu görürüz.
Bit7=Out biti bu bit 1 ise  SQW/OUT pini 1 dir. Bu bit=0 ise SQW/Out pini sıfırdır. Bir yerde frekans çıkış pininin lojşk seviyesini ayarlamaktadır.
Bit6-Bit5=0  olup bir fonksiyonları yoktur.
Bit4=SQWE bitidir. Bu bit=0 ise  Osilatör çıkışı iptal , bu bit 1 ise osilatör çıkış aktiftir.
Bit3-2= 0 olup bir fonksiyonları yoktur.
Bit1-Bit2= RS1-RS0 bitleridir ve Çıkış bacağından alınacak frekansı bu bitler belirler.
%00 ise  1 Hz
%01 ise  4096 Hz
%10 ise 8192 Hz
%11 ise 32768 Hz dir.

Diyelimki çıkış bacağından 32768 hzlik bir çıkış almak istiyorsunuz. O halde CTRL=%10010011 şeklinde bir değeri kontrol registerine yazmak gerekir.
Diyelimki 1 Hz lik çıkışalacaksınız CTRL=%10010000 şeklinde bir değer vermeniz yeterlidir.

Hepsi bu kadar.
Ete





mitec


hocam başka bir konuda yine sormuş fakat cevap alamamıştım acaba ds 1307 de yıl biilgisini girmezsek 1307 otamatik olarak 0 yılından mı başlar şayet öyleyse 29 çeken şubat aylarında sanırım sorun oluşur ben yıl bilgigini displayde göstermek istemiyorum onun içinde ayar bölümüne yıl ayarı koymuyorum bu bana ne gibi bir sorun oluşturur yada ne yapmaluıyuım programın başında yıl bilgisini gireyim desem atıyorum 3 sene sonra elektrik kesildiğinde yıl yine 2012 olacak sizce ne yapmalıyım

ete

Bu soruyu sorman bile hata bence. Yıl bilgisini girmez isen RTC yıla bağlı değerleri nasıl hesaplasın? Olabilirmi böyle bir şey. Olamaz elbette. Şubat ayında hangi yıl 28 çeker hangi yıl 29 çeker bulabilmesi için doğru yıl bilgisi girilmelidir.
Yıl bilgisi 00 olarak girilirse 2000 yılını esas alır. 01 olarak girilirse 2001 o halde senin oraya 12 yazman gerekiyor.
Böylece yıl ve ona bağlı ayların hesapları doğru şekilde yapılmış olacaktır.

"programın başında yıl bilgisini gireyim desem atıyorum 3 sene sonra elektrik kesildiğinde yıl yine 2012 olacak sizce ne yapmalıyım"
3 yıl sonra elektrik kesildiğinde yıl 2015 olacaktır neden 2012 olsun. Şayet pil kullanıyorsan elektrik kesilse bile doğru ayarlanmış saat ayarını unutmaz. Pil bağlamamış isen ne zaman elektrik kesilse saat hep 2000 yılından başlayacaktır.

Sonuç olarak SN-Dak-Saat - Ay- bilgisi gösteriyor isen sana Yıl bilgisi kesinlazım. Ama yalnızca saat bilgisi gösteriyor isen yıl-ay bilgilerini girmen gerekmez.

Ete





mitec


slayizm

İyi günler

DS1302 kullanarak devre yapmaktayım ve bildiğiniz gibi bu entegre 3 kablo seri haberleşme kullanmaktadır. Benim sorum TRIS ayarları ile ilgili olacak. CLOCK ve CE pinlerini PICte çıkış olarak ayarlıyoruz ancak DATA hattını nasıl ayarlamam gerektiğini çözemedim hem okuma hem yazma yaptığı için. Yardımınız için şimdiden teşekkürler.

Mucit23

o pin yazma ve okuma sırasında giriş veya çıkış olarak ayarlanır. Çıkış veya giriş  yapman farketmez ama sen yinede çıkış yap.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mucit şunu demek istedi okuma ve yazma komutları ( basicde) o pini otomatik olrak ayarlarlar. Sen ilk tanımlamada çıkış yap gerisini komutlar halleder.

Ete

black


MS_59

hocam merhaba şimdi ds1307 ye saat ve tarih bilgilerini kayıt ettik
tarih 01/12/14 ise bu entegre bu tarihin haftanın 2. günü olduğunu biliyor mu?
yoksa bunu da ayarlamak mı lazım
mehmet

ete

Tarihi girince sanırım biliyor ama DS1307 haftanın birinci günü olarak Pazar'ı kabul ediyor. Haftanın günü sıfır ise pazar demek oluyor. 1 ise Pazartesi ... şeklinde gidiyor. ben bunu beğenmediğimiçin haftanın günü olarak pazartesini sıfır kabul ediyorum ve na göre ayar veriyorum hep.

Ete

MS_59

Alıntı yapılan: ete - 01 Aralık 2014, 16:24:15
Tarihi girince sanırım biliyor ama DS1307 haftanın birinci günü olarak Pazar'ı kabul ediyor. Haftanın günü sıfır ise pazar demek oluyor. 1 ise Pazartesi ... şeklinde gidiyor. ben bunu beğenmediğimiçin haftanın günü olarak pazartesini sıfır kabul ediyorum ve na göre ayar veriyorum hep.
tamam hocam deneyeceğim
yalnız hocam haftanın günleri 1 ile 7 arasında değilmi 1 ise pazar, 2 ise pazartesi 
mehmet

ete

sıfır dediğime bakma 1 den başlıyorsa 1 pazar dır o zaman.
Ete

kurusaray

Hocam emeğinize sağlık güzel açıklamışsınız Ds1307. Peki bu öğleden önce ve öğleden sonra bitini 24 formatı seçtiğimizde

okuduğumuz saat değeri  örneğin akşam 5 iken 17 olarakmı gelir. Yoksa biti sorgulayarak biz kendimizmi saat 5 ise ve

bit öğleden sonra ise 5'i 17 olarak yaz diye bir sorgumu yapmalıyız. Derleyici olarak CCS C kullanıyorum.


ete

24 saat üzeerinden çalışıyor ise 17 olarak gelir.

Ete

kurusaray


Powered by EzPortal