dahili eprom daki değerin kontrolsüz olarak değişim sorunu

Başlatan Evren Kılıç, 01 Nisan 2014, 20:36:56

Evren Kılıç

merhaba arkadaşlar,
benim sorunum şu şekilde, kullanmış olduğum programda bir menü ile değiştirdiğim iki adet değişkenim var bu değişkenlere bir değer verip             WRITE $01,SETA                                                                             
WRITE $02,SETB  şeklinde eproma yazıyorum ve program başlangıcında READ 01,DEGERA
                                                                                                       READ 02,DEGERB  şeklinde okuyup  program içerisinde değerlendiriyorum fakat bir süre sonra epromdan okuduğum değer ayarladığımdan çok farklı alakasız  değerler oluyor, ben 22 olarak ayarlıyorum fakat bazen 55, bazen 9, bazen 90 olduğu oluyor, eprom da saklanan değer kendiliğinden değişiyor   fakat bu süre bazen 1 ay, bazen 3 ay oluyor ve sonuçta işlemciyi değiştirmek zorunda kalıyorum, sizce bu sorunun nedeni ne olabilir     

ete

Eprom'un yazma ömrü vardır. Bu yaklaşık 1.000.000 defa yazma şeklinde data sheetlerde belirtilmiştir. Ancak gerçekte bundan daha az olduğu kanaatindeyim.
Tecrübelerime dayanarak söylüyorum genelde program yazanlar tecrübeli değiller ise epromu sonsuz ömürlü zannedip sürekli olarak kayıt yapmaktadırlar.
Hiç bir şarta ve koşula bağlı olmaksızın çalışan bir kayıt komutu eprom ömrünü 1 saat içinde bitirebilir. Bu nedenle gerekmedikçe eproma yeniden kayıt yapmayın. Yalnızca bilgi değiştiği zaman eproma kayıt yapın. kısa aralıklı değişiklikleride kayıt etmeyin.Nasıl olsa değişecek deyip iki defada bir kayıt almanız daha mantıklı olur.
Açıkladığın sorunun epromun kayıt ömrü ile alakalı olduğunu tahmin ettiğim için bu açıklamaları yaptım.
Normal şartlarda bir değişken değeri siz değiştirmedikçe değişmez. Epromdaki değerde değiştirilmedikçe değişmez.
Ama eproma kayıt yapılırken kayıt süresi kada gecikme verilmez ise ki bu süre 10 ms dir kayıt edilen bilgi yanlış kayıt edilebilir.
Daha doğrusu bir kayıt bitmeden üzerine yeniden bir kayıt emri verirseniz bitmeyen kayıt sekteye uğrayabilir. Bunları düşünmek gerekiyor.

Ete

Evren Kılıç

eproma yazdığım kısım aşağıdaki kodda ve çok sık değiştirilen bir ayar değil, haftada 1 veya 2 defa değişim ihtiyacı bazen duyuluyor bazen değişmiyor bile.


Ayar:

    if sayac=8 then
   
        WRITE $01,GUNSIC
        WRITE $02,GECSIC
     
     
        lcdout $FE,$0C  'KURSÖR 2. SATIR BAŞINA GELDİ
        lcdout $FE,1     'EKRAN SİLİNDİ
       lcdout $FE,1,  "ZAMAN & SICAKLIK"
       lcdout $FE,$C0,"  AYARLARLANDI      "
        pause 800
        lcdout $FE,1  'EKRAN SİLİNDİ         
         Ayar_D=0
        gosub Zaman_Yaz
'           LOW TR
     endif
     return

ete


Evren Kılıç

program
       
Basla:
      READ 01,GNSIC
      READ 02,GCSIC 
     
     
      GUNSIC=GNSIC
      GECSIC=GCSIC
           
     if Ayar_D=1 then AYARla
        gosub Zaman_Oku
        gosub SENSOROKU
        lcdout $FE,2,dec2 Saat,":",dec2 Dak," ISI=",DEC2 ISI,",",DEC1 (Float),Deg,"C"
        lcdout $FE,$C0,"GUND:",DEC2 GUNSIC," GECE:",DEC2 GECSIC
       
        gosub GDZ  'Buton -  ve + ile kısayoldan(menüye girmeden),sadece Gündüz, sıcaklık azaltıp,çoğaltma.
        gosub GCE  'Buton -  ve + ile kısayoldan(menüye girmeden),sadece Gece, sıcaklık azaltıp,çoğaltma.

        GOSUB KOMBI1
        GOSUB VERICI110
        GOSUB VERICI0
       
        pause 50
       
        goto basla

AYARLA:       
        GOSUB MENU_AYAR
'        AYAR_D=0   '?
       
AYAR_BIR:
       
        IF SAYAC=8 THEN CIK        '21 İDİ
        select case Sayac 'Cursor Ayarı
            case 1
           
               LCDOUT $FE,$0E
               lcdout $FE,$81  'saat ayarı lcd 1. satır  2.karakter

            case 2
              lcdout $FE,$0E
              lcdout $FE,$84   'dakika ayarı lcd 1. satır  5.karakter
                 
            case 3
                lcdout $FE,$0E
                lcdout $FE,$87  'gün ayarı lcd 1. satır  8. karakter
            case 4
                lcdout $FE,$0E
                lcdout $FE,$8A  'ay ayarı lcd 1. satır  11. karakter
            case 5
                lcdout $FE,$0E
                lcdout $FE,$8f  'yıl ayarı lcd 1. satır 16. karakter
            case 6
                lcdout $FE,$0E   
                lcdout $FE,$C6   'gündüz sıcaklık ayarı 2. satır 7. karakter
            case 7
                lcdout $FE,$0E
                lcdout $FE,$CE    'GECE sıcaklık ayarı 2. satır 15. karakter
                                                                                   
        end select
        pause 150
        lcdout $fe,$0c:pause 120
        gosub Buton_Oku
        IF SAYAC=8 THEN CIK         
        GOSUB MENU_AYAR
     Goto AYAR_BIR
CIK:
    ayar_D=0
    sayac=0
    goto basla
         
     
MENU_AYAR:
          lcdout $FE,2,dec2 Saat,":",dec2 Dak," ",dec2 AYGUN,"/",dec2 Ay,"/20",dec2 YIL
          lcdout $FE,$C0,"GUND:",DEC2 GUNSIC," GECE:",DEC2 GECSIC

          return
'***********Sensör Oku***********                                   
SENSOROKU:
           
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
   
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       ham=($ffff-ham+1)
    endif
    FLOAT= ham*10/16
GEC:
    ISI=float/10-1
    FLOAT = (float //10)
     
RETURN
'***********Buton Oku***********
Buton_Oku:
   
    select case Sayac
       
        case 1
            if Buton3=0 then saat=saat+1
            if Buton2=0 then saat=saat-1
'            pause 50
            if saat>23 then saat=0
        case 2
            if Buton3=0 then dak=dak+1
            if Buton2=0 then dak=dak-1
'            pause 50
            if dak>59 then dak=0
        case 3
            if Buton3=0 then AYGUN=AYGUN+1
            if Buton2=0 then AYGUN=AYGUN-1
'            pause 50
            if AYGUN>31 then AYGUN=1
        case 4
            if Buton3=0 then ay=ay+1
            if Buton2=0 then ay=ay-1
'            pause 50
            if ay>12 then ay=1
        case 5
            if Buton3=0 then YIL=YIL+1
            if Buton2=0 then YIL=YIL-1
'            pause 50
            if YIL>99 then YIL=1
        case 6
            if Buton3=0 then GUNSIC=GUNSIC+1
            if Buton2=0 then GUNSIC=GUNSIC-1
'       
'            pause 50
           if GUNSIC>30 then GUNSIC=1
        case 7
            if Buton3=0 then GECSIC=GECSIC+1
            if Buton2=0 then GECSIC=GECSIC-1
'       
'            pause 50
            if GECSIC>30 then GECSIC=1

    end select               
   
    gosub Ayar
   
    return
'***********Saat Ayarı***********
Ayar:
'    HIGH TR
    if sayac=8 then
   
        WRITE $01,GUNSIC
        WRITE $02,GECSIC
     
     
        lcdout $FE,$0C  'KURSÖR 2. SATIR BAŞINA GELDİ
        lcdout $FE,1     'EKRAN SİLİNDİ
       lcdout $FE,1,  "ZAMAN & SICAKLIK"
       lcdout $FE,$C0,"  AYARLARLANDI      "
        pause 800
        lcdout $FE,1  'EKRAN SİLİNDİ         
         Ayar_D=0
        gosub Zaman_Yaz
'           LOW TR
     endif
     return

                   
'***********Zaman Oku***********
ZAMAN_OKU:
         
         I2CRead RTC_DTA, RTC_CLK,$D0,$00,[SN,DAK,SAAT,GUN,AYGUN,AY,YIL,MEM]
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AYGUN:GOSUB CEVIR:AYGUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         return
ZAMAN_YAZ:
          MEM=SN:GOSUB TERSCEVIR:SN=SAYI
          MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
          MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
          MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
          MEM=AYGUN:GOSUB TERSCEVIR:AYGUN=SAYI
          MEM=AY:GOSUB TERSCEVIR:AY=SAYI
          MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI
          MEM=$10:SAAT.7=1                          'Sabah saat 07 de geceden, gündüz uygulamasına geçiyor.
          I2CWrite RTC_DTA, RTC_CLK,$D0,$00,[SN,DAK,SAAT,GUN,AYGUN,AY,YIL,MEM]
          return
'***********Çevir***********               
CEVIR:
    ONLAR=MEM & %01110000
    ONLAR=ONLAR>>4
    BIRLER=MEM & %00001111
    SAYI=ONLAR*10+BIRLER
RETUR

'********* ROLE PROGRAMI **********
KOMBI1:
          IF SAAT>7 THEN GUNDUZ
          IF SAAT<7 THEN GECE
         
GUNDUZ:
     IF ISI<GUNSIC THEN       ' gündüz kombi ayarı
     HIGH KOMBI
     HIGH LED
     ENDIF
     
     IF ISI>GUNSIC THEN
     LOW KOMBI
     LOW LED
     ENDIF
     
     IF ISI=GUNSIC AND FLOAT>4 THEN  'Ayarlanan sıcaklığı, 0.5 derece geçince,kombi devreden çıkıyor.
     LOW KOMBI
      LOW LED
     ENDIF
     
'     IF KOMBI=0 THEN
'     LCDOUT $FE,$E2,"KAPALI"
'     ENDIF
     
'     IF KOMBI=1 THEN
'     LCDOUT $FE,$E2,"ACIK  "
'     ENDIF
     RETURN

GECE:
     IF ISI<GECSIC THEN       ' gece kombi AYARI
     HIGH KOMBI
     HIGH LED
     ENDIF
     
     IF ISI>GECSIC THEN
     LOW KOMBI
     LOW LED
     ENDIF
     
     IF ISI=GECSIC AND FLOAT>4 THEN    ' Ayarlanan sıcaklığı, 0.5 derece geçince,kombi devreden çıkıyor.
     LOW KOMBI
      LOW LED
     ENDIF
     
     
     RETURN
'***********Kesme***********
return
DISABLE   
Kesme:
'    HIGH TR         
    if Ayar_D=0 then

    lcdout $FE,1,  "ZAMAN & SICAKLIK"
    lcdout $FE,$C0,"    AYARLARI      "
    pause 2000
    lcdout $FE,1
    endif
    pause 50
    Ayar_D=1:PAUSE 40
    Sayac=Sayac+1
    INTCON.1=0
Resume
Enable
  pause 100
'  LOW TR               
'************** KISAYOL SICAKLIK AYARI ****************************** 
 
  GDZ:              'Buton -  ve + ile kısayoldan(menüye girmeden),sadece Gündüz, sıcaklık azaltıp,çoğaltma.
         
IF SAAT>6 AND Buton3=0 Then GUNSIC=GUNSIC+1
IF SAAT>6 AND Buton2=0 Then GUNSIC=GUNSIC-1
WRITE $01,GUNSIC


     
Return
 
  GCE:          'Buton -  ve + ile kısayoldan(menüye girmeden),sadece Gece, sıcaklık azaltıp,çoğaltma.
         
IF SAAT<7 AND Buton3=0 Then GECSIC=GECSIC+1
IF SAAT<7 AND Buton2=0 Then GECSIC=GECSIC-1
  WRITE $02,GECSIC


         
Return
'************** VERİCİ ******************************
VERICI110:
           
IF KOMBI=1 THEN VERI=120
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
PAUSE 50
RETURN

VERICI0:
           
IF KOMBI=0 THEN VERI=0
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
SerOUT2 GIRIS,396,["O","S","M",VERI]
PAUSE 50
RETURN

end

MS_59

ete hocanın dediği gibi eproma sürekli kayıt yapıyor
gdz ve  gce etiketini aşağıdaki gibi değiştir düzelir
GDZ:              'Buton -  ve + ile kısayoldan(menüye girmeden),sadece Gündüz, sıcaklık azaltıp,çoğaltma.
         
IF SAAT>6 AND Buton3=0 Then
   GUNSIC=GUNSIC+1
   WRITE $01,GUNSIC
endif
IF SAAT>6 AND Buton2=0 Then
   GUNSIC=GUNSIC-1
   WRITE $01,GUNSIC
endif
Return
 
GCE:          'Buton -  ve + ile kısayoldan(menüye girmeden),sadece Gece, sıcaklık azaltıp,çoğaltma.
         
IF SAAT<7 AND Buton3=0 Then
   GECSIC=GECSIC+1
   WRITE $02,GECSIC
   endif
IF SAAT<7 AND Buton2=0 Then
   GECSIC=GECSIC-1
  WRITE $02,GECSIC
  endif       
Return
mehmet

Evren Kılıç

Butonlara basildiginda eproma kayit yapiliyor sadece bu sürekli bir durum degilki sürekli kayıt yapilsin, birde sizin verdiğiniz kodlar ile programda yazili olan kodlar tamamen ayni işi yapiyormu aralarındaki fark nedir?

MS_59

senin yazdığın şekilde buton kontrolüne bakılmaksızın kayıt yapar
benim yazdığımda da sadece butona basıldığı sürece kayıt yapar farkı bu
dikkat ettiysen ben kayıt işini IF şartı doğru olduğu sürece yaptım
senin programın gnz veya gce'ye ne zaman dallansa kayıt yapar
mehmet

Evren Kılıç

Anladim benim yazdigimda kayit satiri İF sorgulamasinin dişinda kaldigi için program orasindan her geçildiğinde kayit yapip geçiyor galiba sorun bu olabilir gerçektende. Teşekkürler.

Evren Kılıç

Peki bu hasar veya omur tükenmesi epromun tamamindami oluşur veya sürekli yazilan adrestemi olur simdi elimde   bir kaç adet bu şekilde işlemci var 1 ve 2 adresleri bu şekilde davranan bu işlemcilerin 3-4 uncu adreslerini kullanabilir miyim acaba?

MS_59

evet aynen öyle birde kayıt yaparken 10 ms gecikme koyman gerek
örnek:

WRITE $01,GUNSIC  pause 10
WRITE $02,GECSIC  pause 10
mehmet

MS_59

Alıntı yapılan: evrenk - 01 Nisan 2014, 23:20:01
Peki bu hasar veya omur tükenmesi epromun tamamindami oluşur veya sürekli yazilan adrestemi olur simdi elimde   bir kaç adet bu şekilde işlemci var 1 ve 2 adresleri bu şekilde davranan bu işlemcilerin 3-4 uncu adreslerini kullanabilir miyim acaba?
valla bunu bilemiyorum ete hocaya sormak lazım
mehmet

ete

Genelde sürekli yazılan adresin bozulması gerekir. Diğerlerini denersen anlarsın.
Ete

Powered by EzPortal