Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

sayac

Başlatan selvi, 15 Nisan 2009, 14:42:44

selvi

asagidaki programi elektrik oldugunda saat in calismasini saglamak.elektrik kesildigi halde degerlerin kaybolmamasi gerekir.ve rb0 e bagli butona bastigimda saat degerinin sifirlanmasi gerekiyor.sorun elektrik kesildiginde degerler sifirlaniyor.


@ DEVICE pic16F628 'islemci 16F628A
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullaniliyor.
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

ON INTERRUPT GoTo KESME   'kesme olu?ursa KESME adl? etikete git.
OPTION_REG=%00000101       'Pull up dirençleri ?PTAL- Bölme oran? 1/64.
INTCON=%10100000         'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7             '16F628 de komparatör pinleri iptal hepsi giri? ç?k??
TRISB=%00001011
TRISA=%00110010
PORTB=0
PORTA=0
PORTA.0=0
'------------------------------------------------------------------------------
SAYAC   VAR  BYTE
SAYI    VAR  BYTE
SAYI1   VAR  BYTE
SAAT    var  BYTE
SANIYE  VAR  BYTE
DAKIKA  VAR  BYTE
SAYAC=0
SAYI1=0
SAYI=0
SAAT=0
SANIYE=0
DAKIKA=0
'------------------------------------------------------------------------------
LCDOUT $FE,1,"HEY"
LCDOUT $FE,$C0,"DUNYA"
PAUSE 200

LOOP:
IF PORTB.0=0 THEN
   SANIYE=0
   SAAT=0
   DAKIKA=0
   WRITE 0,0
   WRITE 1,0
   WRITE 2,0
   WRITE 3,0
ENDIF    
GOTO LOOP
DISABLE
KESME:
READ 0,SAYAC
SAYAC=SAYAC+1
WRITE 0,SAYAC
READ 0,SAYAC
IF SAYAC=61 THEN
   SAYAC=0
   READ 1,SANIYE
   SANIYE=SANIYE+1
   WRITE 1,SANIYE
   READ 1,SANIYE
   LCDOUT $FE,1,"NORMAL"
   LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE          
   
   IF SANIYE=60 THEN
       SANIYE=0
       READ 2,DAKIKA
       DAKIKA=DAKIKA+1
       WRITE 2,DAKIKA
       READ 2,DAKIKA
       IF DAKIKA=60 THEN
           DAKIKA=0
           READ 3,SAAT
           SAAT=SAAT+1
           WRITE 3,SAAT
           READ 3,SAAT
           IF SAAT>=90 THEN
           LCDOUT $FE,1,"YAG EKLE"
           LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
           ENDIF
        ENDIF
    ENDIF
ENDIF
INTCON.2=0        'TMR0 Kesme bayra?? s?f?rlan?yor
        RESUME
        ENABLE
       
END
Yaşam anlamlandırıldıkça kutsaldır....

agora_meyhanesi42

Saat entegresi kullanmazsan degerlerin kaybolması normaldir DS 1302 gibi saat entegreleri kullanmalısın sanırım
Yüksel Türk ! Senin için yükselmenin hududu yoktur...

Tagli

Yani elektrik yokken de saatin çalışmasını mı istiyorsun? Bence de bunun için en kolay yol DS1302 gibi bir saat entegresi kullanmak (elbette buna bir de pil bağlamak gerekiyor). Aslında aklıma başka bir yol da gelmiyor. Sonuçta saatin çalışması için bir yerlerden elektrik alması şart.

Yok eğer amaç sadece saatin son değerini bir yerde tutmaksa belki elektrik kesintisini algılayıp o sıradaki değerler EEPROM'a yazılabilirsin. Forumda bir yerde bu işin büyük bir kapasitörle yapılabileceğini okumuştum; kapasitör EEPROM kaydı tamamlanana kadar PIC'i besleyebilmeli. Tabi kesintiyi anlamak için sürekli kontrol gerekecektir.
Gökçe Tağlıoğlu

selvi

elektrik varken saatin calismasi, elektrik gittiginde son degerlerin kaybolmamasi gerekiyor.elektrik yokken saat   calismayacak.ben eeprom kullandim.fakat istedigimsonuclari tamalamadim.kismi degisikler yaptim,programda .fakat  sonuc degismedi.
Yaşam anlamlandırıldıkça kutsaldır....

ete

@ Agora......
Programa bakmadan yorum yapman yanlış. Yada bakmış olmana rağmen yanlış yorum yapıyorsun. Selvi, değerleri eeproma yazdırmak istiyor yazdırabilirse değerlerin sıfırlanması diye bir şey söz konusu bile olamaz.

@Selvi,

Gördüğüm tek hata her bir write komutundan sonra pause 10 gibi bir gecikme vermen gerekir.
Bunu vermezsen kayıt işlemi tamamlanmaz.

Bana kalırsa biraz da mantık hatan var. Şöyle;
Eepromdan okuma işini yalnızca programın en başında yap ve program en son kayıt edilen değeri alsın oradan devam etsin.
Kesme kısmında önce okuyor sonra bir artırıp yeniden kayıt ediyor sonra karşılaştırma yapmak için bile yeniden okuyorsun bunlar yanlış
Kesme kısmı şöyle olmalı;

DISABLE
KESME:
     SAYAC=SAYAC+1
     IF SAYAC=61 THEN
        SAYAC=0
        SANIYE=SANIYE+1
        IF SANIYE=60 THEN
          SANIYE=0
          DAKIKA=DAKIKA+1
          IF DAKIKA=60 THEN
            DAKIKA=0
            SAAT=SAAT+1
            LCDOUT $FE,1,"NORMAL"
            LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE            
            IF SAAT>=90 THEN
               LCDOUT $FE,1,"YAG EKLE"
               LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
            ENDIF
          ENDIF
        ENDIF
       write 1,SANIYE:PAUSE 10
       WRITE 2,DAKIKA:PAUSE 10
       WRITE 3.SAAT:PAUSE 10        
     ENDIF          

     INTCON.2=0 'TMR0 Kesme bayra?? s?f?rlan?yor
     RESUME
     ENABLE

Tabiiki, 3 adet bilgi kaydı yaklaşık 30 ms lik bir süreyi alıp götürecektir. Dolayısyla bu süre ve komutların diğer gecikmelerinden dolayı sayac değeri 61 iken değilde 50-55 arası bir değerde sn=sn+1 yaptırman daha doğru olacaktır.


ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

saat elektrik varken calisacak.elektrik varken saatin calismasi, elektrik gittiginde son degerlerin kaybolmamasi gerekiyor.elektrik yokken saat   calismayacak.ben eeprom kullandim.fakat istedigimsonuclari tamalamadim.kismi degisikler yaptim,programda .fakat  sonuc degismedi.
Yaşam anlamlandırıldıkça kutsaldır....

mustafa_cmbz

bence besleme girişine 4700uf veya 10000uf değerinde (artık deneyerek veya devrenin çekeceği akıma göre hesap edilip) bir kondastör atıp elektrikler kesildikten sonra pic'e 4-5sn kazandırsın ki eeproma yazma işlemi sağlıklı olsun...sizin sorununuz bundan kaynaklanabilir selvi hocam...

Tagli

Sanırım yukarıdaki kodda değişkenler her güncellendiğinde EEPROM'a yazılmış. Bence bu yanlış. Çünkü her ne kadar EEPROM ömrü 1 milyon kez yazmaya izin verse de mesela saniye için bu ömür 10 gün içinde dolacaktır. Gerçi dakika ve saat için durum bu kadar kötü değil. Hatta basit bir algoritmayla EEPROM'un birden çok alanı saniye için dönüşümlü olarak kullanılarak bu ömür uzatılabilir. Ama bana yine de bu yöntem yanlış gibi geliyor...
Gökçe Tağlıoğlu

selvi

programi en asagidaki gibi duzenledim.devreye besleme verdigimde ekranda 55:55:00 yaziyor.eepromdan kaynakli olabilir.ama ciddi bir sorun teskil etmiyor.reset butonuna (portb.0=0) basilginda degerler 00:00:00 oluyor.
  ortalama bir sorun yok.zaman ayarlamasini tam yapamadim.ozellikle saniye kisminda 59 dan sonra 00 olmasi gerekirken 60 oluyor.1 saniye sonra 00 oluyor.buda her dakikada bir saniye gecikme olusturuyor.her saatde 1 dakika gecikme yaratiyor.bu sorun dakika kisminda yasanmiyor.bu kisim dogru calisiyor.yani 59 dakikadan 60 sn sonra lcd ekranina dakika kismina 00 yaziyor.saniye kismini nasil duzeltebilirim.
loop dongusune portb.3 ve porta.4 uclarina buton baglayarak saat ve dakika ayarini artirmak icin.bunu programa ekledigim icin belirtim.

@ DEVICE pic16F628 'islemci 16F628A
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullaniliyor.
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

ON INTERRUPT GoTo KESME   'kesme olu?ursa KESME adl? etikete git.
OPTION_REG=%00000101       'Pull up dirençleri ?PTAL- Bölme oran? 1/64.
INTCON=%10100000         'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7             '16F628 de komparatör pinleri iptal hepsi giri? ç?k??
TRISB=%00001011
TRISA=%00110010
PORTB=0
PORTA=0
PORTA.0=0
'------------------------------------------------------------------------------
SAYAC   VAR  BYTE
SAYI    VAR  BYTE
SAYI1   VAR  BYTE
SAAT    var  BYTE
SANIYE  VAR  BYTE
DAKIKA  VAR  BYTE
SAYAC=0
SAYI1=0
SAYI=0
SAAT=0
SANIYE=0
DAKIKA=0
READ 1,SANIYE
READ 2,DAKIKA
READ 3,SAAT
'------------------------------------------------------------------------------
LCDOUT $FE,1,"HEY"
LCDOUT $FE,$C0,"DUNYA"
PAUSE 200

LOOP:
IF PORTB.0=0 THEN
   sayac=0
   SANIYE=0
   SAAT=0
   DAKIKA=0
   WRITE 0,0
   WRITE 1,0
   WRITE 2,0
   WRITE 3,0
ENDIF
IF PORTB.3=0 THEN
   READ 3,SAAT
   SAAT=SAAT+1
   IF SAAT>99 THEN
       SAAT=0
       WRITE 3,SAAT
   ENDIF    
   WRITE 3,SAAT
   PAUSE 300
ENDIF
IF PORTA.4=0 THEN
   READ 2,DAKIKA
   IF DAKIKA>=60 THEN
       DAKIKA=0
       WRITE 2,DAKIKA
   ENDIF    
   DAKIKA=DAKIKA+1
   WRITE 2,DAKIKA
   PAUSE 300
ENDIF            
GOTO LOOP
DISABLE
DISABLE
KESME:
SAYAC=SAYAC+1
IF SAYAC=57 THEN
SAYAC=0
SANIYE=SANIYE+1
IF SAAT>=95 THEN
LCDOUT $FE,1,"YANACAK"
LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
GOTO BAK
ENDIF
IF SAAT>80 THEN
LCDOUT $FE,1,"AZALIYOR"
LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
GOTO DUR
ENDIF        
IF SAAT>=90   THEN
    LCDOUT $FE,1,"YAG EKLE"
    LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
    GOTO GIT
   ENDIF
LCDOUT $FE,1,"NORMAL"
LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE    
GIT:
BAK:
DUR:  
IF SANIYE=60 THEN
SANIYE=0
DAKIKA=DAKIKA+1
IF DAKIKA=60 THEN
DAKIKA=0
SAAT=SAAT+1
IF SAAT>99 THEN
   SAAT=0
ENDIF
IF SAAT>=95 THEN
LCDOUT $FE,1,"YANACAK"
LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
GOTO CIK
ENDIF
IF SAAT>80 THEN
LCDOUT $FE,1,"AZALIYOR"
LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
GOTO HEY
ENDIF      
IF SAAT>=90 THEN
LCDOUT $FE,1,"YAG EKLE"
LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
ENDIF
CIK:
HEY:
ENDIF
ENDIF
write 1,SANIYE:PAUSE 10
WRITE 2,DAKIKA:PAUSE 10
WRITE 3,SAAT:PAUSE 10
ENDIF

INTCON.2=0 'TMR0 Kesme bayra?? s?f?rlan?yor
RESUME
ENABLE
Yaşam anlamlandırıldıkça kutsaldır....

ete

@Selvi,

Başlangıçta 55:55:55 olarak görmenin sebebi eepromdan okunan değerlerin ilk okumada yani herhangi bir kayıttan evvel 255 yani $FF okunmasından kaynaklanıyor.
Programın hemen başında,
READ 1,SANIYE
READ 2,DAKIKA
READ 3,SAAT
komutları bulunmakta bunların altına şunu ilave edersen bu kusurdan kurtulursun.
IF SANIYE =255 then SANIYE=0
IF DAKİKA=255 then DAKIKA=0
IF SAAT=255 then SAAT=0

Saniyenin 60 olma sebebi ise, saniye değerinin 60 olduğunu ekrana yazdıktan sonra kontrol ediyorsunda ondan.
Aslında kesme kısmını yine karma karışık yazmışsın.
Doğru şekil aşağıdadır.
Bu şekilde saniyede bir değişiklik olursa kayıt edilir.
Dakikada bir değişiklik olur ise kayıt edilir.
Saat de bir değişiklik olur ise kayıt edilir.
Kısaca kayıtlar lazım olduğu zaman yapılır. İkazlarda ona göre sırası ile verilmektedir.

DISABLE
KESME:
SAYAC=SAYAC+1
IF SAYAC=57 THEN
 SAYAC=0
 SANIYE=SANIYE+1
 If SANIYE=60 then
    SANIYE=0      
    DAKIKA=DAKIKA+1
    IF DAKIKA=60 THEN
       DAKIKA=0
       SAAT=SAAT+1
       IF SAAT>=95 THEN
          LCDOUT $FE,1,"YANACAK"
          goto atla
       endif
       IF SAAT>=90 THEN
         LCDOUT $FE,1,"YAG EKLE"  
         goto atla
       endif  
       IF SAAT>80 THEN
         LCDOUT $FE,1,"AZALIYOR"
         Goto Atla
       endif
       LCDOUT $FE,1,"NORMAL"    
ATLA:          
       IF SAAT=100 THEN
          SAAT=0
       endif
      WRITE 3,SAAT:PAUSE 10
    endif
    WRITE 2,DAKIKA:PAUSE 10
 endif
 WRITE 1,SANIYE:PAUSE 10
 LCDOUT $FE,$C0,DEC2 SAAT,":", DEC2 DAKIKA,":",DEC2 SANIYE
endif
INTCON.2=0 'TMR0 Kesme bayra?? s?f?rlan?yor
RESUME
ENABLE

E T E
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com