ds1302 den alınan verilerin desimale cevrimi ve alarm

Başlatan logem2005, 06 Şubat 2006, 13:58:21

logem2005

ds1302 den asagıdaki kodlar ile veri okuyup lcd ekrana yazdırabiliyorum. amacım ds1302 den okudum saat ve tarih bilgilerini desimale cevirmek ve elde ettigim desimal saat ve tarih bilgilerini kullanıcı tarından girilen (alarmın verilmesi istenen saat ve tarih) bilgilerle kıyaslıyıp aynı oldugunda alarm verilmesi. ds1302 den elde ettigim veriyi desimale cevirmek yada bu alarm duzenleme ile ilgili fikirlerinizi paylasırsanız sevinirim.




' Subroutine to read time from RTC
gettime:
RST = 1 ' Ready for transfer
Shiftout IO, SCLK, LSBFIRST, [$bf] ' Read all 8 RTC registers in burst mode
Shiftin IO, SCLK, LSBPRE, [rtcsec, rtcmin, rtchr, rtcdate, rtcmonth, rtcday, rtcyear, rtccontrol]
RST = 0 ' Reset RTC
Return


' Main program loop - in this case, it only updates the LCD with the time
mainloop:
Gosub gettime ' Read the time from the RTC
' Display time on LCD
Lcdout $fe, 1, "Tarih: ", hex2 rtcdate, "/", hex2 rtcmonth, "/" , hex2 rtcyear
LCDOUT $FE,$C0,"Saat : ", hex2 rtchr, ":", hex2 rtcmin, ":", hex2 rtcsec
Pause 300 ' Do it about 3 times a second
Goto mainloop ' Do it forever



kodları ile bil

ete

DS1302 nin data sheetini incelersen sorunun cevabını göreceksin aslında. Yinede ben açıklayayım.
Saniye-dakika-saat ve diğer bilgiler DS1302 nin bir hafızasında 8 bitlik yazmaçlarda BCD yani binary kodlu Desimal formatda saklanmaktadır. Bunlar,
a) Saniye : xxxx xxxx sağdan sola doğru ilk 4 bit (3-0.bitler) saniyenin birler basamağını, diğer 4 bit ise saniyenin 10 lar basamağını tutmaktadır.
   örnek verecek olursak % 01011001 değeri 0101 - 1001  şeklinde ikiye ayrılır. önce birler basamağına bakalım 1+8=9 desimal değerini, onlar basamağında ise binary 0101 değeri ise 1+4=5 desimal değerini verecektir. Saniye değeri buna göre 5x10+9 =59 olarak hesaplanır. Binary değeri %01011001 olan bir sayıyı HEX olarak yazdırınca otomatikman 59 olarak yazacaktır. Şimdi diyelimki DS1302 den HEX 28 değerine karşılık %00101000 değeri binary olarak okunmaktadır.  Bu değeri desimale çevirmek için;
SN=%000101000
ONLAR=SN>>4
BIRLER=SN & %1111
SN=ONLAR x 10 + BIRLER
şeklinde yapılır.

b) Dakika xxxx xxxx , saniye ile aynı formatta olduğundan aynı şekilde desimale çevrilir.

c) Saat,  x (12/24)   0    x(am/pm)   xxxxx, soldan ilk bit (7.bit) 12/24 saat ayarı için ve şayet high ise saat 12 saat sistemi üzerinden çalışır. Low ise 24 saat gösterim sistemi üzerinden çalışır., 6. bit kullanılmıyor, 5. bit ise 12 saat sisteminde high ise pm , low ise am belirtecidir. 24 saat sisteminde ise bu bit saat onlar hanesinin 2 bitidir. , kalan 4 bit ise saat değerini veriyor. Örnek vermek gerekirse;
Saat=%00010111 , 7. bit low olduğundan saat 24 saat sisteminde çalışıyor Onlar hanesi =%01 =1  ve Birler hanesi=%0111 = 7 ,yani saat=17 olacaktır.
Şayet Saat=%10000111 olsa idi,  7 bit high olduğundan saat 12 saate göre çalışıyor, 5. bit low olduğundan AM gösteriyor, Onlar=%0=0 ve Birler=%0111=7 olduğundan saat sabağın 7 si olarak anlaşılacak idi.
Saat değerini desimale çevirmek için;
1. Saat 12/24 hangisi? Gorunum=saat & %10000000
2. Onlar=Saat & %00110000
3) Birler=Saat & %1111
Saat=onlar x 10 + birler

d) Tarih yani ayın günü, 00 xx  xxxx, 6 ve 7. bitler kullanılmıyor, 4 ve 5. bitler tarih onlar hanesini, kalan 4 bit ise tarih birler hanesini veriyor.
   Tarih= %00100101 değeri bize hex olarak 35 değerini verecektir. Desimal olarak ise;
  1) Onlar =%10 =2
  2) Birler = %0101 = 5
 o halde tarih= 2 x 10 + 5 = 25 değerini verecektir.
 Desimale çevirmek için;
 Onlar=Tarih & %00110000
 Birler= Tarih & % 1111
 Tarih= Onlar x 10+Birler

e) Ay, 000  x (onlar)  xxxx (Birler), görüldüğü gibi 5-6-7 ci bitler kullanılmıyor. 4. bit ay değeri onlar hanesini, kalan 4 bit ise birler hanesini belirliyor.
   Artık anladığını ümid ederek diğerlerinin çevrimlerini vermiyorum. Diğerlerine bakarak kolayca yaparsın sanırım.

f) Gün, yani haftanın günü, 7-4 bitler kullanılmıyor, kalan 3 bit haftanın gününü belirliyor.

g) Yıl, ilk 4 bit (7-4. bitler) yıl-onlar hanesini, kalan 4 bir (3-0) ise yıl birler hanesini belirlemektedir. Örnek %00100110, Onlar=%0010 = 2, Birler=%0110=6, ohalde yıl değeri 2 x 10+6 = 26 olarak bulunur. Tabiiki yıla ait yüzyıl değeri ayrı bir değişkende tutulmalı. Tamyıl=2000 gibi. Buradan Esasyıl=Tamyıl+Yıl=2026 olarak kullanılmalıdır.

Açıklayacaklarım bu kadar. Umarım birşeyler anlatabilmişimdir.
Aslında değerleri desimale çevirmeden Hex olarak kullanmaya çalışsan daha uygun olur. Ancak ayar işine girince ister istemez desimale çevirmek gerekecek. Bu durumda yeni değerleri tekrar DS 1302 ye yazarken yukarıdaki açıklanan kuralları tersine işletip yeni değerleri binary kodlu desimal şekle sokaman gerekecektir. Bunuda açıklamak gerekir ise;
Diyelimki Dakika değerini DS1302 den %00111000 olarak okudun bunu hex olarak ekrana verince 38 olarak göreceksin; Yani Onlar=3 ve birler=8 olacaktır. Ayar bölümünde dakikayı 43 yaptığını düşünelim. Yani;
Y_DAK=43  oldu, buradan ,
onlar=Y_DAK/10  
Onlar=Onlar<<4  (4 bit sola kaydırdık )
Birler=Y_DAK - onlarx10
Y_DAK=Onlar+Birler
böylece Y_DAK DS1302 ye yazılacak formata gelmiş olur. Bunu yazıp tekrar okuduğunda Hex Dak=43 olarak görülecektir.

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

gofe

Soru bana ait değil ancak Sayın ETE elin dert görmesin.Çok çok faydalı ve iyi bir açıklama.Benimde çok işime yaradı teşekkürler.

tyanali51

sevgili ete çok teşekkür ederim benimde işime yaradı

gofe

Slm
1302 nin şarj özelliği hakkındada bilginiz var ise memnun olurum .

idis

bunu pbp da en kolay / ve // operatörleriyle yapabilirsin nitekim / böleni // bölümden kalanı verir

tyanali51


ErX

Herkese merhaba ...

Kendim yapmak istediğim bir proje hakkında araştırma yaparken bu topic'e rastladım ve sizlerin yardımcı olabileceğinizi düşündüm..

Benim yapmak istediğim ayarladığım gün ve  zamanda istediğim cihazları (3-5 cihaz)  istediğim süre içinde çalıştırıp durdurmak. Bu projenin donanım kısmı sorun oluşturmuyor. Cihazları röleler ile kontrol edecem . Ama programlama kısmı biraz karışık ve komplike olacak. İşin içine tarih saat girince en uygun olarak DS1302 entegresi olacağını düşündüm. DS1302 alınan tarih saat bilgisiyle pic'in eepromuna kaydettiğimiz tarih saat bilgisi karşılaştırılıp röle çekilecek, yine eeproma kaydedilen süre boyunca röleler çekili kalacak ve sonra bırakacak. Temel mantık bu olabileceğini düşündüm. Ama programlama konusunda biraz zayıf olduğum için sizlerin yardımını rica ediyorum. Yani bunu yukarıda yazıldığı dibi desimale çevrilerek mi yapmam gerekli ? PBP ile yazarken hangi include dosyalarını kullanmam gerekli gibi bana biraz detaylı bilgiler verebilirmisiniz???