avatar_Burak

RTC kayıtçılarına ulaşım ve işleyişi

Başlatan Burak, 31 Aralık 2013, 18:01:50

Burak

Hocam merhaba , Ben biraz yaptığım işlerde titiz olduğum ve herşeyi anlamaya çalıştığım için kafama takılanları soracağım size .
RTC DS1302 entegresini kullanıyorum . Bu entegre ile güzel bir saat yaptım ve kaliteli bir kristal ile hiç zaman kayması yaşamadan saat tarih bilgisini alıyor okuyorum .. Tabii oda sıcaklığının artması kristalin dengeli olmamasından dolayı zamanla bir kayma yaşanacaktır illa ki .

Yalnız gerek sizin örnek programlarınız olsun gerek başkalarının hiçbir şekilde kimse CLOCK BURST / RAM BURST VE TRICKLE CHARGE REGISTER ile ilgili detaylı açıklamaya ulaşmak istememiş okuduğum konu başlıklarında .

Yanlışlarım varsa düzeltin lütfen ..

Ben DS1302'nin DATA TRANSFER SUMMARY bölümündeki resmi iyice anlamak istiyorum .
Şahsen ben kabaca Shiftout komutunu seri olarak clock pulse'ler yardımıyla gönderen SHIFTIN komutunuda gelen bilgi bitlerini teker teker alan komutlar olarak ifade ediyorum kabaca . CLOCK burst denen bilginin $BF  $BE olmasına göre önce entegrenin zamanlama birimlerine okuma yada yazma yapacağımızı belirtiyoruz . Buraya kadar güzel . Örneğin tuş takımından set edilen değerleri oraya yazmaya gelince iş önce yazma korumasını $8E komutu ile WP registeri'na ulaşıp ardından ""0"" değerini yazıyoruzki 7. biti 0 olsun ve bize diğer kayıtçılara yazma imkanı tanısın buraya kadar da güzel .


Fakat iş diğer set edilen bilgileri yazmaya (sn , dak , saat) gelince shiftout ile , ilk evvela  $BE hex kodunu gönderip ona register'lara "yazacağımızı" haber verip ardından sn dak saat bilgilerini sırasıyla gönderiyoruz aşağıda olduğu gibi ;

SHIFTOUT  IO, SCLK, 0, [$BE , SEC , MINUTE , HOUR , DAY , MONTH , DAYNAME , YEAR , 128]


Yanlış anlamadıysam eğer kodlamayı 128 hariç diğer hepsini BCD olarak gönderiyoruz sadece 128'i decimal olarak gönderiyoruz ... Çünkü WP'nin 7. bitini set edersek saat darbesi gelmeye devam etse bile kesinlikle yazma yapamaz ..

Şimdi soruma geleyim hocam ,

Biz register'lara $BE bilgisini/komutunu gönderdikten sonra teker teker önce hangi registera yazma yapacağımızı belirtmemiz gerekmiyor mu ? Yani sıradan saniye dak saat bilglierini göndererek gerekli registerına yazacağını nereden biliyoruz ?
Örneğin saniye bilgisine yazacaksam önce hexadecimal $80 bilgisini gönderip saniye register'ına yazacağımı bildirip ardından saniye bilgisini yazmam gerekmiyor mu ?

Aklıma tek bir cevap geliyor , saçma olabilir ama söylemek istiyorum .. Yazma CLOCK BURST write komutu/bilgisi $BE entegreye yazıldıktan sonra tüm yazma registerlarının "ADRESLERİ" sn dak saat ... 8'er bitlik birbiri ardına bağlı ardışık giden kayıtçılar olmalı ki öyle yazsın . Aynı durum READ içinde geçerli . Bu durumda ben direkt olarak DS1302 saniye kayıtçısındaki saat bilgisini saniye bilgisi üzerinden geçmeden yazamıyorum ...

YANLIŞSAM BİLDİĞİMİ SANDIKLARIM AFFOLA ... Herzaman ki gibi engin bilgilerinize kapılarım sonuna kadar açıktır ETE hocam ..

Teşekkürler ....
Ω Gens Una Sumus Ω

Burak

Yardımlarınızı halen beklemekteyim  :) .
Ω Gens Una Sumus Ω

ete

Gunayburak,
Hiç bir genel bilgi kafada kalıcı değil. DS1302 ile bir zamanlar çalışmış idim. Daha sonra DS1307 ye geçtim. Bana daha pratik geliyor özellikleride daha iyi. En azından frekans çıkışı var ki zaman zaman kullanıyorum.

Sana cevap vermek için uzun uzadıya data sheet incelemek lazım. Vakti olan varsa cevaplasın lütfen.

Banim başım yoğun çünki.

Ete


Burak

#3
 Hocam ben biraz araştırma yaptım fakat kayıtçılara ulaşımla ilgili kimse araştırma yapmamış genelde kod kopyalama yoluna gidilmiş kimse neden shiftin/out komutlarında bile mod 0 yada 1 kullanmış onu bile bilmiyor . Bende yurtdışından bir hocama danıştım o bana biraz yardımcı oldu fakat o da tatmin etmedi . Sonunda ben Datasheet'te verilen bilgilere dayanarak cevaplarımı buldum . Eğer ben gibi teorisini merak eden varsa diye de paylaşmak istedim .

Öncelikle datasheet'te verilen ibareyi paylaşayım .

Alıntı YapCLOCK/CALENDAR BURST MODE
The clock/calendar command byte specifies burst mode operation. In this mode, the first eight clock/calendar
registers can be consecutively read or written (see Table 3) starting with bit 0 of address 0.
If the write-protect bit is set high when a write clock/calendarburst mode is specified, no data transfer will occur to
any of theeight clock/calendar registers (this includes the control register). The trickle charger is not accessible in
burst mode.
At the beginning of a clock burst read, the current time istransferred to a second set of registers. The time
information is read from these secondary registers, while the clock may continue to run. This eliminates the need to
re-read the registers in case of an update of the main registers during a read.

Denilene göre bu kayıtçalara "BURST modu" ve "direkt ulaşım modu" şeklinde yollarla ulaşım şansı sağlanmış ama Burst modu ile bir seferde 8 kayıtçıyada art arda ulaşım kolaylığı verilmiş . Ondan dolayı burst modunda A4-A3-A2-A1-A0 şeklinde komut byte'ında verilmiş olan adres bitleri bir tür loop counter şeklinde çalışmaktadır . Yani 8 adet kayıtçıya ulaşım art arda "0" adresinden "7" adresine gidene dek sırayla değişmektedir . Başlangıç adresi "0" dır . Clock pulse'ler gelmeye devam ettikçe her kayıtçının 8 bitlik bilgisi her bir clock pulse'de önce LSB'si gönderilmek üzere kaydırılmaktadır . Bu durumda son kayıtçının son bitine gidene dek CE high tutulur ve son bilgi alındıktan sonra CE low konumuna alınır ve chip disable moduna alınarak bekletilir .

Shifout'larda mode 0 shiftin'lerde 1 modunu kullanma sebebimiz olarak ise aşağıdaki ifade yardımcı olmakta .

Alıntı YapA clock cycle is a sequence of a rising edge followed bya falling edge. For data inputs, data must be valid during
the rising edge of the clock and data bits are output on the falling edge of clock

Denilene göre yazma için bilgi biti clock pulse'in yükselen kenarında var ve beklemede olmalıdır . Okuma ise şöyle yapılyor . Her bir düşen kenar bitinin "ardından" bilgi geliyor . Zira biz her okumadan önce göndermek zorunda olduğumuz komut byte'ını
SHIFTOUT IO , SCLK , 0 , [$BF]
şeklinde gönderdikten sonra komut byte'ının son bitine denk gelen "1" değerli bit yükselen kenarda gönderilip düşen kenarında ise "D0" bilgisinide bize sunmaktadır . O yüzden
SHIFTIN  IO , SCLK , 1 , [SEC , MINUTE , HOUR , DATE , MONTH , DAY , YEAR , WPCTRL] 
komutunu 1 modunda kullanarak (Önce bilgiyi oku sonra pulse gönder) dememizin sebebi buradan anlaşılıyor . çünkü pulse göndermeden evvela zaten okuyabildiğimiz D0 bilgisi bir önceki komuttan ötürü elimizde mevcut . ondan sonraki bilgileri ise (D1 , D2 ... D7) shiftin komutuyla sağladığımız clock pulse'lerin herbir düşen kenarında elde edilmeye devam edecek . Burada yazdıklarımı ise aşağıdaki datasheet bölümünden okuyup çözdüm .

Alıntı YapFollowing the eight SCLK cycles that input a read command byte, a data byte isoutput on the falling edge of the
next eight SCLK cycles. Note that the first data bit to be transmitted occurs on the first falling edge after the last bit
of the command byte is written. Additional SCLK cycles retransmit the data bytes should they inadvertently occur
so long as CE remains high


Herkese iyi çalışmalar .

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal