DS1302 Saat Modülünü kullanmak

Başlatan . Kağan, 17 Mart 2021, 10:46:28

. Kağan

Merhaba arkadaşlar,
Aşağıda satırlarını verdiğim kod parçacığı ile saat kullanılabiliyor imiş. Ben kullanmaya çalıştım bir türlü saati ayarlayamadım. Saat ekranda daima 85:85:85 ve tarih 85/85/2085 şeklinde görüntüleniyor.

RTC saat ayarlama ve okumanın daha kısa bir yolu (satır olarak) varmıdır? İlaveten bu kodlar benim programımda niçin çalışmaz?

Teşekkürler.


;----[18F452 Hardware Configuration]--------------------------------------------

asm
    __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H  ;  _HSPLL_OSC_1H       
    __CONFIG _CONFIG2L, _BOR_ON_2L  & _BORV_20_2L & _PWRT_OFF_2L
    __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
    __CONFIG _CONFIG3H, _CCP2MX_ON_3H
    __CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L   
    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H    
    
;    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
;    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H 
   
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H 
endasm



ADCON1=7      
pause 500
DEFINE OSC 20       'KRİSTAL FREKANSI  

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2021 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 17.03.2021                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************



'******************DEĞİŞKENLER TANIMLANIYOR********************

MeM         var byte
SaYi        var byte
SaNiYe      var byte
DakikA      var byte
SaaT        var byte
GunSirasi   var byte
Gun         var byte
Ay          var Byte
YiL         var byte
KonTroL     var byte
OnlaR       var byte
BiRleR      var byte
Eski_Sn     var byte


symbol RtC_ClK = portd.5     
symbol RtC_DtA = portd.6 
symbol RtC_RsT = portd.7  

'******Saat 13:20:54 2/6/2009 OLARARAK DEĞİŞKENLER ATANIYOR****

Mem=00  :Gosub Terscevir    :Saniye=SAYI
Mem=31  :Gosub Terscevir    :Dakika=SAYI
Mem=17  :Gosub Terscevir    :Saat=SAYI
MEM=7   :GOSUB terscevir    :gunsirasi=sayi
Mem=26  :GOsub Terscevir    :Gun=SAYI
Mem=4   :Gosub Terscevir    :Ay=SAYI
Mem=9   :GOSUB Terscevir    :YIL=SAYI


'***********DS1302 ye saat yazılacak****************************
high rtc_rst
output rtc_dta
SHIFTOUT rtc_dta, rtc_clk, 0,[$8E, 0]
low rtc_rst

    pause 50

High rtc_rst
output rtc_dta
shiftout rtc_dta, rtc_clk, 0, [$BE\8,saniye\8,dakika\8 ,saat\8 ,gun\8 ,ay\8 ,gunsirasi\8 ,yil\8 ,128\8]
low rtc_rst 


LCDOut $FE,1
LCDOUT $FE,$80,"Saati Ayarladim.."
pause 1000



BASLA:
'***********************Saati oku**********************
Zaman_Oku:
    High RtC_RsT
    OUTPUT rtc_dta
shiftout RtC_DtA ,RtC_ClK ,0 ,[$BF] 
    INPUT RTC_DTA
shiftin RtC_DtA ,RtC_ClK ,1 ,[saniye\8,dakika\8,saat\8,gun\8,ay\8,gunsirasi\8,yil\8,kontrol\8]    
    Low RtC_RsT

         mem=saniye     : gosub cevir : saniye=sayi  
         mem=dakika     : gosub cevir : dakika=sayi
         mem=saat       : gosub cevir : saat=sayi
         mem=gun        : gosub cevir : gun=sayi
         mem=ay         : gosub cevir : ay=sayi
         mem=yil        : gosub cevir : yil=sayi
         mem=gunsirasi  : gosub cevir : gunsirasi=sayi



LCDOut $FE,1
LCDOut $FE,$D4,dec2 saat,":",dec2 dakika,":",dec2 saniye
LCDOut $FE,$DE,dec2 gun,"/",dec2 ay,"/","20",dec2 yil 
pause 100

GOTO BASLA





'***********Hex Değer Binary dönüşüyor**************

TersCevir:
    onlar=mem dig 1
    onlar=onlar<<4
    birler=mem dig 0
    sayi=onlar + birler
return

'**********Binary Değer Hex Dönüşüyor***************
Cevir:
    onlar   =mem & %01110000
    onlar   =onlar>>4
    birler  =mem & %00001111
    sayi    =onlar * 10 + birler
RETURN

ete

Kodlarda bir sorun gözükmüyor. Ancak bu tür sorular insanın kafasını karıştırıyor. Programa bakınca hiç bir register ayarının olmadığını görüyorum. Bu şekilde o işlemci düzgün çalışamayacaktır. Acaba sorun bumudur?. Kimisi kodların bir kısmını çıkarıp ilgili kısımları koyuyor. Ama burada ilgili ilgisiz ne varsa göründüğü için register ayarları eksik geliyor bana.
DS1302 bir RTC ve kendi osilatörünü kullanarak zamanı sayıyor ve saydıklarını dahili hafızasında yer alan kendi zaman resisterlerinde saklıyor. Bizde o registerleri okuyarak zamanı kontrol etmiş oluyoruz.
Zaman bir kere doğru olarak RTC ye kayıt edildikten sonra registerlerden sadece lazım olanıda okuyabilirsin. En sade hali bu olurdu sanırım.
Örnek vereyim. Yanlızca SN registerini okumak mümkün. Sıfır nolu adreste yer alıyor.
high RTC_RST:OUTPUT rtc_dta
SHIFTOUTRTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
SHIFTIN RTC_DTA, RTC_CLK, 1, [SN] 
MEM=SN:GOSUB CEVIR:SN=SAYI
Zaman registerlerinin RTC de saklanma formatı farklı olduğu için okurken çevirip okuyoruz. Yazarkende RTC formatına getirip öyle yazıyoruz. Maalesef buraları kısaltma imkanı yok. Hemen hemen bütün registerler bu şekilde çalışıyor.
Senin devren neden çalışmıyor anlamak için devreni görmek gerek. RTC ne bir kristal bağladınmı (32768 hz) işlemcin çalışıyormu devre şeman doğrumu bunları bilemeyince bir yorum yapmamız mümkün olamıyor maalesef.
Hem yazma hemde okuma komutların /8 parametresini eklemende gereksiz. Onları sil olmadanda doğru çalışıyor sistem zaten değişkenlerin byte cinsinden olunca 8 bit yazılır 8 bit olarak da okunur.


Ete

. Kağan

#2
Register ayarını yukardaki mesaja da ekledim. Saat olarak ta alttaki resimdeki modülü kullanıyorum.
İşlemcim çalışıyor görünüyor. ekran çalışıyor.

;----[18F452 Hardware Configuration]--------------------------------------------

asm
    __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H  ;  _HSPLL_OSC_1H       
    __CONFIG _CONFIG2L, _BOR_ON_2L  & _BORV_20_2L & _PWRT_OFF_2L
    __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
    __CONFIG _CONFIG3H, _CCP2MX_ON_3H
    __CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L   
    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H    
    
;    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
;    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H 
   
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H 
endasm



ADCON1=7      
pause 500
DEFINE OSC 20       'KRİSTAL FREKANSI  




ete

Bu eklediğin sigorta ayarları. Ben ise register ayarlarını söylemiştim. TRISA - TRISB gibi.
Uzaktan da olsa yardımcı olmaya çalışıyorum. Ama sen ip uçlarını gizliyorsun bilmeyerek de olsa. Bu şekilde yardımcı olmamız zor. Kendin araştırman lazım bir yerde kusur var. Nerede olduğunu bu kadar az bilgi ile bulmamız mümkün değil. Belkide hiç bulamayacağımız bir şeydir. Modül bozuktur mesela. Şema da yokki kim nasıl bağlanmış görelim. Belkide modüle besleme bağlamadın!!!.
İşlemci çalışıyor ise ki çalışıyor diyorsun kendin araştırman gerekecek.

Ete

. Kağan

Kesinlikle yine haklı çıktınız Erol bey. Modül bozukmuş. Değiştirince çalıştı.
Teşekkür ederim.
Sizin zamanınızı aldım ama, olumlu yönden bakarsak çalışan kodları örnek olarak ihtiyaç duyanlara vermiş olduk.
 :)
Sağolun.

ete

#5
Yeri gelmişken bir iki noktaya değinmek isterim.
RTC dediğimiz Real Time Clock yani gerçek zamanlı saat entegreleri kendi osilatörlerini kullanarak saat pulslerini elde ederler. Genelde 32768 hzlik kristal osilatör kullanırlar ve bu frekansı bölerek sn pulslarını elde ederler ve bununlada zamanı sayarlar. Kristal osilatör denilen şey ise bir quartz kristalinden başka bir şey değildir. Elektriik akımı verildiğinde titreşerek clock pulsleri üretirler. Ancak bu ürettikleri frekans ne yazıkki sıcaklığa bağlı olarak çok değişkenlik gösterir. Osilatör sıcakta hızlanır soğukta ise yavaşlar. Gün içindeki yükslip alçalmaların 24 saatlik peryoda yayılımında birbirini dengeleyeceği ve sonuçta 24 saat sonun RTC nin doğru saat sayımı yapacağı varsayılmıştır. Ancak gerçekte maalesef bu böyle olmuyor ve saatiniz ya çok ileri gidiyor yada geri kalıyor. Doğru gittiği ise nadir görülüyor. İşte sırf bu amaçla TXO denilen ve belirli bir kutu içine hapsedilmiş ve o kutu ortamının ısıtılarak belirli sıcaklıkta tutulduğu kristal osilatörler üretilmiş. Bunlara sıcaklığa göre kompanse edilmiş kristal osilatör deniliyor. Bu tür osilatörleri haricen kullandığınız zaman saatinizi çok doğru gittiğini gözlemleyebiliyorsunuz.
İşte kendi içinde bu tür bir osilatör barındıran ve haricen kristal bağlanmayan bir saat entegresi (RTC) üretilmiş adına DS3231 (veya DS3232 side mevcut) deniliyor. Piyasamızda bu bir modül halinde satılıyor ve fiyatıda çok makul seviyede. Saat yapanlara yada yapacak olanlara bu RTC yi kullanmaları yönünde tavsiyede bulunuyorum. Saat yaparken bu RTC yi bile kullanmış olsanızda entegre etrafında özellikle 7805 gibi ısı üreten bir elemanın olmamasına özen gösteriniz. Saatin beslemesini ya harici yapın yada switching (LM2575) regülatörler kullanın.
Bahsini ettiğim RTC nin hassasiyeti 2ppm kadar yani milyonda iki sapma (artı veya eksi yönde) göstermesi şeklindedir. Buda 1 milyon saniyede 2 sn ileri gidebilir yada geri kalabilir yada tam doğru da gidebilir demektir. Çok çok iyi bir rakam.
DS3231 serisi I2C ile haberleşir. DS1307 ile aynı kodları kullanabilir.
Ete

Powered by EzPortal