kalıcı hafıza yardım

Başlatan klorofil, 14 Nisan 2015, 16:29:42

klorofil

Arkadaşlar merhaba,

pic16f628a ile lcd ekran sürdüm fakat sorunum enerji kesildiğinde değişkendeki değerin silinmesi.Buna nasıl çözüm bulabilirim.Dahili yada harici hafıza olayı nasıl oluyor.

MrDarK

Klorofil;

CCS'de eeprom ile ilgili komutlara bak. Eeprom elektrik kesilse bile silinmez, istediğin zaman okuyup tekrar değerleri LCD'ye gönderebilirsin.
Picproje Eğitim Gönüllüleri ~ MrDarK

klorofil

ilginiz için çok teşekkür ediyorum.
Projem kumbara projesi.Delikten atılan paraları toplayıp sayac değişkeninin içinde saklıyorum.Bu değişken değerini 2x16 lcd ekranda gösteriyorum.Gerekli komutları kullanmaya calıştım fakat enerjiyi kesip açtığımda ekranda 133 tl okuyorum.Direk bu değer çıkıyor.

lcd_init();
delay_ms(10);

sayac=read_eeprom(1);





while(TRUE)
{

delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"%f TL  ",sayac);
write_eeprom(1,sayac);


komutları bu şekilde kullandım

MrDarK

İlk anda orada değer yüklüdür ondan, haliyle epromun o adresine 1 kereye mahsus 0 yüklersen sayaçta 0 olur.

Öncelikle şu kodu yükle birkaç saniye çalıştır.

Main Alt Programı

sayac = 0;
write_eeprom(1,sayac);

while(TRUE)
{

}


Bu kodu bir kere yükleyip çalıştır. Sonra kendi orjinal kodunu yükle sayının düzeldiğini göreceksin. Fakat eeprom'un 8 bit olduğunu ve 8 bite max 255 yazabileceğini unutma :) 255'den sonra yapacağın arttırma işlemi değişkeni 0'a çekecektir. Böyle olmasın istersen 2 byte şeklinde 16 bit kullanabilirsin. Önce bunu yapabilirsen onun yöntemini de konuşuruz.
Picproje Eğitim Gönüllüleri ~ MrDarK

X-Fi

Eeprom'a her 50ms de bir değilde sadece değişiklik olduğunda kaydedilse daha uzun ömürlü olur sanki.

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

MrDarK

Alıntı yapılan: X-Fi - 14 Nisan 2015, 18:03:31
Eeprom'a her 50ms de bir değilde sadece değişiklik olduğunda kaydedilse daha uzun ömürlü olur sanki.

?

Ben zaten orasının jeton atılma durumu olduğunu düşündüm :) Kodları parça pinçik koyduğu için arkadaş tahmin bile edilemiyor :) Sanarsın adam Nasa'ya kumbara yapıyor :P

Bu arada eeprom'a aynı değer yüklenme durumunda ömrünün tükenmediğini biliyordum , Mu acaba hocam :)
Picproje Eğitim Gönüllüleri ~ MrDarK

baran123

Alıntı YapSanarsın adam Nasa'ya kumbara yapıyor :P
:D

@klorofil tam programı eklerseniz çok daha iyi olur.Belki ilk kısımlarda bir hata olabilir.

X-Fi

Hocam zamanında eepromların ışık ile silinebildiğini düşünürsek, yazarken aynı değer mi geldi acaba diye bitsel işlem yapacağı ihtimalini zayıf buluyorum :)

Zor bi soru gerçekten kurcalamak lazım kaynak bulamadım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

MrDarK

#8
Benim bildiğim ömür hesabı yazılmak üzerine. Yani şöyle ki atıyorum elimizdeki sayı hex 0x80 olsun bunun eepromdaki binary karşılığı

" 10000000 " biz ona tekrar hex 80 yaz dediğimizde " 10000000 " yüklemeye çalışacak. Benim bildiğim 1'leri 0'a çevirirken ömründen yemiş oluyoruz. Tam tersi de olabilir

10 yıl çalışacak bi kaç ürün tasarımı yaptığımız için ömürle ilgili fazlaca araştırma yapıyoruz ve bana söylenen buydu. Mantıklı geldi kabul ettim siz öyle diyince şüpheye düşmüştüm :)
Picproje Eğitim Gönüllüleri ~ MrDarK

klorofil

#include <sayısal kumbara.h>
#use delay(clock=4000000)
#include <LCD.C>

 

 #fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, NOPUT, NOLVP





#define LCD_ENABLE_PIN  PIN_B0                                   
#define LCD_RS_PIN      PIN_B1                                 
#define LCD_DATA4       PIN_B4                                    
#define LCD_DATA5       PIN_B5                                    
#define LCD_DATA6       PIN_B6                                    
#define LCD_DATA7       PIN_B7 
#use fast_io(a)
#use fast_io(b)
#define use_portb_lcd TRUE






float sayac=0; 
float para1;
float para2;
float para3;
float para4;
float para5;
float para6;



void main()
{

   //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   //setup_timer_1(T1_DISABLED);
   //setup_timer_2(T2_DISABLED,0,1);
   //setup_ccp1(CCP_OFF);
   //setup_comparator(NC_NC_NC_NC);
   //setup_vref(FALSE);
   //enable_interrupts(INT_TIMER1);
   //enable_interrupts(GLOBAL);


para1=0.01;
para2=0.05;
para3=0.10;
para4=0.25;
para5=0.50;
para6=1.00;



set_tris_b(0b00001000);
output_b(0b00000000);
set_tris_a(0b11111);
output_a(0);





lcd_init();
delay_ms(10);

sayac=read_eeprom(1);





while(TRUE)
{






if (input(pin_a0))
{
delay_ms(100);
sayac=sayac+para2; //5 kuruş arttır
}


if (input(pin_a1))
{
delay_ms(100);
sayac=sayac+para3; // 10 kuşur arttır
}


if (input(pin_a4))
{
delay_ms(100);
sayac=sayac+para4; //25 kuruş arttır
}


if (input(pin_a3))
{
delay_ms(100);
sayac=sayac+para5; //50 kuruş arttır
}


if (input(pin_a2))
{
delay_ms(100);
sayac=sayac+para6; //1 lira arttır
}

if (input(pin_b3))
{
sayac=0; // sıfırla
}

delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"%f TL  ",sayac);
write_eeprom(1,sayac);

delay_ms(100);
lcd_gotoxy(1,1);
printf(lcd_putc,"TOPLAM PARA");









      
      

}

}

klorofil

art niyetten dolayı falan tamamını koymamazlık yapmadım.Yanlış anlaşılma olmuş :)
programın tamamı bu şekilde

mehmet

İşlemciler pek akıllı cihazlar değillerdir, hala taş
devrinden kalma bitsel işlemler yapmaktadırlar.

E2promların her hücresi ayrı ayrı yaklaşık
1.000.000 kez yazma ömrüne sahip oldukları
üreticileri tarafından açıklanmaktadırlar.
Aynı hücreye her yazma işlemi -aynı değer yazılsa bile-
ömründen bir can almaktadır.

Bu nedenle mecbur olmadıkça bu alanlar içerisinde
fazlaca değişiklik yapmaktan kaçınmak gereklidir.

Eğer yazma ömrü tamamlanırsa genelde; en son
yazılan değer artık o hücrede kalıcı olmuştur. İlgili
hücre artık silinmez/yeniden yazılmaz.

Ancak yaz/boz tahtasına benzer bir yapıya ihtiyacımız
varsa; bu işlere uygun donanımsal değişiklikler yapmamız
gerekmektedir. (SD kart, flash hafızalı mcu, ya da
enerji kesildiğini anlayıp son değeri e2eproma yazdırmak, vs.)
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

MrDarK

mehmet hocam;

Eminim tecrübeleriniz dahilinde söylüyorsunuz bunları, fakat benimde söylediklerinizi değerlendirip kesin olarak kendimi ifade edebilmek için bunun teknik yazısını okumamız lazım. Acaba söylediklerinizi doğrulayacak bir kaynak var mı ?

Not : Kendi söylediklerimi doğrulayacak bir kaynak bilmiyorum bu arada :) Bknz : Benden önceki arkadaşların ifade ettikleri
Picproje Eğitim Gönüllüleri ~ MrDarK

mehmet

İstediğiniz bir mcu kataloğuna bakabilirsiniz. Mesela;
16F84(41202F.pdf) "page1" (pdf 3. sayfa) en altta:

"High Endurance Flash/EEPROM cell:
- 100,000 write Flash endurance
- 1,000,000 write EEPROM endurance
- Flash/Data EEPROM retention: > 40 years" yazmakta...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

klorofil

sayın mrdark sizin yazdığınızı denedim sürekli sıfıra çekiyor değeri.artış gösterir göstermez sıfıra çekiyor.orjinali yükledim yine aynı.eprom komutlarını sildim yine aynı.Nasıl düzelecek bu durum