ds1307 bilgisini display da nasıl gösteririz

Başlatan hasanb, 17 Ocak 2012, 23:12:18

hasanb

ds1307 den okunan saat bilgilerini displayda nasıl göstericez.595 ile sürülüyor.displaylar yadım edermisiniz.

ELZEMEFE

bu formda bu konuda çok fazla  örnek var
bi zahmet arama ve artık ne yaparsan form konuları bi gözden geçir....

ete

Hasanb,
Öyle bir soru soruyorsun ki soru değil zaten daha çok istek gibi gözüküyor.
Display lafı çok genel bir terimdir. Bir sürü farklı display var. LCD si var 7 segmenti var GLCD si var , dot matrix olanı var. Bir defa hangi display için istiyorun bu işi. Örneklere bakıp fikir edinme alışkanlığın yokmudur.? Zira sorduğun sorunun o kadar fazla cevabı varki yalnızca bu sitede değil internete saat diye yazsan elli tane proje karşına çıkar.  Ayrıca bu sitede matrix saat projesine bak. DS1307 kullanılmıştır. Haftalık Timer projesine bak DS1307 kullanılmıştır. Saat projelerinde de benzer devreler görebilirsin.

Ete

hasanb

hocam şöyle anlatayım 4 adet 7 segmend display'li saat yapmayı düşünüyorum ama sorunum.Devrede saati okutuyorum. Display'de gösteriyorum ancak.devrede saati ayarlamada sıkıntı yaşıyorum.devre ektedir.yanıtlarınızı bekliyorum şimdiden teşekkürler.

ete

Hasanb,
Yaptığın saat projesi son derece basit düşünülmüş bir program. Buna bir ayar menüsü oturtmak çok zor.
Sen en iyisi aynı basitlikte bir ayar sistemi oluştur. Mesela programın başına saatin 00:00:00 olacak şekilde bir ayar koy. Gece saat 12 de saati çalıştır olsun bitsin.

Saat konusunda ortalıkta yüzlerce örnek proje var. Onları inceleyip kendine bir yol çizmelisin. Ama zaten bu kadar proje varken neden yeniden bir saat yapma peşindesin? onuda anlamış değilim. Madem yapmaya çalıştığın bir şey var sorman gereken şey kritik bir şey olmalı idi. Yoksa ayar kısmı birçok projeye bakılıp çözülebilecek bir konu.
Madem displayde değer gösterebiliyorsun o halde verdiğim örneklerden saat kısımlarını al ayar kısımlarınıda al ve kullan.

Her zaman söylüyorum. Sorunlarınızı genellemeyin. Ayarlamada sıkıntı yaşıyorum demek yerine ayar kısmının şu bölümünü yapamıyorum demek benim işimi kolaylaştırabilirdi ve sana daha somut bir cevap verebilirdim. Ama bütün ayar konusunu yapamadığını belirtirsen açıkçası o konuya hiç girmek istemem. Dipsiz kuyu gibidir. Neresinden başlayayımki?

Ete

hasanb

hocam şimdi devrede ayar yapıyorum ancak,mesela saat 00.00 diyelim.saati ayarlaya giriyorum.saati filan ayarlıyorum. kaydediorum.ancak.2 defa girince ayara dispilay sapıtıyor.mesela 22.15 de ayarlamaya girince 56.27 gibi rakamlar geliyor. buda tahminim saat hex olarak ben dec çevirdiğim için oluyor.bende bunu ayara girince sıfırla diye yaptım.şimdi çalışıyor ancak bunu sıfırlama dan girmemiz lazım ayara sıkıntım orada.2. si ise herkesin yaptığı saat değil benim yapa bilmem önemli bunu belki siz profesyonel  olduğunuz için önemsemeye bilirsiniz ama biz yeni vede toy öğrencileriz.İnsan kendisi yapınca zevk alır başkasınınkini yapınca değil.3.sü ise bu saati geliştireceğim ama ayar kısmında sıkıntı yaşadığım için önce bu problemi atlatmam gerekiyor.Siz pic basic pro bilenlerin yardımına ihtiyacım var.yardımlarınızı esirgemeyin lütfen.

pragram alt satırda:



@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, BOD_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, CPD_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
CMCON=7
TRISA=%00000000
TRISB=%00000001
PORTA=0
PORTB=255

SYMBOL CLK=PORTA.0
SYMBOL DTA=PORTA.1
SYMBOL STL=PORTA.2
SAYI VAR BYTE
VERI VAR BYTE
SEC VAR PORTB.0
ASSA VAR PORTB.1
YUKARI VAR PORTB.2
LED VAR PORTB.3
dak_birler  var byte
dak_onlar   var byte
saat_birler var byte
saat_onlar  var byte

SAAT1 VAR BYTE
SAAT2 VAR BYTE
DAK1 VAR BYTE
DAK2 VAR BYTE
temp var byte

san  var byte
dak  var byte
saat var byte


datpin    var PORTB.7  '1307_5
clkpin    var PORTB.6  '1307_6
I2CWRITE datpin,clkpin,$D0,$00, [san,dak,saat]



BASLA:
        I2CREAD datpin,clkpin,$D0,$00, [san,dak,saat]

        TOGGLE LED
        IF SEC=0 THEN  GOTO AYAR
        GOSUB GOSTER
        PAUSE 500

GOTO BASLA


GOSTER:

      gosub saat_hanelere_bol
      gosub dak_hanelere_bol
     
      VERI=dak_birler
      GOSUB AL
      GOSUB AKTAR
     
      VERI=dak_onlar
      GOSUB AL
      GOSUB AKTAR
     

      VERI=saat_birler
      GOSUB AL
      GOSUB AKTAR
     

      VERI=saat_onlar
      GOSUB AL
      GOSUB AKTAR   

     STL=1:PAUSEUS 2:STL=0
    RETURN



AYAR:

     PAUSE 10
     WHILE SEC=0
     WEND
'     SAAT=0
'     dak=0
AYAR1:
      IF SEC=0 THEN GOTO AYAR2
     
     
     
      IF YUKARI=0 THEN SAAT=SAAT+1
      IF SAAT>23 THEN SAAT=0     
      IF assa=0 THEN SAAT=SAAT-1
      IF SAAT=255 THEN SAAT=23

        SAAT1=SAAT DIG 0 
        SAAT2=SAAT DIG 1
        VERI=dak_birler
        GOSUB AL
        GOSUB AKTAR
        VERI=dak_onlar
        GOSUB AL
        GOSUB AKTAR
        VERI=SAAT1
        GOSUB AL
        GOSUB AKTAR
        VERI=SAAT2
        GOSUB AL
        GOSUB AKTAR   
        STL=1:PAUSEUS 2:STL=0
        PAUSE 200       
        GOTO AYAR1 
       
       
AYAR2:
        PAUSE 10
        WHILE SEC=0
        WEND
AYAR3:
        IF SEC=0 THEN GOTO KAYIT
        IF YUKARI=0 THEN DAK=DAK+1
        IF DAK=60 THEN DAK=0
        IF ASSA=0 THEN DAK=DAK-1
        IF DAK=255 THEN DAK=59       
        DAK1=DAK DIG 0 
        DAK2=DAK DIG 1
        VERI=DAK1
        GOSUB AL
        GOSUB AKTAR
        VERI=DAK2
        GOSUB AL
        GOSUB AKTAR
        VERI=SAAT1
        GOSUB AL
        GOSUB AKTAR
        VERI=SAAT2
        GOSUB AL
        GOSUB AKTAR     
        STL=1:PAUSEUS 2:STL=0
        PAUSE 200 
        GOTO AYAR3
       
       
       
       
KAYIT:
saat1=0
saat2=0
dak2=0
dak1=0
        PAUSE 10
        WHILE SEC=0
        WEND
KAYIT1:
       
       
     SAAT=(SAAT DIG 1)<<4+SAAT DIG 0   
     DAK =(DAK DIG 1)<<4+DAK DIG 0   
     I2CWRITE datpin,clkpin,$D0,$00, [san,dak,saat]
     PAUSE 10
     GOTO BASLA

               
                  '0   1  2   3   4   5   6   7  8   9
AL: LOOKUP VERI,[$3F,$6,$5B,$4F,$66,$6D,$7D,$7,$7F,$6F],SAYI:RETURN


saat_hanelere_bol:
    saat_birler =(saat & $0F)        'birler hanesi
    saat_onlar  =(saat >> 4) & $0F   'onlar hanesi bulunur
    return   

dak_hanelere_bol:
    dak_birler=(dak & $0F)        'birler hanesi
    dak_onlar=(dak >> 4) & $0F   'onlar hanesi bulunur 

    return




   
     
     

AKTAR:
       SHIFTOUT DTA,CLK,1,[SAYI]
'       RETURN

     
      RETURN


ete

Bunun sebebi DS1307 nin zaman bilgisini kendi registerlerinde nasıl tuttuğunu bilmemen. Data sheet'i incelemen gerekiyor.
Aslında DS1302 ile çok benzer bir şekilde bilgiler tutuluyor.
SN registerinde SN=45 denildiği zaman direk bu SN registerine yazılmıyor yada oradan direk olarak 45 olarak okunmuyor.
45 sayısı 2 kısıma ayrılıyor. 5 değeri ilk 4 bite yazılıyor . Yani 5 değeri binary olarak %0101 şeklinde ilk 4 bite veriliyor.
4 değeri ise sonraki 3 bite yazılıyor. Buda %0100 şeklinde belirlenip ikisi birleştirilince %0100 0101 şeklinde bir değer registere yazılıyor. %01000101 değeri desimal olarak 69 sayısına eşdeğerdir. Ama bu sayıyı Hex olarak yazdırırsan 45 değerini ekranda görürsün.
Dakika , ay yıl ve diğer leride aynı mantıkla registerlerinde tutuluyor. Bu nedenle;
- Saat bilgisi okunduktan sonra desimal sisteme çevirme yapıyoruz. Mesela $45 veya desimal 69 olarak okunan SN değerini alıp 4 er bitlik iki kısıma ayırıyoruz. İkinci kısım yani 6-5-4 nolu bitleri  SN registerinden ayırıyoruz.
TEMP=SN & %01110000 = %01000101 = %0100
SOnra bunu 4 bit sağa kaydırıyoruz. Elde edilen değer %00000100 oluyorki bu 4 rakamına eşdeğerdir. Buna Onlar diyoruz.
Sonra ilk 4 biti ayırıyoruz. Buna Birler Diyoruz , Birler=%01000101 = %0101 = 5 rakamına eşdeğerdir.
Buradan SN=Onlar*10+birler dediğin zaman sana 45 değerini verecektir. Aslında bu yaptığım farklı bir çevirme işlemi ama anlaşılması en kolay olanı.

Şimdi ayar işinde bunun tersi yapılması gerekir . Diyelimki SN=45 olarak ayarlayacaksın. Önce Birler=SN DIG 0 şeklinde birler hanesini alıyoruz. Sonra ONLAR=SN DIG 1 şeklinde onlar hanesini alıyoruz. Yapmamız gereken onlar değerini 4 bit sola kaydırmaktan ibarettir. ONLAR=ONLAR<<4 şeklinde bunu yapmış oluruz. Buna Birler hanesini eklediğimiz zaman SN değerini yazılacak hale getirmiş olacağız. SN_YAZ=ONLAR+BIRLER şeklinde yaparız şimdi bunu adımlar halinde izleyelim.
Birler=%00000101
Onlar=%00000100  ==>  Onlar=%01000000 4 bit sola kaydırıldı.
SN_YAZ=%01000000 + %00000101 = %01000101 bulunmuş olacaktır. Buda Desimal 69 değerine HEX olarakda $45 değerine eşittir.
O halde saat ayarlarken sn - dak - saat değerlerini birler - onlar diye ikiye ayırıp onlar kısmını 4 bit sola kaydırdıktan sonra birler ile toplamak (birleştirmek) ve sonra RTC ye yazmak gerekiyor. Okurkende ekranda Hex formatnda göstermiyorsan RTC den okunan değerleri normal desimal formata yuakrıda anlattığım şekilde çevirmen gerekiyor.

Ete

hasanb

Tamam hocam incelemeye aldım.Teşekürler

hasanb

hocam verdiğiniz bilgiler için teşekkürler.sonunda kendi saatimi yaptım :D Yardımcı olan arkadaşlara çok teşekkür ederim bilhassa ete hocama calışmalarınızda başarılar dilerim hocam.

Powered by EzPortal