M41T81 RTC İLE ALARMLI SAAT PROJESİ

Başlatan tolganor, 15 Aralık 2017, 13:32:37

tolganor

Burada çözümsüz olan bişey tespit ettim. Diyelimki RTC den gelen her saniye bilgisinin değişiminde resetleyen bir değişkenim olsa ve değişkenin her 1 saniyede sıfırlanmasıyla yeniden RTC Kristal frekansını okusa bu bilgi doğru olmaz ki çünki zaten her bir saniye aralığını RTC tutuyor. RTC Kristal frekansı doğru değilse zaten tuttuğum her bir saniye aralığıda doğru olmayacak. Bunu farkettim. Haklımıyım hocam.

tolganor

Burada çözümsüz olan bişey tespit ettim. Diyelimki RTC den gelen her saniye bilgisinin değişiminde resetleyen bir değişkenim olsa ve değişkenin her 1 saniyede sıfırlanmasıyla yeniden RTC Kristal frekansını okusa bu bilgi doğru olmaz ki çünki zaten her bir saniye aralığını RTC tutuyor. RTC Kristal frekansı doğru değilse zaten tuttuğum her bir saniye aralığıda doğru olmayacak. Bunu farkettim. Haklımıyım hocam.

tolganor

Hocam DS1307 Ram kısmına veri yazıp okuyabilmek için bir komut örneği verebilir misiniz

tolganor

#18
Hocam M41T81 RTC entegresinden veri okumak için kod yazdım . Sorun şu Alarm adresinde SQW çıkışını aktif edecek bir bit var . Bu bite değer girdiğimde aynı zamanda alarm ayınada değer girmek zorunda kalıyorum. Ve alarm değeri LCD ilk verdiğim değerden çok farklı çıkıyor.


A Var PORTD.2 'SDA 5.PİN 
SCL Var PORTD.3  'SCL 6.PİN

' Değişkenler

salise VAR BYTE
saniye VAR BYTE
dakika VAR BYTE
saat VAR BYTE
haftanin_gunu  VAR BYTE
ayin_gunu VAR BYTE
ay VAR BYTE
yil  VAR BYTE
kalibrasyon     VAR BYTE
watchdog     VAR BYTE
alarm_ay    VAR BYTE
alarm_gun     VAR BYTE
alarm_saat     VAR BYTE
alarm_dakika     VAR BYTE
alarm_saniye    VAR BYTE
A VAR BYTE
B VAR BYTE
C VAR BYTE
D VAR BYTE
E VAR BYTE


' SAAT AYARLAMALARI


dakika=$30
saat=$11
haftanin_gunu=$03
ayin_gunu=$23
ay=$12
yil=$17
alarm_ay=$12    'ALARM AY DEĞERİNE 12 GİRİYORUM
alarm_gun=$30
alarm_saat=$12
alarm_dakika=$40
alarm_saniye=$13



settime:
I2CWrite SDA, SCL, $D0, $00, [salise, saniye, dakika, saat,haftanin_gunu, AYin_gunu,ay, yil,kalibrasyon,watchdog,alarm_ay,alarm_gun,alarm_saat,alarm_dakika,alarm_saniye,a,b,c,d,e]

I2CWrite SDA,SCL,$D0,$0A,[%01010010]
'    M41T81 RTC program şablonuna göre Soldaki yüksek değerlikli sondan 2. bit SQW Çıkışını aktif ediyor. En Sağdaki 4 bit alarm saatinin birler hanesi en sağdan 5. bit ise saat hanesinin onlar hanesi . Fakat bunu girdiğimde alarm saati hanesi 52 değerinde çıkıyor . Bu sorunu çözmeme yardım edebilir misiniz? 

ete

Her aman söylerim işin mantığını anlamaya çalışın ezbere iş yapmayın diye.
DS1307 nin RAM bölgesine bilgi yazıp okumak için Adres kullanman gerekiyor. Data sheet demişki RAM $08 den başlayıp $3F e kadar gidiyor.
DS1307 ye bilgi yazarken kullandığımız komut şu;
I2CWrite RTC_DTA, RTC_CLK,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,MEM]
Bu komut içinde yer alan $D0 değeri bu RTC nin standart Cihaz numarası yada adresidir.  Peşinden gelen $00 parametresi ise o cihaz içinde hangi adrese bilgi yazılacağını belirliyor. Bu komutta $00 kullanmışız çünki yazmaya saniye den itibaren başlıyoruz ve onunda adresi $00 dır.
Bu adres yerine $08 yazarsan ve köşeli parentez içinde yer alan bilgi direk $08 adresine yazılacaktır.
I2CWrite RTC_DTA, RTC_CLK,$D0,$08,[Bilgi] şeklinde.
Okuma işinde ise benzer şekilde önce cihaz numarasını daha sonrada okunacak adresi veriyoruz.
I2CRead RTC_DTA, RTC_CLK,$D0,$08,[OKUNAN] şeklinde aynı adresten okuma yapabilirsin.
Köşeli parantez içinde ard arda b,rden fazla değişken kullanırsan 08-09-0A-0B... şeklinde otomatikman adreslere yerleştirilir o değerler. Okunurkende aynı şekilde 08 den başlanıp sonraki adresler okunarak değişkenlerine yerleştirilir.

Ete

ete

#20
SQWE biti Alarm Month (ay) ayarlama registerinin 6 cı biti olarak kullanılmış.
Normalde aalrm set etmeden yalnızca bu biti değiştirmen mümkün. Registerin tamamına değer yazmamalısın.
Önce $0A registeri,ni okuyacaksın sonra yalnızca 6. biti değiştirip geriye kayıt edeceksin.
Nasıl yapılır dersen;
I2CRead RTC_DTA, RTC_CLK,$D0,$0A,[OKUNAN]
OKUNAN.6=0 veya OKUNAN.6=1 komutları ile bu biti sıfır yada 1 yapabilirsin.
Ama daha iyisi OKUNAN=OKUNAN & %10111111 şeklinde bir komut kullanmak.
Böylece elinde 6 bitin sıfırlanmış hali mevcut. Şayet bu biti set edecek isen,
OKUNAN=OKUNAN+%01000000
komutunu kullanıp tekrar geri yazarsan sorun çözülmüş olacaktır.
I2CWrite RTC_DTA, RTC_CLK,$D0,$0A,[OKUNAN]

RTC ye bilgi yazarken 01, adresinden başlamanı önermiştim. Salise ile ne işin olabilirki?

I2CWrite RTC_DTA, RTC_CLK,$D0,$01,[san,dak,saat,haftanın günü , ayın günü , ay, yıl] şeklinde ana bilgileri yaz ve ardından Alarm ayarlayacak isen,
I2CWrite RTC_DTA, RTC_CLK,$D0,$0A,[alarm_ay,alarm_gun,alarm_saat,alarm_dakika,alarm_saniye] şeklinde alarm değerlerini yazdır.
Tabiiki bunları yazdırmadan evvel ayarlama yapman gerekiyor. Ne demiştik BCD formatında yazılmalı değerler.
Örenğin SN den başlayalım. (Alr_San de aynı şekilde), Gerçek saniye değerimiz SN=47 olsun ve bunu saate ayar olarak vereceğimizi düşünelim.
Saniye registeri %STOOOBBBB şeklinde olmalı. Yani ST=Stop biti bu sıfır olmalı, OOO saniye değerinin onlar hanesi (örneğimizde desimal 4 ve binary %0100 şeklinde olmalı) BBBB ise saniye değerinin birler hanesini binary karşılığı olmalı. Örneğimizde %0111 şeklinde olmalı. O halde yazılacak Saniye değeri %001000111 şeklinde olmalı.
Yazılacak değerleri BCD formatına getirmediğin için yazılanla okunan farklı oluyordur. Başka izahı yok bu işin.
Ete


Powered by EzPortal