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=0PORTB=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 ProtekIK @ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT'-------------------------------------------------------------------------------OPTION_REG.7=1     'pull-up dirençleri iptalCMCON=7  DEFINE OSC 4'-------------------------------------------------------------------------------Z           VAR BitW           VAR BitU           VAR BitT           VAR BitX           VAR Word  SAYI        VAR Byte   TEMP        VAR Byte    SN          VAR ByteDAK         VAR ByteSAAT        VAR ByteGUN         VAR ByteAY          VAR ByteYIL         VAR ByteHGUN        VAR BYTEBOS         VAR BYTE MEM         var Byte   ONLAR       VAR BYTEBIRLER      VAR BYTE'-------------------------------------------------------------------------------Symbol  DTA=PORTB.0Symbol  CLK=PORTB.1Symbol  ST= PORTB.2SYMBOL  RTC_DTA=PORTA.1SYMBOL  RTC_CLK=PORTA.0GoSub ZAMAN_OKUBASLA:                     GoSub ZAMAN_OKU       GOSUB EKRAN       GoTo BASLATEKRAR:       SHIFTOUT DTA,CLK,1,[SAYI]        ReturnBAK_0:       GoSub AL       If Z=1 And W=1 Then SAYI=0         ReturnBAK_1:       GoSub AL       If Z=1 And U=1 Then SAYI=0                    ReturnBAK_2:       GoSub AL       If Z=1 And T=1 Then SAYI=0                    ReturnEKRAN:                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