DS 1307

Başlatan blueboard, 07 Kasım 2019, 19:53:19

blueboard

Ete hocam, bir sorum olacak. DS 1307 RTC'ye 32,768 MHz kristal bağlanıyor.Peki Piclerde olduğu gibi kristalin bacaklarını 22 pf kondansatörler ile şaseye vermemiz gerekiyor mu? Yoksa sadece kristal mi bağlanıyor?

ete

RTC lerde kondansatör gerekmiyor. Data sheetlere bakılırsa yalnızca kristalin bağlanmasıyeterli oluyor.

Ete

blueboard

#2
Teşekkür ederim. Ete hocam, size zahmet olmazsa ''16f628a ile  RTC çalıştırma''  adlı mesajımdaki kodlarımı gözden geçirebilir misiniz. Sonunda simulasyonda çalıştırdım ama gerçek devrede sorun yaratabilecek bir şey var mı? https://etepic.com/index.php/topic,4329.msg40524/topicseen.html#new

ete

Aslında o mesaja cevap yazmıştım ama bir şekilde yok olmuş anlamadım.
Kod içinde şu satırı beğenmedim.
      IF DAK>ACDAK THEN ACIK=0
Şayet ACDAK=59 olursa hiç bir zaman DAK ondan büyük olamayacaktır.
Bu satırı aslında kaldırıp işin yapıldığı yerde dakikanın değişmesini beklemek daha akıllıca olurdu. Yani ACTIR etiketi altında ACSURE kadar bekleyip sonra röleyi kapatmak ve ardından mevcut dakika değerinin değişmesini beklemek gerekir.
Bunuda;
ESKIDAK=DAK
WHILE ESKIDAK=DAK
GOSUB ZAMANOKU
PAUSE 10
WEND
şeklinde yapabilirsin. Program bu döngüden çıkar ise dakika değişmiş demektir. Ardından ACIK=0 deyip başa dönmek en uygunu olurdu.
Ete


blueboard

Teşekkür ederim.

blueboard

#5
Ete Hocam, belirttiğiniz şekilde değişiklik yaptım.    ESKIDAK'ı da Byte olarak tanımladım. Ancak bu hex dosyasını yükleyince simulasyon çalışmaz oldu. Ekranda DS 1307 de zaman biraz bekledikten sonra geliyor ve saniye 1 veya 2 saniye ilerleyip orada kalıyor. Sonrada zaman kısmında anlamsız bir şeyler yazıyor. Ekran görüntüsünü ekliyorum.
@ DEVICE PIC16F628A
@ DEVICE PIC16F628A , WDT_OFF 
@ DEVICE PIC16F628A , pwrt_on
@ DEVICE PIC16F628A ,protect_on 
@ DEVICE PIC16F628A , cpd_on 
@ DEVICE PIC16F628A , MCLR_off
@ DEVICE PIC16F628A , INTRC_OSC_NOCLKOUT '(Dahili osilatör kullanılıyor)


DEFINE   OSC 4           ' 4MHz 
CMCON = 7                ' Disable on-chip comparator, PORTA in digital mode


TRISA = %00000000           
PortA=0
PORTB = %00000000
TRISB = %00000000

OPTION_REG.7 = 1  'Dahili pull-up lar pasif yapıldı

SN      VAR BYTE 
SECOND  VAR BYTE
ESKISN  VAR BYTE
DAK     VAR BYTE
MINUTE  VAR BYTE
SAAT    VAR BYTE
HOUR    VAR BYTE
HAFGUN  VAR BYTE
WEEK    VAR BYTE
AYGUN   VAR BYTE
DAY     VAR BYTE   
AY      VAR BYTE
MONTH   VAR BYTE
YIL     VAR BYTE
YEAR    VAR BYTE
ACSAAT  VAR BYTE  'KAPIYI AÇMA SAATİ  0-23

ACDAK   VAR BYTE  'KAPIYI AÇMA DAKİKA 0-59
ACDAK1   VAR BYTE
ACSURE  VAR WORD  'KAPIYI AÇIK TUTMA SÜRESİ YANİMOTORUN ÇALIŞMA SÜRESİ

TEMP    VAR WORD 70

SIMDI   VAR WORD 72
AKTIF   VAR BYTE 
ACIK    VAR BIT
 ESKIDAK var byte
SYMBOL ROLE1=porta.0
SYMBOL ROLE2=porta.1
SYMBOL SCL =portb.4
SYMBOL SDA =portb.5   
PAUSE 250

READ 0,AKTIF
data @0,255
IF AKTIF=255 THEN  'İLK ÇALIŞTIRMADA ZAMAN DEĞERLERİNİ GİRERSEN SAAATI AYRLAYACAK SONRADAN UNUTMAYACAK ds1307 DE PİL OLURSA
 saat=20
 DAK=33
 SN=0
 AY=6
 AYGun=11    'AYIN KAÇI İSE BURAYA YAZILACAK
 YIL=19      'YIL 2016 NIN YALNIZCA 16 SI YAZILACAK
 GOSUB ZAMANYAZ
 AKTIF=1
 WRITE 0,AKTIF:pause 10   'AKTIF=1 İSE SAAT AYARLI DEMEKTİR BİR KERE AYARLANACAK
ENDIF
 
'Yeniden saat ayarı yapmak istersen Aşağıdaki satırları aktif et 
' SAAT=8
' DAK=0
' SN=0 
' AY=6
' AYGUN=11
' YIL=16
' GOSUB ZAMANYAZ
' AKTIF=1
' WRITE 0,AKTIF:pause 10 
ACIK=0
ACSAAT=20
ACDAK=34
ACSURE=60000 'ms CİNSİNDEN VERİLECEK  (5000ms=5 SN DİR )
TEMP=ACSAAT*60+ACDAK

BASLA:

      GOSUB ZAMANOKU
      SIMDI=SAAT*60+DAK
       IF DAK>ACDAK THEN ACIK=0
      IF SIMDI=TEMP THEN GOSUB ACTIR
      PAUSE 10
      ESKIDAK=DAK
WHILE ESKIDAK=DAK
GOSUB ZAMANOKU
PAUSE 10
WEND
      PAUSE 200
      GOTO BASLA
      
ACTIR:

      IF ACIK=1 THEN RETURN
      ROLE1=1
      PAUSE ACSURE
      ROLE1=0
      pause ACSURE
        ROLE1=1
      PAUSE ACSURE
      ROLE1=0
      pause ACSURE
      ACIK=1   
      RETURN         





ZAMANOKU:
        I2CRead SDA,SCL,$D0,$00,[SECOND,MINUTE,HOUR,WEEK,DAY,MONTH,YEAR]',TEMP]                  
        sn =((SECOND>>4) & $0F)*10+(SECOND & $0F)
        IF SN=ESKISN THEN RETURN
        dak=((MINUTE>>4) & $0F)*10+(MINUTE & $0F)
        SAAT=((HOUR>>4) & $03)*10+(HOUR & $0F) 
        HAFGUN=((WEEK>>4) & $03)*10+(WEEK & $0F) 
        AYGUN=((DAY>>4) & $03)*10+(DAY & $0F)
        AY= ((MONTH>>4) & $01)*10+(MONTH & $0F)
        YIL= ((YEAR>>4) & $0F)*10+(YEAR & $0F)          
        ESKISN=SN    
        RETURN 
                      
ZAMANYAZ: 
        SECOND =(SN DIG 1)<<4+SN DIG 0
        MINUTE=(DAK DIG 1)<<4+DAK DIG 0
        HOUR=(SAAT DIG 1)<<4+SAAT DIG 0
        WEEK=(HAFGUN DIG 1)<<4+HAFGUN DIG 0        
        DAY=(AYGUN DIG 1)<<4+AYgun DIG 0
        MONTH = (AY DIG 1)<<4 + AY DIG 0
        YEAR =(YIL DIG 1)<<4+YIL DIG 0       
        I2CWrite SDA,SCL,$D0,$00,[SECOND,MINUTE,HOUR,WEEK,DAY,MONTH,YEAR,0]
        PAUSE 10
        RETURN 

ete

Ufak bir yanlış anlaşılma oldu sanırım.
Saat şayet saniye hesabı tutmuyor ise her 10 ms de bir okuma yapmak yerine her 500 ms de bir okuma yapmak daha uygun olur. Simulasyondaki o hata üst üste kısa aralıklı zaman okumadan kaynaklanan bir problem ve zaman zaman benim karşıma da çıkıyor. Bana kalırsa simulasyonun bir sorunu bu.
Sonuçta senin problemi halletmek için While wend döngüsü içindeki 10ms lik gecikmeyi 500 ms yapıver.
Düzelecektir.
Açılıştaki geç gelme meselesini anlamadım. Geç getirecek bir şey yok programda.
Sen yinede BWhile wenden sonra gelen pasue 200 komutunuda kaldır ona gerek yok artık.

Ete

blueboard

Tekrar teşekkür ederim. Simulasyon sorunu çözüldü.

Powered by EzPortal