DS1302 – PIC – CCS C
PIC ile zaman kavramı kullanılması |
Merhabalar.. Bu yazımda PIC ile zaman kavramını kullanmayı detaylı bir şekilde anlatacağım.. Öncelikle zamanı kullanacağımız entegreyi yani DS1302 yi ele alalım.
DS1302 entegresi mikrodenetleyicilerle kullanılan bünyesinde tarih ve zaman bilgilerini barındıran entegredir.Entegre 2100 yılına kadar olan tarih bilgilerinin tamamını belleğinde kayıt altında tutar.
DS1302 ile ilgili önemli olduğunu düşündüğüm birkaç şeyi söylemeliyim.. ds1302 nin kristal bağlantısı bildiğimiz kristaller ile çalışmaz.. kullanmamız gereken 32.768KHz lik osilator.. İsterseniz osc devrenizi oluşturun isterseniz bu özel osilatörlerden satın alıp direkt olarak bağlayın..Burdan alabilirsiniz..
Bir diğer önemli nokta ise ds1302 entegresinin besleme parametresidir. Ds1302 yi ister 1.bacaktan(Vcc2) stabil 2-5v ile besleyebilir yada 8.bacaktan(Vcc1) saat piliyle besleyebilirsiniz. Bu size Pic in çalışmadığı zamanda bile ds1302 nin arkaplanda hatasız zamanı saymasını sağlar..Tavsiyem Pic iniz sürekli açık kalmayacaksa sadece 1. bacaktan beslemenin anlamı olmaz , Gerilim kesilime uğradığında ds1302 nin yedek beslemesi olmassa saymaya ilk baştan başlar..
Eğer yedek besleme kullanacaksanız ds1302 nin içerisinde şarj etme devresi vardır.. Ben bunu kullanmayacağım ama incelemek isteyen arkadaşlar için uygulama notu buradadır.
Donanım kısmını yeteri kadar anlattık.. Şimdi biraz yazılıma geçelim… CCS de ds1302 yi kolay kullanabilmek için ds1302.c kütüphanesi mevcuttur.Bu kütüphaneyi kullanarak birçok uğraşıdan kurtulabiliyoruz.. Neler yapabileceğimize bir bakalım.
Öncelikle ds1302.c kütüphanesinde bacaklar önceden nereye bağlanması gerektiği belirtilmiştir. Ben bacakların default pinoutlarını yukardaki resme göre düzenledim..
eğer default değerlerini değiştirmek istiyorsanız yazmış olduğunuz c kodunun define kısımlarına alttaki kodu ekleyerek değiştirebilirisinz
#define RTC_SCLK PIN_c6
#define RTC_IO PIN_c7
#define RTC_RST PIN_c5
Kodlara geçmeden önce birazcık görsellik iyidir
Bu yazıda neler yapabiliriz onu açıklığa kavuşturalım. Tamam ds1302 iyi hoş ama neler yapabiliriz? Öncelikle basit bir saat kurup lcd de gösterebilir , işi ilerletip istediğimiz tarih-saatte istediğimiz olayı yaptırabiliriz mesela 21 ağustos 2012 de saat 13:44 te pic inizin B7. bacağını low iken high yapabilirsiniz. Sizin yaratıcılığınıza kalmış , çiçek mi sularsınız bomba mı yaparsınız ?
Öncelikle şunu belirteyim bilmeyen arkadaşlar için.. Alttaki kodlar ana kodumuzda ds1302 nin kütüphanesini eklememizle gelir. Eğer kütüphaneyi eklemessek özel kodlar çalışmaz..
Saati devrenizi çalıştırmadan önce pic e yazmanız gerek , pic te entegreye verileri aktararak başlatmak istediğimiz zamandan başlatır
rtc_set_datetime(12,06,12,2,16,8);// 12/06/2012 pazartesi 16:08 ilk ayarı
Ufak Dipnot: Siz saati 16:08 e ayarladınız ama devreyi gerçekten çalıştırdığınızda gerçek zaman 16:08 değilde 16:10 yada başka bir zaman diliminde olacaksınız , ama devre 16:08 ile başlıyor , ee napıcaz?? Yapmanız gereken başlangıç zamanınızı gerçek zamana göre ya öngörüyle programlayın yada butonlar ile saat in değerini 1 artırıp bir azaltın.. ikincisi daha sağlıklı
İlk zaman ve tarih değerlerini entegreye verdikten sonra artık gerçek zamanı okuyabilmek için bu sefer ds1302 den veri almamız gerek
rtc_get_time(saat,dakika,saniye); // DS1302 den zaman bilgileri alınıyor
rtc_get_date(gun,ay,yil,haftanin_gunu); // DS1302 den tarih bilgileri alınıyor
aldığımız veriyse lcd ye şöyle aktarırız
printf(lcd_putc,”fT:%02d/%02d/20%02d “,gun,ay,yil); //LCD ye gün ay yıl yazılıyor
printf(lcd_putc,”nSaat:%02d:%02d:%02d”,saat,dakika,saniye); //saat,dakika ve saniye
delay_ms(1000); // 1 sn gecikme veriliyor
ds1302 günleri sayıya göre verir
gün değeri 1 ise pazar 7 ise cumartesidir . bizde switch case komutlarını kullanarak lcd ye günün sayısını değil direkt olarak günü yazıcağız
here we go…
switch(haftanin_gunu) // DS1302’den alınan değer case lerle metne çevriliyor
{
case 1: printf(lcd_putc,”PAZ”); break; // eger “1” ise LCD’ye PAZ yaz
case 2: printf(lcd_putc,”PZT”); break; // eger “2” ise LCD’ye PZT yaz
case 3: printf(lcd_putc,”SAL”); break; // eger “3” ise LCD’ye SAL yaz
case 4: printf(lcd_putc,”CRS”); break; // eger “4” ise LCD’ye CRS yaz
case 5: printf(lcd_putc,”PER”); break; // eger “5” ise LCD’ye PER yaz
case 6: printf(lcd_putc,”CUM”); break; // eger “6” ise LCD’ye CUM yaz
case 7: printf(lcd_putc,”CTS”); break; // eger “7” ise LCD’ye CTS yaz
}
evet temel olarak anlatacağım bunlar . Ama ilginizi çekiceğini düşündüğüm bir şey daha var.. İleriki tarihlerde istediğimizi yapabilme yetisi.. Pic ve entegre beslendiği sürece ana kodumuzda eğer şu gün şu tarihte şu ledi yak diyelim mesela..
sonsuz döngü içinde
if(dakika==15&&saniye==0)
{
printf(lcd_putc,”nalarm”);
delay_ms(500);
printf(lcd_putc,””);
delay_ms(500);
}
Her 15 dakika da bir alarm yazısını yazdıracaktır lcd ye..
Tüm Kodlar ve Simülasyon için tıklayınız