EPROM ?

Başlatan veli, 07 Nisan 2017, 15:42:35

veli

ETE Hocam senin kesme ile ilgili derslerinden saat programını kullandım biraz değişiklik yaparak saat 24 de değilde 50000 de sıfırlayacak bide saniyeyi takip açısından bi led koydum fakat enerji kesildiğinde kaldığı yerden devam etmesini istiyorum en azından dakika ve saat olarak bunu nasıl yaparız?
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF


DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 3 'LCD  Enable Bacagı Hangi bite baglı ?
define LCD RWREG PORTB 'LCD  R/W Bacagı Hangi Porta baglı?
define LCD_RWBIT 2 'LCD R/W  Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 1 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor
'-------------------------
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101 '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 giris çıkıs
'--------------------------
SAYAC VAR BYTE
SN VAR BYTE
DAK VAR BYTE
SAAT VAR WORD
'--------------------------
CLEAR 'tüm degiskenler  sıfırlandı
PAUSE 200
LCDOUT $FE,1
LOW PORTB.2 'LCD -R/W bacagı LOW'a çekildi.
'--------------------------
BASLA:

LCDOUT $FE,$80,"CALISMA SURESi"
LCDOUT $FE,$C0,DEC5 SAAT," SAAT ",DEC2 DAK," DK"
IF SAYAC=>55 THEN
HIGH PORTB.0
ELSE
LOW PORTB.0
ENDIF
GOTO BASLA
   
DISABLE
KESME:
SAYAC=SAYAC+1 'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64  (bölme)
IF SAYAC=61 then '61 adet  kesme olunca 1 sn. süre geçiyor.(999424 us)
SAYAC=0 'sayaç sıfırlanıyor
SN=SN+1 'saniye degeri bir  artırılıyor
IF SN=60 THEN 'saniye 60  olmus ise 1 dakika süre geçti o halde
SN=0 ' saniye sıfırlanıyor
DAK=DAK+1 ' dakika degeri  bir artırılıyor
IF DAK=60 THEN 'dakika 60  olmus ise 1 saat süre geçti
DAK=0 ' dakika sıfırlanıyor
SAAT=SAAT+1 ' saat degeri  bir artırılıyor
IF SAAT=50000 THEN
SAAT=0 'saat sıfırlanıyor
ENDIF
ENDIF
ENDIF
ENDIF
INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE
END
GOTO BASLA   


ete

Enerji kesilince ne olur?
Data RAM hafızasındaki bilgiler silinir. Peki silinmemesi için bir çare varmı yok tabiiki. Var aslında devreyi pille beslersen hafıza silinmez.
Ama başka bir yöntem de bilgileri eprom yazmaktır.
Peki nasıl olmalı? Dakika ve saat için epromda bir yer belirlemelisin mesela 10 nolu eprom adresi dakika için 11 nolu adres de saat için kullanılıyor olsun.
Her dakika değiştiğinde  write 10,dak:pause 10
Her saat değiştiğinde write 11,saat:pause 10
şeklinde bunları kayıt edersin.
unutmaki sistem normal kapatılıyor ise aynı kayıt değerlerinin orada olmaması gerekir aksi halde sistemi açtığın zaman bu seferde o saat ve dakika değerlerinden başlar saymaya. Bu nedenle saat (sayma) sıfırlandığı zaman o adreslere birer sıfır yazman gerekir ayrıca.

İşin kayıt kısmı bu şekilde halledildikten sonra gelelim sistem açılışına. Başla etiketinden evvel önce 10 ve 11 nolu eprom adresleri okunması gerekir.
Read 10,dak,saat şeklinde okuyabilirsin. Hiç kayıt yapılmamış ise bu adreslerden 255 bilgisi okunur bu durumda değerleri sıfırlamak gerekir
IF dak=255 then
   dak=0:saat=0
endif
diyerek bu işide yaparsın olur biter.
Ete
   

mg1980

@veli,
Bu size ne sağlayacak? Her halükarda saat ayarı yapılması gerek miyor mu ?

ete

Dikkat etmedin galiba saat değil aslında bu bir uzun zaman sayacı sadece ve 0-50.000 saat arası çalışıyor. Bir makinanın çalışma süreleri bu şekilde tutuluyor. 50.000 sonra bir şeyler yapıyorlar bakım veya bazı parçaların değiştirilmesi gibi. Bu nedenle sıfırdan başlayıp 50.000 e kadar sayacak. ayar gerektirmez bu sistem.
Ete

veli

Hocam çok teşekkür ederim sorunumu yine çözdün Allah razı olsun...
İsiste denedim oldu bide reset ekledim
Bişey daha var bu epromların bildiğim kadarıyla bi ömrü var süre yada yazıp okuma açısından bunun için söyleyeceniz bişey varmı ayrıca devreye yeri gelecek birkaç ay enerji vermeyecem
program şu şekilde:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF& _MCLRE_OFF & _LVP_OFF & _CP_OFF


DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 3 'LCD  Enable Bacagı Hangi bite baglı ?
define LCD RWREG PORTB 'LCD  R/W Bacagı Hangi Porta baglı?
define LCD_RWBIT 2 'LCD R/W  Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 1 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor
'-------------------------
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101 '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 giris çıkıs
'--------------------------
SAYAC VAR BYTE
SN VAR BYTE
DAK VAR BYTE
SAAT VAR WORD
'--------------------------
CLEAR 'tüm degiskenler  sıfırlandı
PAUSE 200
LCDOUT $FE,1
LOW PORTB.2 'LCD -R/W bacagı LOW'a çekildi.
'--------------------------
Read 10,dak,saat

BASLA:
IF PORTA.0=1 THEN DAK=0:SAAT=0
IF dak=255 then
   dak=0:saat=0
endif
write 10,dak:pause 10
write 11,saat:pause 10
LCDOUT $FE,$80,"CALISMA SURESi"
LCDOUT $FE,$C0,DEC5 SAAT," SAAT ",DEC2 DAK," DK"
IF SAYAC=>55 THEN
HIGH PORTB.0
ELSE
LOW PORTB.0
ENDIF
GOTO BASLA
   
DISABLE
KESME:
SAYAC=SAYAC+1 'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64  (bölme)
IF SAYAC=61 then '61 adet  kesme olunca 1 sn. süre geçiyor.(999424 us)
SAYAC=0 'sayaç sıfırlanıyor
SN=SN+1 'saniye degeri bir  artırılıyor
IF SN=60 THEN 'saniye 60  olmus ise 1 dakika süre geçti o halde
SN=0 ' saniye sıfırlanıyor
DAK=DAK+1 ' dakika degeri  bir artırılıyor
IF DAK=60 THEN 'dakika 60  olmus ise 1 saat süre geçti
DAK=0 ' dakika sıfırlanıyor
SAAT=SAAT+1 ' saat degeri  bir artırılıyor
IF SAAT=50000 THEN
SAAT=0 'saat sıfırlanıyor
ENDIF
ENDIF
ENDIF
ENDIF
INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE
END
GOTO BASLA   

ete

#5
Eprom ömrü süreye bağımlı değil yazma adedine bağlı ve 1.000.000 olarak veriliyor.
Ancak tecrübelerim 800.000 lerde epromun bozulduğunu öylüyor. Belki işlemci imalat kalitesine de bağlıdır. Kimisi 1.000.000 adede kadar gidebilir.
Günde 60 x 24= 1440 adet dakika kaydın var. Buda eprom ömrü açısından 694 gün eder. demekki dakika kaydı açısından senin epromun 694 gün sonra bozulacak. Buda neredeyse 2 yıl demektir. Bence mantıklı bir süre her yıl işlemci değiştirirsin yada biraz daha akıllıca bir program yazarsın belirli bir saat kaydından sonra eprom hafızası değiştirirsin. 10 yerine 15 kullanırsın. Başka bir adresede hangi eprom adreslerini kullandığını yazarsın mesela sıfır nolu eproma kullandığın adresi yazarsın böylece çok uzun ömürlü bir sistemin olur.

Çünki epromun tamamı bozulmuyor sadece kayıt yaptığın eprom adresi bozuluyor. Bu nedenle her 6 ayda bir adres değiştirmek belkide daha uygun olur. 6 ay derken 6 aya tekabül eden eprom kaydına ulaşıldığında demek istedim.

Programda bir hatan var. aşağıdaki satırları eprom okumasından hemen sonraya yazman lazım sen basla etiketinden sonraya yazmışsın.
IF dak=255 then
   dak=0:saat=0
endif
bir de ortak hatamız var. SAAT değişkenin word tipinden olmalı. o halde iki eprom adresine kayıt yapılmalıdır.
WRITE 10,dak,Saat.Byte1,Saat.Byte0:pause 10 şeklinde.
Okunurken;
READ 10,dak, Saat.Byte1,Saat.Byte0 şeklinde okunmalı

Programdaki diğer hata dak ve saat bilgisinin bir şarta bağlı olmaksızın sürekli kayıt edilmesi çünki o şekilde yazmışsın.
Ne demiştim dakika değiştiği zaman dakika, saat değiştiği zaman saat kayıt edilmeli.
Nerede değişiyor bunlar kesme içinde o halde kayıtlarda orada olmalı. Bak DAK=DAK+1 ' dakika degeri  bir artırılıyor diye bir komut satırın var bu dakika değerini değiştiriyor işte orada dak benzer şekilde de saat ilgili bölümde kayıt edilmeli.
Şu anda yaptığın gibi yaparsan zaten eprom ömrün 1 saate kalmaz biter.

Ete

veli

Hocam dediğin gibi yaptığımı düşünüyorum fakat zaman şaşıyor similasyonda bir buçuk dakika geçiyor programda 1 dakika geçiyor ayrıca bazen saat 255 de başlıyor bide kesmenin içine nasıl ekleyeceğimi anlayamadım
www.dosyaupload.com/8QyZ

READ 10,dak, Saat.Byte1,Saat.Byte0
IF dak=255 then
   dak=0:saat=0
endif
BASLA:
IF PORTA.0=1 THEN DAK=0:SAAT=0
WRITE 10,dak,Saat.Byte1,Saat.Byte0:pause 10

LCDOUT $FE,$80,"CALISMA SURESi"
LCDOUT $FE,$C0,DEC5 SAAT," SAAT ",DEC2 DAK," DK"

ete

Programı düzelttim. İlişiktedir.
Bana göre fena çalışmıyor. Bu sonuta kesme ile üretilen bir saat. Çok doğru gitmesi beklenemez.
Buna razı olacaksın.
Ete

veli

Hocam saat yine 255 te başladı ıf saat=255 then saat=0 yaptım bu sefer oldu kesin
Çok teşekkür ederim ilgin için

ete

Saat saya saya 255 e de gelecek o zaman ne olacak?
0-50.000 arasında sayacak olan saat 255 den elbette geçecek ama hiç bir zaman 65535 e gelemeyecektir.
Saatin 255 den başlaması normal değil. Mutlaka önceki kayıtlardan kalan bir şey vardır. Bu nedenle epromu sıfırlaman gerek önce. Gerçek devrede pic programlanınca eprom hafızası 255 ler ile dolacaktır o zaman dopru çalışır ama şimdi ilave ettiğin o komut işini bozacak bunuda bilesin.
Ete

Powered by EzPortal