16f628a ile Rtc çalıştırma

Başlatan blueboard, 07 Kasım 2019, 22:34:17

blueboard

Ete Hocam, forumda Gevv arkadaşımızın aşlatmış olduğu otomatik kümes açma projesi vardı. Bu projede 12f675 kullanılıyor.Yapmaya çalıştığım bununla birebir aynı. Tek fark röleyi sadece 1 kez değil de gün içinde 10-15 kez tetikleyeceğim. Benim devrede röle çıkışına motor değil de bir elektrik ampülü bağlanacak. İlgili konuda verilen PBP komutlarında değişiklikler yaparak bu tetikleme miktarını elde etmeye çalıştım ancak komutlar 12f675'in hafızasına sığmadı. Bunun üzerine komutları  daha yüksek kapasitede olan 16f628a 'ya uyarlamaya çalıştım. Giriş çıkış portlarını ayarladım. Fakat bir sorun var. Röleyi çekme zamanı gelince simulasyonda röleyi çekiyor. Ancak röleyi kapama zamanı geldiğinde röle kapanmıyor. Kodları ve devreyi ekliyorum.Kargaşa olmaması için en basit halini ekledim.
@ 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

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 SIMDI=TEMP THEN GOSUB ACTIR
      IF DAK>ACDAK THEN ACIK=0
      PAUSE 200
      GOTO BASLA
      
ACTIR:

      IF ACIK=1 THEN RETURN
      ROLE1=1
      PAUSE ACSURE
      ROLE1=0
      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 
Yardımcı olabilir misiniz.

Elektronikprojem

ACSURE=60000 'ms CİNSİNDEN VERİLECEK  (5000ms=5 SN DİR )

Bu kısma dikkat et süreyi 60000 yapmışsın.Bu 1 dakika demek oluyor. Sen roleyi açtırıp 1 dakika bekleyip sonra kapatıyorsun.

blueboard

#2
Evet , doğrudur. Rölenin çekili kalma süresi 1 dakika olacak. Simulasyonda 5 dakika beklediğim halde süre bitiminden sonra röle kapanmıyor.

Elektronikprojem

#3
Devreyi simülasyonda denedim role açılıp kapanıyor. Simülasyonda başka şeyler de yapıyorsan eğer CPU load kısmına bak simülasyon yavaş çalışıyor olabilir. 16f628a ds1307 ile denedim ben.Ds1307 nin sda ve scl uçlarına 10 k ile pull up yaptım.İstersen şemayı da ekle bakalım.

blueboard

Alıntı yapılan: Updating - 08 Kasım 2019, 09:13:06Devreyi simülasyonda denedim role açılıp kapanıyor. Simülasyonda başka şeyler de yapıyorsan eğer CPU load kısmına bak simülasyon yavaş çalışıyor olabilir. 16f628a ds1307 ile denedim ben.Ds1307 nin sda ve scl uçlarına 10 k ile pull up yaptım.İstersen şemayı da ekle bakalım.
Devre şeması ilk mesajımda RAR dosyası içindedir.

blueboard

#5
Haklısınız.

blueboard

Ete Hocam, bir süredir konuya cevap yazamamıştım. Devrenin baskı devresini yaptırdım. Ancak devreyi çalıştıramadım. Simulasyonda da şu dikkatimi çekti:İsis'te 16F628a'nin çalışma frekansını 4 MHz yapınca simulasyonda da devre çalışmıyor. Eğer İsis'te 16f628a'nın çalışma frekansını 1 MHz olarak ayarlarsam devre İsis'te çalışıyor. Hatam nerede? Dahili osilatör kullanıyorum. Sorun 16F628a'nın 1 MHz de çalışma zorunluluğundan kaynaklanıyorsa PBP dosyasında 1 MHZ nasıl ayarlarım? PBP 'de DEFINE OSC 1    yazınca hata mesajı veriyor. Dosyaları tekrar ekliyorum.

ete

#7
Nereden bu çalışmıyor kanısına erdin bilemiyorum ama verdiğin dosyadaki programlar 4Mhz de de sorunsuz çalışıyor. Sorun sende yada bilgisayarında olsa gerek.
Zaten böyle bir şey olması mümkün değil. Ne yapıyorsunda çalışmadığı fikrine kapılıyorsun açıklarsan sevinirim.
Zamanları 1 dak. farkla ayarlamışsın. Temp=1234 ve Simdi=1233 çıkıyor ve 1 dak sonra röle çekiyor. Bu dediğim 4Mhzde oluyor.

Ete

blueboard

Ete hocam, gerçek devreyi hata olmaması için baskı devre yaptırarak kurdum. Elemanları lehimledim.Enerji verdim. Aradan 10 dk geçtiği halde röle çekmedi. Emin olmak için ds1307'nin pilini söktüm, bir süre sonra tekrar enerji vererek pili taktım. Bu sefer pic'in röle bağlanan pinlerini voltmetre ile kontrol ettim. Daha sonra isis'te devreyi tekrar denedim. çalışmıyordu. İsis'te 16f628a'nın çalışma frekansını 1 MHz yapınca 16f628a ile DS1307nin bağlı olduğu pinlerde lojik1 ve lojik 0 dataları sebebi ile kırmızı mavi yanıp sönmeler başladı. Ardından da röleyi çekti.

ete

SÖylediklerin tamamen mantıksız benim için. Orada osc frekansı etken rol oynamaz.Kesinlikle oynamaz. Sorun yazılımda yada devrende. Neler olduğuna yada olacağına bakalım.Aşağıdaki kod parçası çok önemli. Sebebini aşağıda açıklıyorum.
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
İsis de yada gerçek devrede farketmez. İkiside bu söyleyeceklerimi yapacak.
Devreyi ilk defa çalıştırdın ve ardından aklına bir şey geldi ve devreyi durdurdun.
Bu aşamada neler oluyor birlikte bakalım.
Program eprom sıfır nolu adresi okuyacak ve orada 255 değerini okuyacak. Bu, hiç kullanılmamış yada yeniden programlanan bir işlemcinin eprom adresinden okunacak değerdir.
Bu 255 değerine bağlı olarak önce saate (RTC ye) ayar verecek ve eprom 0 adresine 1 yazacak.
Bu RTC nin çalışmaya başlamasına sebep olacak ve RTC deki zaman ilerliyecek ve muhtemelen senin SIMDI dediğin değeri aşmış oalcak ve devreyi ikinci defa çalıştırdığın zaman kesinlikle o röle çekmeyecektir.
Benzer olay isis içinde geçerli. Neden 1Mhz de çalıştığına gelince arada neler yaptığını bilemiyorum. Bana göre tamamen yaptıklarınla alakalı bir durum ve tesadüfden başka bir şey değil.

Bütün bunlara sebep olan şey aşağıdaki iki satır aslında,
READ 0,AKTIF
data @0,255
Bu satırları yer değiştirirsek o program her konumda çalışır.

data @0,255
READ 0,AKTIF
şeklinde yazdığın zaman her seferinde programı çalıştırdığında DATA komutu epromun sıfır nolu adresine otomatik 255 yazar. Sonradan gelen READ komutuda her seferinde o konumdan 255 okur ve her çalıştırmada saate yeni ayar verir ve senin rölede çeker.
İstersen bir dene bakalım göreceksin. Denemeyide 4 Mhzde yap.

Ete

blueboard

Teşekkür ederim.Sorun çözüldü.

Powered by EzPortal