Z

ds1307 enerji kesildiğinde....

Başlatan zengar, 10 Nisan 2012, 14:26:59

zengar

Meraba ETE hocam selam herkese...! 
Ete hocam her yerde her forumda siz varsınız, şimdiye kadar sayısız müşkilatımı sizin forumlarla hallettim.
Kolunuza sağlık.
ds1307  ile yaptığım çalışmada bazı sensörleri her saniyede çok defa taratmam gerekiyor
ds 1307 süre aralığının önemi varmı  ayrıca hersaniye gitsem bile bilgisayar saatine göre
simülasyonda her dakikada toplamda 6 saniye gecikme oluyor bu problem çıkarırmı?
Kartın devresine enerjiyi şebekeden verecem yani elektrikler kesildiğinde saatin çalışması gerekiyor
ne yapmam gerekir.

Tavsiyelerinize muhtaç kardeşiniz ZENGAR....!   :)
   

Mucit23

Ben söyliyeyim.
DS1307 Eletrikler kesildiğinde saati unutmaması için pil girişi vardır zaten buraya 3V CR2032 pillerden bağlayabilirsin. Elektrikler kesildiğinde otomatikmen DS1302 bu pil üzerinden beslenir.

DS1307 yi birçok defa kullandım. Aslında pic çok hızlı çalışıyor. Yani 1 Sn içerisinde belki 20-30 Defa Saat okunuyordur. Sen bu aralıkta Diğer sensörleride okuyabilirsin. Tabi Bu yaptığın işlemlerin tümü 1Sn aralığını geçmemesi lazım yoksa programda Daha doğrusu Zamanın gösteriminde aksamalar yaşanır.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

zengar

Eyvallah mucit hocam...
Peki geri pic e enerji geldiğinde programın başına yazdığımız ilk tarih verme olayı tekrar ds1307 yi
formatlamıyacakmı?
yani 


'------------------------------
sn=00            ' SAN  0
dak=25           ' DAK 25
saat=18          ' SAT 18
gun=20           ' GUN 20
hafgun=1         ' HG   1
ay=10            ' AY  10
yil=9            ' YIL 09

gosub yaz   ' DS 1307 YE YAZ

'------------------------------

bu bölümden bahsediyorum.

ete

Birşeylerde ben ekleyeyim.
Malum DS1307 içindeki bilgi 1000 ms de bir değişmektedir. O halde DS 1307 den sürekli bilgi okumaya çalışmak hata olur.
Bu nedenle her 1000 (veya her 950)  ms  de bir okuma yapılması en doğrusu olur.
ZAaten sensör veya buton kontrolüde yapacak isen bir döngü kurup onların birden fazla taranarak yaklaşık 900-950ms zaman geçirilmesi ve sonradan DS1307 nin okunmasında yarar vardır.
Bunu yapmak için sensör ve buton kontrollerini bir döngü içine alın.  Gerekirse TMR1 kullanarak bir okuma çevriminin ne kadar zaman aldığına bakın .

DS1307 nin formatlanması olayına gelince. Elbette programın başına zamanı formatlayan değerler yazarsan her çalıştığında aynı değerleri DS1307 yükler. Bu nedenle zaman ayarı menü aracılığı ile yapılmalıdır. Ancak madem DS 1307ile pil kullanacaksın bu durumda iki program kullanarak bu sorunuda aşarsın.
Diyelimki akşam saat 17:00 civarında bu işi yapıyorsun. Programa SN=0:DAK=0:saat=17..... Gibi değerleri verip saat tam 17 de pici çalıştırır ve bu değerleri DS1307 ye yazmasını sağlarsın. Sonra ikinci programda bu formatlama datalarını kaldırarak pice programı yazarsan formatlanma olayı ortadan kalkar ve saatin ilk ayarlandığı şekilde çalışmaya devam eder. Pili sökmediğin müddetçe 10 yıl bu ayarda kalır. Tabiiki arada ileri gitme veya geri kalma durumlarına bağlı olarak ayar gerekir. Benzer şekilde halledersin. En iyisi bir ayar menüsü koymaktır.
Bizim Haftalık Timer programını incele orada bu konu gayet güzl bir şekilde yapılmış idi.

Ete

zengar

Eyvallah eTe Hocam ağzına sağlık...

zengar

hocam günlerdir uğraşıyom programla alt programlara dallanmadamı  sorun yaşıyor bi türlü anlayamadım kafayı yicem
farklı picler kullandım tavsiyellerinizde olduğu gibi 100 nf bağladım farklı algoritmalr kullanıyom hepsi isis te tam cevap
veriyor ama uygulamasında problem yaşıyom hocam bizahmet kefser misal nazarınızla bi bakıverin....!
simülasyonuda ekliyom


INCLUDE "MODEDEFS.BAS"
DEFINE OSC 4   
     ADCON1=7
     
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2   
     
TRISA=0
TRISC=%00000001                     
TRISB=0                     
TRISD=%00111111
PORTD=0
PORTA=0
PORTC=0




GUN     VAR BYTE
HAFGUN     VAR BYTE
AY      VAR BYTE
YIL     VAR BYTE
TARIH   VAR BYTE
SAAT    VAR BYTE
DAK  VAR BYTE
SN  VAR BYTE
TEMP VAR BYTE
BOS var byte
sayac var byte
ALICI VAR BYTE
SAY VAR BYTE
bimjer var byte
KESICI var byte
ButonArk con 100

SYMBOL SCL= PORTA.1
SYMBOL SDA= PORTA.0
SYMBOL dakarttir= PORTD.2
SYMBOL saatarttir= PORTD.4
SYMBOL ayar= PORTD.3
SYMBOL cikis= PORTD.5
KESICI=0
ALICI=0
bimjer=0
sayac=0
pause 500

BASLA:
GUN = 26
ay = 04
YIL = 10
HAFGUN = 1
SAAT = 00
DAK = 30
SN = 30
             
        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
        I2CWrite SDA, SCL,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,TEMP]

ANA_DONGU:
sayac = sayac + 1   
pause 100
SERIN2 PORTC.0,396,[WAIT("HUL"),ALICI]

if sayac=9 then
I2CRead SDA, SCL,$D0,$00,[SN,DAK,SAAT,HAFGUN,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   
LCDOUT $FE,1,"SAAT  "
LCDOUT  DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
sayac=0
endif

if ayar=0 then  S_A

if ALICI = 20 then
high PORTD.7
pause 500
low PORTD.7
pause 500
high PORTD.7
pause 500
low PORTD.7
endif
'********************
if SAAT >= 20 and SAAT <= 23  then
if ALICI = 10 then ALARMA
if PORTD.0=0 then ALARMA
if PORTD.1=0 then ALARMA
endif

if SAAT >= 00 and SAAT <= 6  then
if ALICI = 10 then ALARMA
if PORTD.0=0 then ALARMA
if PORTD.1=0 then ALARMA
endif
GOTO ANA_DONGU 
'********************         
  S_A:
if saatarttir=0 then
if saat>23 then
            Saat=0
             else
                saat=saat+1
                   endif
                    endif                       
  if dakarttir=0 then
    if dak>59 then
         dak=0
           else
             dak=dak+1
                endif
                 endif
             Pause ButonArk
LCDOUT $FE,1,"SAAT  "
LCDOUT  DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
  PAUSE 50
 
IF cikis=0 then
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
I2CWrite SDA, SCL,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,TEMP]
gosub ANA_DONGU:
endif 
  GOTO S_A     

ALARMA:
KESICI=KESICI+1
if KESICI=4 then ANA_DONGU
FOR SAY=1 TO 2
pause 6000
high PORTC.2
pause 500
low PORTC.2
pause 500
high PORTC.2
pause 500
low PORTC.2
pause 3000
high PORTC.1
pause 500
low PORTC.1
pause 500
high PORTC.1
pause 500
low PORTC.1
pause 500
high PORTC.1
pause 500
low PORTC.1
PAUSE 60000
NEXT SAY
bimjer = 0

ALARM:
bimjer = bimjer + 1
    high PORTC.3
    PAUSE 3000
    low PORTC.3
     PAUSE 500
     if bimjer =60 then
     low PORTC.3
     gosub ANA_DONGU
      endif     
goto ALARM
      end

ete

Muhtemelen yaşadığın sorun programda hiç sigorta aayrı vermemiş olmandan kaynaklanıyor.
Bak bakalım bu program için hangi işlemciyi kullandın? bellimidir. Değil elbette.
Programa göre 4 Mhz kristal kullanıyorsun ama sigorta ayarından bunun için XT yi seçmişmisin? belli değil.
Üstelik 16F877A  kullanmış isen birde komparatörlerini iptal etmen gerekecek. Yani CMCON=7 komutunuda programın başına ilave etmen gerekecek.
Programın başında aşağıdaki sigorta ayarlarının olması gerek;
'------------------------------------------------------------------------
@ DEVICE PIC16f877A
@ DEVICE PIC16f877A, WDT_OFF
@ DEVICE PIC16f877A, BOD_ON
@ DEVICE PIC16f877A, PWRT_ON
@ DEVICE PIC16f877A, PROTECT_OFF
@ DEVICE PIC16f877A, XT_OSC
'------------------------------------------------------------------------
CMCON=7

Şayet 16F877 kullanıyorsan CMCON=7 komutuna gerek yoktur.

Ayrıca bir birinin aynı kodları birden fazla sayıda kullanıyor isen onları bir etiket altında toplayıp en alta bir RETURN yazmak ve sonra o kodlar lazım olduğunda GOSUB Etiket demek oraya gidip kodları işleyip geri dönmek gerekir. Böylece kod hafızasından tasarruf etmiş olursun.
Dikkat edersen zaman okuma kısmını bir kaç kez kullanmışsın. Bu kodu bir yere yazım başına ZAMANOKU yazıp altına bir RETURN koymak ve o kodlar lazım olduğunda GOSUB ZAMANOKU demek yeterli oalcaktır.

Ete

zengar

Teşekkürler hocam..!
Böyle yapmazsam subroutine dallanmıyordu mesela saat ayar bölmesinde
saçmalayıp duruyor ama sigorta ayarlarını denicem..

zengar

Proje bitti çok şükür 10 larca denemeden sonra buldum problem donanımsalmış küçük bir temazsıızlık.
Ayrca sigörta ayarlarını daha önce programlarıma yazmayı çok denedim compile edince onları hata gibi görüyodu.Onunda sebebi 18f452 yi programlamak için microcode stüdio ya mplab kurmuştum onu iptal edince hata vermedi..
Teşekkürler eTe..! 

Powered by EzPortal