avatar_POWER

ds1307 ile led display saat çalışmıyor.

Başlatan POWER, 21 Kasım 2017, 00:44:36

POWER

DS1302 ile evde kullandığım saat pek doğru gitmediği için ds1307 ye çevirmek istedim.Fakat bir türlü çalıştıramadım.simülasyonda da çalışmıyor gerçek devresindede.sorunu çözmek için proğramı en basit hale getirdim ama olmadı.işte çalışmayan proğram.
'*******************************************************************************
TRISB=%00000000   
TRISA=%00010000
PORTA=0
PORTB=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F628A             'işlemci 16F628A
@ DEVICE pic16F628A, WDT_OFF    'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON    'Power on timer açık
@ DEVICE pic16F628A, MCLR_OFF   'mclr off
@ DEVICE pic16F628A, LVP_OFF    'Low voltage off
@ DEVICE pic16F628A, PROTECT_OFF'Kod Protek AÇIK
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
'-------------------------------------------------------------------------------
OPTION_REG.7=1     'pull-up dirençleri iptal
CMCON=7 
DEFINE OSC 4
'-------------------------------------------------------------------------------
Z           VAR Bit
W           VAR Bit
U           VAR Bit
T           VAR Bit
X           VAR Word 
SAYI        VAR Byte   
TEMP        VAR Byte   
SN          VAR Byte
DAK         VAR Byte
SAAT        VAR Byte
GUN         VAR Byte
AY          VAR Byte
YIL         VAR Byte
HGUN        VAR BYTE
BOS         VAR BYTE
MEM         var Byte   

ONLAR       VAR BYTE
BIRLER      VAR BYTE

'-------------------------------------------------------------------------------
Symbol  DTA=PORTB.0
Symbol  CLK=PORTB.1
Symbol  ST= PORTB.2

SYMBOL  RTC_DTA=PORTA.1
SYMBOL  RTC_CLK=PORTA.0

GoSub ZAMAN_OKU

BASLA:
             
       GoSub ZAMAN_OKU
       GOSUB EKRAN

       GoTo BASLA

TEKRAR:
       SHIFTOUT DTA,CLK,1,[SAYI]
       Return
BAK_0:
       GoSub AL
       If Z=1 And W=1 Then SAYI=0 
       Return
BAK_1:
       GoSub AL
       If Z=1 And U=1 Then SAYI=0             
       Return
BAK_2:
       GoSub AL
       If Z=1 And T=1 Then SAYI=0             
       Return

EKRAN:       
        X= SN Dig 0
        GoSub AL
        GoSub TEKRAR
       
        X= SN Dig 1
        GoSub AL
        GoSub TEKRAR
       
        X= DAK Dig 0
        GoSub BAK_1
        GoSub TEKRAR
       
        X= DAK Dig 1
        GoSub BAK_1
        GoSub TEKRAR
        u=0
       
        X= SAAT Dig 0
        GoSub BAK_0
        GoSub TEKRAR
       
        X= SAAT Dig 1
        GoSub BAK_0
        GoSub TEKRAR
        w=0

        High ST
        PAUSEUS 2
        Low ST
       
        RETURN               

AL:    LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,80,92,73],SAYI
       Return     

ZAMAN_OKU:
    I2CRead RTC_DTA,RTC_CLK,$D0,$00,[SN,DAK,SAAT,HGUN,GUN,AY,YIL,TEMP]
    BOS=((sn>>4) & $0F)*10+(SN & $0F)
    sn=BOS
    BOS=((DAK>>4) & $0F)*10+(DAK & $0F)
    DAK=BOS
    BOS=((SAAT>>4) & $0F)*10+(Saat & $0F)
    SAAT=BOS
    BOS=((GUN>>4) & $0F)*10+(GUN & $0F)
    GUN=BOS
    BOS=((AY>>4) & $0F)*10+(AY & $0F)
    AY=BOS
    BOS=((YIL>>4) & $0F)*10+(YIL & $0F)
    YIL=BOS
    BOS=((HGUN>>4) & $0F)*10+(HGUN & $0F)
    HGUN=BOS
'    gosub EKRAN   
    RETURN

'ZAMAN_YAZ:
'        TEMP=(SN DIG 1)<<4+SN DIG 0
'        SN=TEMP
'        TEMP=(DAK DIG 1)<<4+DAK DIG 0
'        DAK=TEMP
'        TEMP=(SAAT DIG 1)<<4+SAAT DIG 0
'        SAAT=TEMP
'        TEMP=(GUN DIG 1)<<4+GUN DIG 0
'        GUN=TEMP
'        TEMP=(AY DIG 1)<<4+AY DIG 0
'        AY=TEMP
'        TEMP=(YIL DIG 1)<<4+YIL DIG 0
'        YIL=TEMP
'        TEMP=(HGUN DIG 1)<<4+HGUN DIG 0
'        HGUN=TEMP
'        MEM=$10
'        I2CWrite RTC_DTA,RTC_CLK,$D0,$00,[SN,DAK,SAAT,HGUN,GUN,AY,YIL,MEM]
'        PAUSEUS 10
'        return

     End

ete

#1
Öncelikle SAAT_YAZ etiketini ve altındakilerini açman gerek. Genelde RTC lerde SN registerinin 7.ci biti halt yani durdurma biti olur. Bu fabrikadan set edilerek yollanır. Bu bit 1 olduğu müddetçe saat ilerlemez.
Bu nedenle Basla satırından evvel yer alan GOSUB SAAT_OKU etiketinden bir öncesine;
SN=0:DAK=10:SAAT=12:HGUN=1 :GUN=21:YIL=17  (bunları o andaki saat değerlerine uygun yazarsan doğru saat ayarlamış olursun)
Altına GOSUB SAAT_YAZ yazıp saate önce ayar vermen gerekiyor.
Ardından BASLA etiketinden sonra yer alan GOSUB EKRAN satırının altına PAUSE 300 ekleyiver. Bunu çok sık saat oluması yapıp RTC yi okuyarak bloke etmemek için koyuyoruz. Sonuçta RTC de bir yandan kendi osilatörü ile zamanı tutup iç registerlerini artıracak ve istediğin zamanda sana saat bilgilerini verecektir. Mikro saniye bazında sürekli saat okumaya kalkarsak RTC işini yapamaz hale gelecektir.
Koyacağımız 300 ms lik gecikme ona nefes aldırır ve saat de başlar çalışmaya. Aradaki farkı göresin diye şu denemeyi yap istersen.
Önce Pause 100 yazıp bak programın saati ilerletme hızına, ardından Pause 300 ve daha sonra Pause 500 ver ve en sonunda Pause 1000 ver bakalım. En hızlı çalışmayı Pause 1000 verdiğinde göreceksin.


Ete

POWER

Hocam, iyi çalışmalar
söylediğiniz şekilde düzenlemeleri yapınca proğram çalıştı.basla etiketinden sonra eklediğim pause 300 komutu sadece simülasyonda gerekli gibi doğrumudur? yani pause 300 vermeden de proğram kendi kartında çalışıyor, simülasyonda çalışmıyor.

ete

Belirli bir işi yapmasını istediğin bir adamı sürekli soru sorarak meşgul edersen o adam işini yapabilirmi sence? bu da ona benziyor. Saat sayıp zamanı takip etmeye çalışıyor ama sen her ms de bir saat kaç diye soruyorsun buda onun işini yapmasını engelliyor.
Sen her ne kadar saat gerçekte çalışıyor desende o 300 ms lik gecikme RTC ye hayat verir. Sakın kaldırma. Hatta sorun yok ise biraz daha artır o gecikmeyi saatin daha sıhhatli çalışır.

Ete

POWER

#4
anladım hocam. tavsiyeniz üzere gecikmeyi ekledim gerçek devresinede.

Powered by EzPortal