DS1307-gercek-zamanli-saat

DS1307 Entegresi ile Saat Devresi ve MikroC Kütüphanesi

This post is also available in: English (İngilizce)

  1. DS1307  – Gerçek Zamanlı Saat
  2. DS1307   Çalışma Prensipleri
  3. DS1307 Gerçek Zamanlı Saat Devresi
  4. DS1307 Gerçek Zamanlı Saat MikroC Kütüphanesi
  5. SONUÇ
  6. Kütüphane Dosyaları
    1. DS1307 Entegresi ile Saat Devresi Açık Kaynak Kod Kütüphaneyi Satın Almak için Tıklayınız
    2. Ücretsiz kütüphane dosyaları (.mcl)
  7. Yararlanılan Belgeler

1-DS1307  – Gerçek Zamanlı Saat

  • DS1307 entegresi kullanarak saat ve takvim yapımını ele alacağız. Burada öncelikle DS1307 nin iç yapısını ve nasıl kullanılması gerektiğini detaylı olarak ele alacağız böylece sizde ister benim yazdığım mikroC kütüphanemi kullanabilir yada bu bilgiler ışığında kendi kütüphanenizi oluşturabilirsiniz.

2-DS1307   Çalışma Prensipleri

  • DS1307 entegresi I2C protokolü ile çalışan gerçek zamanlı bir saat entegresidir.
  • İçerisinde 64x8k SRAM bulunur SRAM demek kısaca elektrik olduğu sürece bilgileri saklar enerji kesildiği anda bilgilerde silinir.
  • Bu RAM in bir kısmında Saniye, Dakika, Saat, Ayın Kaçı olduğu , Ay ,Gün, Günlerden ne olduğu ve yıl bilgisini saklar
  • DS1307 maksimum 2100 yılına kadar tarih sayabilir zaten bu da oldukça yeterli
  • Enerji kesildiğinde saatin düzgün işlemesi için 1 adet 3.3v Yassı pil (Lithyum) ile desteklenir buna göre enerji kesildiği anda bilgi kaybına sebep olmadan pil devreye girer ve 1 adet pil ile yaklaşık 10 yıl kadar çalışabilir
3volt-lithyum-pil
3 volt lithyum pil ile DS1307 yaklaşık 10 yıl kadar çalışabilir
  • DS1307 nin diğer güzel özelliklerinden biride Şubatın değişken durumunu ve ayların 30 veya 31 gün olmasını yıllara göre kendisi hesaplıyor ve bu tarz işlemlerle kullanıcıyı uğraştırmıyor.
  • DS1307 çalışmak için kalp ritmi diyebileceğimiz 32.768khz kristale ihtiyaç duyar.
  • Kısacası DS1307 nin içerisinde bir sistem bulunur ve bu sürekli sayma yapar ve verileri içerisindeki SRAM gözlerinde saklar burada yapılması gereken bu gözlerin anlaşılıp okunmasından ibarettir.

2A- DS1307 Pinleri ve Görevleri

PIN Numarası PIN Adı İşlevi
1 X1 Bu pinler 32,768khz kristalin bağlanacağı pinlerdir
2 X2
3 Vbat Bu pin enerji kesildiğinde saatin çalışmasını sağlayan  3V lithyum pilin (+) ucunun bağlanacağı pindir (-) uç GND ye bağlanır
4 GND GND
5 SDA Seri data pinidir. I2C protokolünde kullanılır PIC üzerinde hangi pin SDA olarak kullanıyorsa buraya bağlanır
6 SCL Clock pinidir. I2C protokolünde kullanılır PIC üzerinde hangi pin SCL olarak kullanıyorsa buraya bağlanır
7 SQW/OUT DS1307 den bir takım sinyal çıkışları alınabilir benim kendi devremde ve kütüphanemde bu özellik devre dışıdır normal saatin çalışmasına etkisi yoktur
8 Vcc Ana besleme pinidir DS1307 ana beslemeden 5volt ile beslenmelidir.

 

2B – DS1307 den RAM Haritasını Okuma

Aşağıdaki tablo DS1307 nin RAM haritasıdır. Buna göre hangi adresten hangi verinin nasıl okunup değelendirilmesi gerektiğini anlayacağız. Adresler hexadesimal tabanda yazılmıştır.

 ADRES 7.Bit 6.Bit 5.Bit 4.Bit 3.Bit 2.Bit 1.Bit 0.Bit İŞLEV BOYUT
00h  CH    10 Saniye     Saniye  Saniye Verisi  00-59
01h  0    10 Dakika     Dakika  Dakika Verisi  00-59
 02h  0  12/24 10Sa./Pm  10Sa.     Saat  Saat Verisi  1-12/00-23
 03h  0  0  0  0  0        Gün  Gün Verisi  01-07
 04h  0  0   10 Tarih     Tarih  Tarih Verisi  01-31
 05h  0  0  0  10 Ay     Ay  Ay Verisi  01-12
 06h     10 Yıl     Yıl  Yıl Verisi  00-99
 07h  OUT  0  0  SQWE  0  0  RS1 RS0  Kontrol

Önemli Not: DS1307 içerisinde veriler BCD f0rmatında saklanır yani örneğin saniye verisini ele alalım saniye verisini saklayan adresi okuduğumuzda önümüze 00100101 gibi bir veri geldi. Bunu okurken 4 er bit olarak ayrı ayrı okumalıyız, ilk 4 bit(0010 =2son 4 bit( 0101=5 )  o halde saatin 25. saniyede olduğunu anlıyoruz. Tüm veriler BCD olarak saklandığından bu şekilde parçalanıp değerlendirilmelidir.

Önemli Not2 : DS1307 içerisinde bir adres seçildiğinde otomatik olarak pointeri arttırdığından dolayı tekrar adres seçimi yapmaya gerek yoktur. Örnek olarak 00h adresinden okumaya başlarsak bir kez 00h adresini seçeriz sonrasında her okumada otomatik olarak bir sonraki adrese geçer her seferinde adres seçmeye gerek kalmaz.

Şimdi adresleri inceleyelim.

 

  • 00h Adresi İncelemesi – Saniye

    • CH = Bu adres saniye bilgisinin yanında önemli  bir işlevi daha barındırır. Bu da 7.Bitte göreceğiniz gibi CH bölümüdür. Saat ayarlama yapılacağı zaman bu bit 1 yapılarak saat durdurulur ve ardından tekrar 7.bit sıfır yapılır ve saat çalışmaya başlar
    • 10 Saniye =10 saniye” bölümü saniyenin onluk kısmını saklar . Yani 25 saniye dediğimizde “2“-“5” olarak ayrılır “2” verisi bu bölümdeki 3 bit içerisinde (6.bit-5.bit-4.bit = 010) saklanır.
    • Saniye = Bu bölümde ise saniyenin birlik kısmı saklanır. Yani 25 saniye dediğimizde “2” – “5” olarak ayrılır ve “5” verisi bu bölimdeki 4 bit içerisinde (3.bit-2.bit-1.bit-0.bit=0101) saklanır
    • Boyut = Saniye doğal olarak 0-59 değeri alacağından buradan okunan değerin en alt ve en üst noktasını belirtir.

 

  • 01h Adresi İncelemesi – Dakika

    • 10 Dakika =10 dakika” bölümü dakinanın onluk kısmını saklar. Yani 59 dakika dediğimizde “5” – “9” olarak ayrılır “5” verisi bu bölümdeki 3 bit içerisinde (6.bit-5.bit-4.bit = 101) saklanır.
    • Dakika = Bu bölümde ise dakikanın birlik kısmı saklanır. Yani 59 dakika dediğimizde “5” – “9” olarak ayrılır “9” verisi bu bölümde 4 bit içerisinde (3.bit-2.bit-1.bit-0.bit=1001) saklanır.
    • Boyut = Dakika doğal olarak 0-59 değeri alacağından buradan okunan değerin en alt ve en üst noktasını belirtir.

 

  • 02h Adresi İncelemesi – Saat

    • 12/24 = Saat gösterim şeklinin 24 yada 12 saat şekillerinden hangisi olacağı seçilir
      • 12 saat tipi seçilecekse 6.bit = 1 olmalı
      • 24 saat tipi seçilecekse 6.bit = 0 olmalı
    • 10 Saat – PM/AM = Eğer ;
    • 6. bitte 24 saat tipi seçilmiş ise  = saat 00-24 arasında değer alacağından bu bitte 2 değerini karşılaması için 5. bit ile beraber okunur çünkü 2 nin binary karşılığı “10” dir. Saatin 10 luk kısmı burada tutulur. Saat 24:00 dediğimizde “2“-“4” olarak ayrılır. “2” değeri 5.bit ve 6. bitte tutulur.
    • 6. bitte 12 saat tipi seçilmiş ise = 12 saat esasına göre PM yada AM olarak zamanı tanımlar buna göre saat 01-12 değerleri alabilir. Örnek : öğlen 12 -> PM 12:00   Akşam 12-> AM 12:00 şeklindedir.DS1307 sayma yaparken 12 den sonra 13 e geçmez direk 01 e geçer
    • Saat = Saatin birlik kısmı burada tutulur saat 24:00 dediğimizde “2“-“4” olarak ayrılır. “4” değeri 4 bit içerisinde (3.bit-2.bit-1.bit-0.bit=0100) saklanır.
    • Boyut = 6. bit seçimine göre 01-12(PM/AM) yada 00-24 okunabilecek en alt ve en üst noktalardır.

 

  • 03h Adresi İncelemesi – Gün

    • Gün = Bu adres ile haftanın kaçıncı gününde olunduğu anlaşılır. Ayın kaçı olduğu ile karıştırılmamalıdır. Dolayısı ile buradan okunacak veri sadece haftanın kaçıncı gününde olunduğudur. Buna göre 2.bit-1.bit-0.bit üstünden okuma yapılır
    • Boyut = Bir haftada 7 gün olduğundan 1-7 arasında okuma yapılabilir.

 

  • 04h Adresi İncelemesi – Tarih

    • 10 Tarih = Bu adreste ise içinde bulunan ayın kaçı olduğu belirtilir. Buna göre 29 Ekim tarihini ele alırsak bu bölümde 10 luk kısmı olan “2” verisi saklanacaktır.(5.bit-4.bit=10)
    • Tarih = Bu kısımda ise tarihin birlik kısmı saklanır. 29 Ekim olarak düşündüğümüzde “2” – “9” olarak ayrılır. Buna göre 3.bit-2.bit-1.bit-0.bit = 1001 değeri almıştır.
    • Boyut= Bir ay en fazla 31 günden oluştuğundan dolayı 01-31 arasında değer alır.

 

  • 05h Adresi İncelemesi – Ay

    • 10 Ay = Yılın kaçıncı ayında olduğunu belirtir. Bu bölümde ayın onluk kısmı okunur. 12. ay olursa “1” – “2” olacağından “1” verisi bu kısımdan(5.bit-4.bit = 01) okunur
    • Ay = Yılın kaçıncı ayı olduğu verisinin birinci basamağıda bu bölümden okunur. Buna göre 12. ay “1” – “2” olacağından bu bölümden “2” verisi (3.bit-2.bit-1.bit-0.bit=0010) buradan okunur
    • Boyut = 1 yılda en fazla 12 ay olduğundan dolayı 01-12 arasında değer alabilir.

 

  • 06h Adresi İncelemesi – Yıl

    • 10 Yıl = Yıl değerini okumak için okunan verilerin 2000 değerine eklenmesi gerekir. Eğer bu  adresin tamamında 18 değeri okuyorsak bu 2018 demektir. Yine aynı olduğu gibi “1” – “8” olarak veri ayrılır bu kısımda onluk bölüm olan “1” verisi okunur.
    • Yıl = Bu kısımda ise 18 değerinin birlik kısmı olan “8” verisi okunur.
    • Boyut = DS1307 2100 yılına kadar sayma yapabildiğinden dolayı bu bölümde 00-99 arasında değer okunabilir.

 

  • 07h Adresi İncelemesi – Sinyal Üreteci

    • Bu bölümde DS1307 bazı frekanslarda sinyaller alabiliyoruz. Ben kendi kütüphanemde ve devremde bu özelliği iptal ettim saati çalıştırmak için bunu kullanmanız şart değildir.
    • Aşağıdaki tablodan hangi bitlerin ne durumda hangi frekansta sinyal ürettiklerini görebilirsiniz
RS1 RS0 SQW/OUT Çıkış SQWE OUT
0 0 1HZ 1 x
0 1 4.096kHz 1 x
1 0 8.192kHz 1 x
1 1 32.768kHz 1 x
x x 0 0 0
x x 1 0 1

 

2C – DS1307 Çalışma Protokolleri

  • Bu bölümde DS1307 nin prensip olarak hangi sıra ile iletişim kurduğunu veri okuma ve veri yazmanın blok şemalarını inceleyeceğiz.
  • Bunlar bize yazılan fonksiyonların hangi sıra ile çağrılması gerektiği konusunda yardımcı olacaktır.
  • I2C protokolünde I2C ile çalışacak her parçanın bir adresi bulunur.
    • DS1307 nin iletişim adresi ( RAM adresi değil!) 1101000 dır.

 

  • DS1307 Veri Yazma Sistemi

DS1307-veri-yazma-blok-semasi
DS1307 veri yazma blok şeması
  •  Yukarıdaki resimden görüleceği üzere Başlangıç ( S-start) biti ile iletişim başlanacağı tüm I2C hattına bağlı olan parçalara bildirilir böylece parçalar bekleme konumuna gelirler.
  • Ardından hangi parçanın özel adresi( 7 bit) gönderilirse o parça artık bizimle iletişim kurar diğerleri iletişimden koparlar
  • Bu durumda okuma yapacaksak 1(bir) yazma yapıcaksak 0(sıfır) biti gönderilir.
  • Onay (A – Acknowledge) biti DS1307 den MCU ya gelir yani onay alındıktan sonra DS1307 nin hangi RAM adresinde işlem yapılacaksa bu seferde o adres yollanır.
  • Yine onay gelince bu sefer yazılacak olan data gönderilir . Datalar 8 bitlik yollanır her 8 bitten sonra DS1307 den onay alınır ve bu şekilde zincirleme gider .
  • İletişim bitileceği zaman MCU tarafından durdur (P) biti yollanır böylece iletişim sonlanır.
  • Resimde de belirtildiği gibi kırmızı bitler MCU dan DS1307 ye gönderilenlerdir siyah olanlar ise DS1307 den MCU ya gelen bitlerdir.

 

  • DS1307 Veri Okuma Sistemi

DS1307-veri-okuma-blok-semasi
DS1307 veri okuma blok şeması
  • İletişim yine start biti ile başlar ardından DS1307 nin adresi gönderilir ve bağlantı sağlanır
  • 8. bit 1 yapılarak okuma yapılacağı bildirilir ve onay kodu gelince 8 bitlik paketler halinde okuma yapılır.
  • Okuma yapıldıktan sonra veri alındığında bu sefer MCU dan DS1307 ye onay kodu gönderilir böylece DS1307 otomatik olarak bir sonraki adrese gider eğer onay verilmezse aynı adresi okumaya devam eder.
  • En sonda iletişim kesileceği zaman son okunan veri paketinden sonra onay kodu yerine hata NACK MCU dan yapay olarak DS1307 ye gönderilir böylece okumanın bittiği DS1307 ye bildirilir. Eğer bu NACK işareti gönderilmeden iletişim kesilirse DS1307 adresi bir arttırıp bir sonraki adrese geçebilir ve bir daha okuma yapıldığında 1 adres satırı atlanıp hatalı okuma yapılmış olur.
  • Burada önemli bir ayrım yukarıda görülen diyagram sadece okuma işleminin veri iletişim kısmını anlatır ancak okuma işleminden önce başka bir ön protokol uygulamak gereklidir. Bunu aşağıda göreceğiz.

 

  • DS1307 Tüm Veri Okuma Rutini

DS1307-Veri-Okuma-Sistemi-Tum-Protokol
DS1307 Veri Okuma Sistemi Tüm Protokol
  • İletişim start biti ile başlar . DS1307 nin adresi gönderilir ancak dikkat edilirse 8. bit 0 yapılarak yazma işlemi yapılacağı belirtilir.
  • Bunun amacı okuma yapılacak RAM adresinin DS1307 bildirilmesidir çünkü okuma yaparsak DS1307 ye herhangi bir bilgi aktarmamız mümkün değildir bu sebeple hangi RAM adresinden okuma yapılacağı yazma modunda yapılabilir.
  • Ardından yeniden başlatma biti gönderilir bu sefer okumaya hazır olduğundan 8. bit 1 yapılır ve daha önceki konuda gördüğümüz şekilde okuma yapılır ve sonlandırılır.

 

3- DS1307 Gerçek Zamanlı Saat Devresi

  • Bu bölünde DS1307 kullanmak için gerekli olan temel devreyi göreceğiz.
  • Ben devreyi herzamanki gibi test devresi olduğu için delikli pertinaksa kurdum siz bakır plaketede kurabilirsiniz.

3A – DS1307 Devre Şeması

DS1307-devre-semasi
DS1307 devre şeması
  • saat_SCL ve saat_SDA direk olarak PIC in ilgili bacaklarına bağlanmıştır.
  • Bu bağlantı uçları mutlaka  pull-up yapılmalıdır.

3B – Gerekli Malzemeler

  1. 1AD 32,768 khz Kristal
  2. 2 AD 20 k direnç
  3. 1 AD 3v pil soketi ve Lithyum pil
  4. 1 AD 100 nf polyester kondansatör
  5. 1 AD DS1307 entegresi
  6. 1 AD 8li entegre soketi

Not : Tüm lithyum piller şarj olmaz mutlaka üzerindeki kodu araştırarak şarj olup olmadığını öğrenin aksi halde şarj olmayan pilleri şarj etmeye çalışmak patlamalarına sebep olabilir.

3C – Devrenin Yapımı

DS1307-saat-devresi
DS1307-saat-devresi
  • Devre gayet basit ve sadedir ancak bir konu devre kurulumunda çok önemlidir.
  • Saat devrelerinde en büyük sorun zaman kayması yaşanmasıdır. Bunun sebeplerinden birinin kristalin yeterli seviyede olmaması diğeride devre kurulumu yaparken gerekli tedbirlerin alınmamasıdır.
  • Mutlaka kristal saat devreleri için yapılmış olanlardan alınmalı
32-768khz-kristal
32.768khz kristal
  • Kristal DS1307 ye en yakın noktaya takılmalıdır.
  • Kristalin dış kılıfı mutlaka topraklanmalıdır.
kristal-topralama
Kristalin kılıfı mutlaka topraklanmalıdır.
  • Bu tedbirler saatin daha stabil çalışmasını sağlar. Benim saatim yaklaşık bugün itibari ile 3 ayı doldurud ve hiç durdurmadan çalışıyor ve şu an herhangi bir büyük sapma yok özellikle odanın ısısını değiştiriyorum ancak şu anlık sadece 2-3 saniye bazen hızlanıyor bazen yavaşlıyor onun dışında herhangi bir sapma yaşamadım.
  • Bir diğer konuda Çinden daha önce smd kristal almıştım belki bu kristaller daha stabil olabilirler metal kılıfları yok ve üzerinde FC yazısı var bunun FINE CRISTAL anlamına geldiğini okudum ancak bu bilgiden emin değilim ve smd kristali denemedim. Eğer aranızda deneyenler olursa bilgi verirlerse sevinirim
smd-kristal
smd kristal

 

4- DS1307 Gerçek Zamanlı Saat MikroC Kütüphanesi

  • MikroC de yazdığım DS1307 kütüphanesini kullanmak için öncelikle daha önce yayınladığım I2C kütüphanesini indirip projenize eklemeniz gerekmektedir.
  • Kütüphane içerisindeki tüm fonksiyonlar kullanıcı fonksiyonu olduğundan renk ayrımı yapılmamıştır.
  • Kütüphane içerisinde BCD den Desimale ve Desimalden BCD ye çevrim fonksiyonları da bulunmaktadır.

4A- Fonksiyonlar

  • Şimdi fonksiyonları parametreleri ile birlikte kısaca görelim en sonda kapsamlı bir örnek ile açıklama yapılacaktır.

 

4A – (A) Çevrim Fonksiyonları

 

–  BCD_DESIMAL_CEVIRICI Fonksiyonu

Fonksiyon : unsigned char BCD_DESIMAL_CEVIRICI(unsigned char BCD_KOD)

Amacı : 8 bitlik BCD formundaki binary kodunu desimale çevirir.

Parametreler:

  • BCD_KOD : Çevrilmesi istenen BCD kodu buraya yazılır

Kullanım Şekli :

BCD_DESIMAL_CEVIRICI(dakika); // dakika adındaki değişkeni desimal şekle çevirir

Geri Bildirim : Sonucu geri bildirim olarak gönderir.

 

–  DESIMAL_BCD_CEVIRICI Fonksiyonu

Fonksiyon : unsigned char DESIMAL_BCD_CEVIRICI(unsigned char DESIMAL)

Amacı : 8 bitlik desimal kodu BCD formundaki binary koduna çevirir

Parametreler :

  • DESIMAL : Çevrilmesi istenen desimal kod buraya yazılır

Kullanım Şekli :

DESIMAL_BCD_CEVIRICI(DAKIKA);// dakika adındaki değişkeni BCD formuna çevirir

Geri Bildirim : Sonucu geri bildirim olarak gönderir.

 

4A – (B) Saat Okuma Fonksiyonları

 

– DS1307_SANIYE_OKU Fonksiyonu

Fonksiyon : unsigned char DS1307_SANIYE_OKU()

Amacı : Saniye verisini okur.

Parametreler : Bulunmuyor

Kullanım Şekli :

DS1307_SANIYE_OKU();//saniye verisini okur

Geri Bildirim :

  • Saniye verisini geri döndürür.
  • Gelen veri desimal tabandadır herhangi bir çevrim yapmaya gerek yoktur.

 

– DS1307_DAKIKA_OKU Fonksiyonu

Fonksiyon : unsigned char DS1307_DAKIKA_OKU()

Amacı : Dakika verisini okur

Parametreler : Bulunmuyor

Kullanım Şekli :

DS1307_DAKIKA_OKU();//dakika verisini okur

Geri Bildirim :

  • Dakika verisini geri döndürür.
  • Gelen veri desimal tabandadır herhangi bir çevrim yapmaya gerek yoktur.

 

– DS1307_SAAT_OKU Fonksiyonu

Fonksiyon : unsigned char DS1307_SAAT_OKU()

Amacı : Saat verisini okur

Parametreler : Bulunmuyor

Kullanım Şekli:

DS1307_SAAT_OKU();//saat verisini okur

Geri Bildirim :

  • Saat verisini geri döndürür.
  • Gelen veri desimal tabandadır herhangi bir çevrim yapmaya gerek yoktur.

 

4A – (C) Tarih Okuma Fonksiyonları

 

– DS1307_GUN_OKU Fonksiyonu

Fonksiyon : unsigned char DS1307_GUN_OKU()

Amacı : Haftanın kaçıncı günü olduğunu okur

Parametreler : Bulunmuyor

Kullanım Şekli :

DS1307_GUN_OKU() ; // haftanın kaçıncı günü olduğunu okur

Geri Bildirim :

  • Sonucu geri döndürür
  • Haftanın kaçıncı günü olduğunu sayısal olarak verir. Örn : Pazartesi = 1 gibi

 

– DS1307_AYIN_KACI_OKU Fonksiyonu

Fonksiyon : unsigned char DS1307_AYIN_KACI_OKU()

Amacı : Ayın kaçı olduğunu okur

Parametreler : Bulunmuyor

Kullanım Şekli :

DS1307_AYIN_KACI_OKU() ; // ayın kaçı olduğunu okur

Geri Bildirim :

  • Sonucu geri döndürür
  • Ayın kaçı olduğunu okur.

 

– DS1307_AY_OKU Fonksiyonu

Fonksiyon : unsigned char DS1307_AY_OKU()

Amacı : Hangi ayda olunduğu bilgisini okur. Örnek Ocak = 1 gibi

Parametreler : Bulunmuyor

Kullanım Şekli :

DS1307_AY_OKU();// kaçıncı ayda olunduğu bilgisini okur

Geri Bildirim :

  • Sonucu geri döndürür
  • Kaçıncı ayda olunduğu bilgisini okur

 

– DS1307_YIL_OKU Fonksiyonu

Fonksiyon : unsigned int DS1307_YIL_OKU()

Amacı : Yıl bilgisini okur. Yıl bilgisini tam olarak verir . örn : 2017 gibi

Parametreler : Bulunmuyor

Kullanım Şekli :

DS1307_YIL_OKU();// yıl bilgisini okur

Geri Bildirim:

  • Sonucu geri döndürür
  • Yıl bilgisini verir

 

4A – (D) Saat ve Tarih Ayarlama Fonksiyonları

 

– DS1307_SAAT_TARIH_AYARLA Fonskiyonu

Fonksiyon : unsigned char DS1307_SAAT_TARIH_AYARLA(unsigned char SANIYE,unsigned char DAKIKA,unsigned char SAAT,unsigned char GUN,unsigned char AYIN_KACI,unsigned char AY,unsigned int YIL)

Amacı : Saati ve tarihi ayarlamayı sağlar.

Parametreler :

  • SANIYE: Saniyeyi ayarlamaya yarar 0-59 arasında değer alır
  • DAKIKA : Dakikayı ayarlamaya yarar 0-59 arasında değer alır
  • SAAT : Saati ayarlamaya yarar 0-24 arasında değer alır. ( Kütüphanede sadece 24 saat sistemi bulunur)
  • GUN : Haftanın kaçıncı günü olduğu ayarlanır. 1-7 arasında değer alır
  • AYIN_KACI : Ayın kaçı olduğu ayarlanır . Seçilecek aya göre 1 – 30/31/28 değeri alabilir
  • AY : Hangi ayda olunduğu ayarlanır. 1-12 arasında değer alır
  • YIL : Hangi yılda olunduğu ayarlanır. 2000-2100 arasında değer alır.

Kullanım Şekli :

DS1307_SAAT_TARIH_AYARLA(0,5,3,6,16,12,2017);// Saat: 03:05:00 ( gece 3ü 5 geçe)   Tarih: 16.12.2017  Cumartesi(6. gün)

Geri Bildirim :

  • Geri “1” değeri dönmüşse işlem başarılı demektir.

 

4A – (E) Alarm Fonksiyonları

 

– ALARM_ZAMAN Fonksiyonu

Fonksiyon : unsigned char ALARM_ZAMAN(unsigned char SANIYE,unsigned char DAKIKA,unsigned char SAAT)

Amacı : Zamana göre alarm kurar

Parametreler :

  • SANIYE : ALarmın çalmasının istendiği saniye yazılır
  • DAKIKA : Alarmın çalmasının istendiği dakika yazılır
  • SAAT : Alarmın çalmasının istendiği saat yazılır

Kullanım Şekli :

ALARM_ZAMAN(0,10,23);// (00:10:23 - akşam saat 11 i 10 geçe) alarm tüm parametreler doğru olduğunda aktifleşir

Geri Bildirim :

  • Geri “1” değeri dönüyorsa alarm çalışmış demektir.

 

– ALARM_TARIH Fonksiyonu

Fonksiyon : unsigned char ALARM_TARIH(unsigned char GUN,unsigned char AYIN_KACI,unsigned char AY,unsigned int YIL)

Amacı : Tarihe göre alarm kurar

Parametreler :

  • GUN : Haftanın kaçıncı günü olduğu belirlenir
  • AYIN_KACI: Ayın kaçı olduğu belirlenir
  • AY: Hangi ay olduğu belirlenir
  • YIL: Hangi yıl olduğunu belirlenir

Kullanım Şekli :

ALARM_TARIH(01,15,01,2018);// buna göre alarm 15 Ocak Pazartesi 2018 tarihinde aktif olur

Geri Bildirim :

  • Geri “1” değeri dönüyorsa alarm çalışmış demektir.

 

4B- Fonksiyonların Uygulanması

  • Aşağıdaki 2 adet örnek göreceğiz.
    • 1. si saati ayarlamak için kullanacağımız kod
    • 2. si saati okumak için kullanacağımız kod
  • Ben kendi kütüphanemi kullanarak GLCD de okuduğum değerleri yazdırdım sizde istediğiniz şekilde bu değerleri yazdırabilirsiniz.
  • Aşağıda saati ayarlama işlemini görelim
//I2C protokolü için pin ayarlamaları
 sbit I2C_SDA at RA5_bit;
 sbit I2C_SCL at RE0_bit;
 
 sbit I2C_SDA_VERI at LATA5_bit;//27.01.2019 güncellemesi ile eklendi
 sbit I2C_SDA_Direction at TRISA5_bit;
 sbit I2C_SCL_Direction at TRISE0_bit;

void  main()
{
    ADCON1=13;
    CMCON=7;

    DS1307_SAAT_TARIH_AYARLA(0,5,3,6,16,12,2017);//tarih ve saat ayarlandı
}
  • İlk olarak PIC e yukarıdaki kod yüklüyoruz tabiki PC saatine bakarak 2-3 dk ilerisini yüklemeliyiz ve tam istediğimiz saat geldiğinde PIC i çalıştırmalıyız böylece DS1307 ye ayarladığımız doğru tarih ve saati yükleyecektir.
  • Ancak unutulmaması gereken bir nokta bu kod 1 kez çalışmalıdır ve bir daha çalışmamalıdır aksi halde yeniden eski tarih ve saati yükler bir kere çalıştıktan sonra bu kodu devre dışı bırakmalıyız
  • Şimdi saat ve tarihi okuyalım
//I2C
 sbit I2C_SDA at RA5_bit;
 sbit I2C_SCL at RE0_bit;
 
 sbit I2C_SDA_VERI at LATA5_bit;//27.01.2019 güncellemesi ile eklendi
 sbit I2C_SDA_Direction at TRISA5_bit;
 sbit I2C_SCL_Direction at TRISE0_bit;



void  main()
{
    unsigned char txt[7];// stringe çevrim için oluşturuldu
    ADCON1=13;
    CMCON=7;

    
    SAP1024_INIT (240,128,6);//GLCD yi çalıştırdım
    
    while(1)//sürekli saati okumak için sonsuz döngü kuruldu
  
  {
    ShortToStr(DS1307_SANIYE_OKU(),txt);// saniye okunup değer stringe çevrildi
    SAP1024_YAZI_YAZMA(7,1,txt);// saniye  verisi GLCD de yazdırıldı

    SAP1024_YAZI_YAZMA(8,1,":");//araya ":"  işareti eklendi
 
    ShortToStr(DS1307_DAKIKA_OKU(),txt);//dakika okunup stringe çevrildi
    SAP1024_YAZI_YAZMA(4,1,txt);// dakika verisi GLCD de yazdırıldı

    SAP1024_YAZI_YAZMA(5,1,":");// araya ":" işareti eklendi

    ShortToStr(DS1307_SAAT_OKU(),txt);// saat okunup değer stringe çevrildi
    SAP1024_YAZI_YAZMA(1,1,txt);// saat verisi GLCD de yazdırıldı
    
    
    intToStr(DS1307_YIL_OKU(),txt);//yıl okunup değer stringe çevrildi
    SAP1024_YAZI_YAZMA(7,3,txt);// yıl verisi GLCD de yazdırıldı

    SAP1024_YAZI_YAZMA(8,3,".");araya "." işareti eklendi

    ShortToStr(DS1307_AY_OKU(),txt);//ay okunup değer stringe çevrildi
    SAP1024_YAZI_YAZMA(4,3,txt);// ay verisi GLCD de yazdırıldı

    SAP1024_YAZI_YAZMA(5,3,".");araya "." işareti eklendi

    ShortToStr(DS1307_AYIN_KACI_OKU(),txt);//ayın kaçı olduğu okunup değer stringe çevrildi
    SAP1024_YAZI_YAZMA(1,3,txt);// ayın kaçı olduğu verisi GLCD de yazdırıldı

    delay_ms(1000);// her 1 sn de bir kez saat bilgilerini okumasını sağladık
  }

}
  • Yukarıdaki kodda okuma yapıldı değerler stringe çevrildi ve GLCD de yazdırıldı. Ben GLCD olarak kendi yazdığım “SAP1024B” kütüphanesini kullanıyorum siz hangi kütüphaneyi kullanıyorsanız onun GLCD de yazdırma fonksiyonlarını kullanmalısınız.
  • Görüldüğü gibi saati ayarlama fonksiyonu bulunmamaktadır.
  • Bu andan sonra artık Pil takılı olduğu sürece DS1307 PIC ten bağımsızdır isterseniz alın bir yere kaldırın o saymaya devam eder . PIC in içine kod yüklenmiş kod silinmiş elektrik kesilmiş bunlar DS1307 yi etkilemez bir kez içine tarih yazıldımı o pili durdukça saymaya devam eder bu sebeple istenilen anda DS1307 den okuma yapabiliriz o kendi bağımsız olarak saymaya devam edecektir.
DS1307-saat-tarih-okuma-yazdirma
DS1307  okunan tarih ve zamanın GLCD de yazdırılması

ds1307-saat-calisma
Çalışmanın çok kısa görüntüsü – gif dosyası

SONUÇ

  • DS1307 nin iç yapısını ve kullanımı öğrendiniz. Bu bilgiler ile kendi kütüphanenizi yazıp projelerinizde kullanabilir ya da benim yazdığım kütüphaneyi kullanabilirsiniz.
  • Yukarıda her ne kadar GCLD ye yazdırılmış olasada LED ler ile yada DISPLAY lede okunan veriler gösterilebilir bu tamamen size kalmış.
  • Sorularınızı Foruma sorabilirsiniz.

Kütüphane Dosyaları

 


Yararlanılan Belgeler


 

This post is also available in: English (İngilizce)

About ERCAN KOÇLAR

Çalışmalarım çocukken başladı kolonyalı kağıtları yakmak, ilaçları birbirine katmak gibi değişik deneylerim vardı. Kimya kitabında elektroliz ile suyun hidrojen ve oksijene ayrıldığı ve hidrojenin yandığını yazıyordu, o zamanlarda aklım almıyordu sudan nasıl yanan....Devamını okumak için tıklayınız ;)