Uzun vadede çalışan cihazdaki eeprom sorunu.

Başlatan Mucit23, 03 Eylül 2016, 14:18:37

Mucit23

Selamlar

3-4 sene önce bir oyun salonu için tasarlamış olduğum bir cihaz var. Belki oyun salonlarında görmüşsünüzdür gidip kasadan RFID kartlara kredi yükletip sonra bu kartları oyun makinelerindeki okuyuculara okutarak makineleri çalıştırırsınız. Yapılan iş tam olarak bu. Ben yapmış olduğum yükleyici terminalde bazen eepromla ilgili sıkıntılar yaşıyorum.

Cihazda kullanıcının yüklediği kredi sayısı eepromdaki çeşitli hafıza bölgelerine yükleniyor. Bunun yanı sıra sistemde çeşitli düzeyde kullanıcı şifreleri var. Ve bunların hepsi eepromda tutuluyor.

Örneğin bir müşteri geldi ve kartına 10 kredi yükletti. Bu kredi rfıd kartın içine yazılırken aynı zamanda eeproma yazılıyor. Epproma yazılması çok önemli çünkü günün sonunda her yükleyici cihazda o gün içerisinde kaç kredi yüklenmişse düzgün bir şekilde kayıt altında tutulması gerekiyor.

Bazen ne oluyosa bilmiyorum ya okunurken yada yazılırken bir aksaklık oluşuyor ve eepomun ilgili bölgesine yazılmaması gereken değerler yazılıyor. Veya Sistem şifreleri karışıyor. Sistem bu durumdayken programlayıcı ile eepromu okuduğumda bozulan bölgelerin FF olduğunu görüyorum.

Bu durum %1 civarında ya gerçekleşiyor yada gerçekleşmiyor. Ama bu olasılık bile problem yaratıyor.

Kredi sayaçlarının yüklendiği bölgelere her kredi yüklenişinde yazılma yapılıyor. Bu bölgelerin belki yazma ömrü tamamlanmıştır diye düşündüm bir an ama Sistem şifreleri nadiren değişiyor. Fakat bu bölgelerde de bozulmalar yaşanıyor.

Bu tür sorunların önüne geçmek için yazılımda güncellemeler yapmam lazım. Bir takım önlemler almam gerekiyor. Bu konuda ne önerirsiniz?  Benim aklıma ilk gelen eeprom adreslerini değiştirme, Yani kullanılmayan adresleri kullanmak gibi.

kantirici

Herhalde dahili eeprom kullanıyorsun. Belki dikkat etmişsindir ama eeproma veri yazmadan önce bir takım işlemler yapmak gerekiyor.

Kesmeler kapatılır, yazma izni kontrol edilir. Daha sonra veri yazılır ve yazım işlemi bitmiş mi diye (ilgili birim meşgul mu) ilgili flag kontrol edilir. İşlem bitince  yazma izni kaldırılır.

Diğer husus ise yazma ömrü.


z

Yazma işleminden sonra doğru yazıldımı diye kontrol et.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

F493

Selam Mucit,
 
  Genelde voltaj değişimi veya düşük voltaj anında yazma işlemi sırasında yanlış veri yazılma sorunu oluşabiliyor. Bu da dikkate alınmalı.

Yazılım noktasında, ben şöyle yapıyorum;

  EEpromWriteAndCheck adında bir fonksiyon yazıp verinin doğru yazılıp yazılmadığını kontrol ediyorum. 
   1- Veriyi yaz, yazılmış olan veriyi temp bir değişkende sakla.
   2- Yazılan veriyi aynı adresten tekrar oku
   3- Az önce yazılan veri ile kıyasla,
   
    Eğer burada hata oluyor ise veri yanlış yazılmıştır demektir.

   Aynı zamanda yazılacak her bir veri için şu yapıyı kullanıyorum,

union _DIL_SECIMI
{
  uint8_t DilSecimiByteArray[ONE_BYTE * 2];
  struct {
    uint8_t DilSecimi;
    uint8_t DilSecimi_Inverted;
  };
};
extern union _DIL_SECIMI DIL_SECIMI;



Burada örneğin menüde bir yerde , DIL_SECIMI.DilSecimi = TURKCE; yaptığımda
yazma işleminden önce,
DIL_SECIMI.DilSecimi_Inverted = ~DIL_SECIMI.DilSecimi;
bu işlemi yapıyorum. Nedeni hatta yazma esnasında bir sorun olursa yani yazılan veri bozulursa okuma yaptığımda bu iki verinin yanlış olma ihtimali var.

Okuma işlemini yaparken DIL_SECIMI.DilSecimi verisi ile   DIL_SECIMI.DilSecimi_Inverted verisinin bit değilini alıp kontrol ediyorum

if (~DIL_SECIMI.DilSecimi == DIL_SECIMI.DilSecimi_Inverted)
{
    // okunan veri doğru.
}
else
{
  // Okunan veri yanlış. Hata ..
}



Esen kalın.

X-Fi

Eepromdaki verilerin sonuna checksum ekleyin, her erişimde bu değeri tekrar hesaplatıp güncelleyin kontrol ettiğinizde tutmuyor ise çeşitli sebeplerden verileriniz yanlış yazılmış ya da fiziksek olarak bozulmuş demektir bu durumda eeprom verilerini default değerleri ile veya başka yedek aldıysanız onlar ile değiştirebilirsiniz.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Mucit23

Ozaman lar c bilmiyordum ve programı pic basic ile yazmıştım.  Program bayagi uzun 18f452 nin hafizasi %95 dolu. Belki programı 18f46k22 ye uydursam daha iyi olur.

write and check işlemini uygulayabilirim. Checksum ekleme işi nasıl olacak? X-fi bir örnek verebilirmisin?

JOKERAS

Bence Dandik Eepromdan kaynaklı bir sorun.
Statik Elektriği de unutmamak gerek.Bu çok önemli!
Statik Elektrik Eeprom veya Flashların can düşmanıdır.
Bu tür belleklere veri yazılırken içlerinde bulunan BootStrap devresi ile kendi besleme voltajını
yazma esnasında yükselterek yazma işlemini başlatıyor.
Doğal olarak harici veya dahili bir voltaj sıçraması dalgalanması yazılacak olan veriyi bozuyor.

Eepromların Yazma ömrü milyonlarla ifade ediliyor.Bu sayıya ulaşmak için ne kadar çok yazılırsa yazılsın Yıllar gerekki bozulsun.
Bir de şöyle bir yöntem kullanılabilir.Eepromlar Page Page yazılıyor.Hep aynı Page'i değilde her yazmada veya belli sayıdaki yazma işleminden sonra
Page'i değiştirmek.Yani Eepromun Tüm Sayfalarını dönüşümsel olarak kullanmak gibi.
Ama  başta söylediğim gibi bu sorun Eepromun  Kalitesinden kaynaklıdır.

Eeprom Yazma rutininde Global Kesmeler zaten otomatik kapatılır.Yani, Eeprom abi ben sana veri yazacağım dediğimizde
o bize Global Kesmeleri Kapattınmı da  geldin burada artislik yapıyorsun der.
Yazma Rutinin ilk kodu GİE = 0; Dır zaten.



X-Fi

unsigned char CheckSum_Calculation(unsigned char CheckSumLength, unsigned char *CheckSumData)
{
    unsigned char CheckSum = 1;
	
    do
    {
        CheckSum += *CheckSumData;
        CheckSumData++;
    }
    while(0 < --CheckSumLength);
		
    return CheckSum;
}


Yukarıdaki gibi 8 bit checksum hesaplayabilirsin. Aynı fonksiyonu doğrulama yapacağın zamanda kullanıp sonuçları karşılaştıracaksın.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Mucit23

Write and check işlemini deneyeceğim.
Checksum işide mantıklı ama checksum için ayrıca bir eeprom adresi tanımlamak gerekmezmi?

Ornegin 99 milyon kapasiteli bir sayacım var ve bu sayac hafizada 4 byte yer kaplıyor. Checksum için ekstradan bir byte eeprom da yer acmam gerekiyor anladigim kadarıyla

X-Fi

Alıntı yapılan: Mucit23 - 03 Eylül 2016, 22:04:54
Checksum işide mantıklı ama checksum için ayrıca bir eeprom adresi tanımlamak gerekmezmi?

Evet doğru hocam cheksum genelde hesaplanan bloğun sonuna yazılır, bir byte yer kaplar. Veri alışverişini de bloklar halinde yapmanız gerekir.

kolay gelsin.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mehmet

İlave olarak "BrownOut" sigortasını kullanmayı
ihmal etmeyin.

Ben duruma göre en yüksek değeri seçiyorum...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

tekosis

@Mucit23 hocam bir de çok fazla eeprom bellek ihtiyacınız yoksa ayni veriyi 5 farklı eeprom hafızasına yazın. Sonra bilgiyi okumanız gerektiğinde beșinide okuyun eğer bir tanesinde hata varsa geri kalan 4 tanesini göz önünde bulundurarak doğru veriyi yakalamış olursunuz. Tabi bu tüm 5 baytı yazarken yine write and check işlemine tabi tutarsanız taş gibi bir sisteminiz olur.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

elektronart

Hafıza bölgelerini sürekli kullanmak da sorun yaratıyor olabilir. Veri tutulmasını farklı adreslere yayabilirsiniz. Örneğin 4byte veri tutuyorsanız bunu 4+1 checksum + 1 index ile tutup 2 bölgede veya duruma göre yer müsaitse 4 veya daha fazla bölgede tutarak döngüsel olarak adresi bir arttırarak tutabilirisiniz. Böylece son bilgiyi elektrik kesintisi veya başka bir sebeple yazamamış bile olsanız en fazla 1 veri kaybetmiş olursunuz. Yeniden başladığında en büyük indexten devam eder.
Bu arada merak ettim. Bu kartlardaki kopyalanma sorununu nasıl hallediyorsunuz. En fazla 2 saatlik bir uğraş sonunda oyun makinesi kartlarının çoğu kırılıyor. Ben bile 2 farklı yeri denedim 2si de kolaylıkla kırıldı. Benim kırdıklarımda hiç bir diversifikasyon veya şifreli imza vs yoktu. Tüm işlemler tek sektörde bitirilmiş ve sadece sektör anahtarı ile korunuyor. Bir kart kırıldığında tüm sistem gidiyor. Bu durum kırmayı daha da kolaylaştırıyor. Hele bir de telefon MCT destekliyorsa of ki of.
Açık Elektronik