EEPROM neden koymamışlar ?

Başlatan muhittin_kaplan, 24 Ocak 2013, 17:37:18

Mucit23

Klein Hocam yazma ve okuma için şöyle iki fonksiyon oluşturdum.

void Save_Parameters(u8 addr, u16 oldvalue, u16 newvalue){
   if (newvalue!=oldvalue)
   {
     EE_WriteVariable(VirtAddVarTab[addr],newvalue);
  }
}

u16 Read_Parameters(u8 addr){
     u16 data;
    EE_ReadVariable(VirtAddVarTab[addr],&data);
   return data;
}

Yazmada problem yok fakat okurken adresi değiştirsem bile hep aynı datayı okuyorum. Örneğin 0. adrese bir data yazdıysam 1. adresten data okurken hep 0. adresteki data geliyor. 2. adresten okusam yine 0. adrese yazdığım datayı okuyorum. Yaptığım hata nedir?

muhittin_kaplan

#91
VirtAddVarTab de ne var mucit

mesaj birleştirme:: 12 Şubat 2013, 11:09:27

birde değişken sayısını kontrol et.

Mucit23

Hocam anlam veremedim ama şimdi çalışıyor. Yani şöyle çalışıyor. Boş adreslere daha önce yazmadan okuma yapınca bir önceki adresteki değerler geliyor. Ama mesela okuyacağım adrese daha önce birşey yazmışsam sorun olmuyor. Read_Parameters Fonksiyonu eepromun ilgili adresine daha önce yazdığım değerle birlikte geri geliyor.

const  uint16_t VirtAddVarTab[] = {   //Sanal Adres Tablosu
    0x5500, 0x5501, 0x5502, 0x5503, 0x5504, 0x5505, 0x5506, 0x5507,
    0x5508, 0x5509, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x550F,
	  0x5510, 0x5511, 0x5512, 0x5513, 0x5514, 0x5515, 0x5516, 0x5517,
	  0x5518, 0x5519, 0x551A, 0x551B, 0x551C, 0x551D, 0x551E, 0x551F}


Bahsettiğiniz yerde sanal adres tablom var.

muhittin_kaplan

 0x5500, 0x5501 ikilisi için deneme yap. Biliyorsundur

5500 a yazdığında 0x08010000 adresine (Burası başlangıç olduğunu varsayıyorum)
0x5500Deger1
0x5501Deger2

seklinde yazıyor ve silmiyor.taki 0x400 adresi dolana kadar (1KB) sen bu arada okumaya çalıştığında Sondan başlayarak istediğin adresi bulup değeri sana gönderiyor. 1KB dan sonra 2.KB ye geçip 1. yi siliyor.
Bence lokalize ederek git.

Klein

Son durum nedir?

NumbOfVar değeri nedir?  Bu tanım kaç farklı parametreniz varsa o kadar olmalı. İlk satfaya yazma okuma sırasında bir önemi yok. Ancak son kaydedilenler yeni sayfaya taşınırken önem kazanıyor.

Mucit23

#95
Hocam bu haliyle gidiyor program ama adreslemeye hakim olamadım.

Benim yazacak en fazla 50-60 byte datam var. Bazı parametreleri bu şekilde tutuyorum.

32 adet datam olduğu için NumbOfVar  değeini   0x20 yaptım.

Kullandığım işlemci STM32f107VC olduğu için High density (HD) sınıfına giriyor. Flash Hafızası 256kb.


upload pics

Datashette şöyle bir tablo var.

Burada Her bir sayfa 2kb olduğunu görüyorum. Biz bu sayfalara yazıyoruz.

Şimdi yazma yapılacağı zaman bu sayfaya yazma yapılacağı zaman her seferinde bir sonraki adrese 32 bit olarak yazılıyor, klein hocanın anlattığından anladığım kadarıyla ilk 16 bit datayı temsil eden sanal adresimiz, son 16 bit ise saklanacak olan datamızı temsil ediyor.

Okuma yapılacağı zaman ise sayfa olduğu baştan sonra taranıyor tüm flash okunuyor. Bizim sanal adresle uyuşan bir data bulursa onu alıp geri dönüyor.

Yazma ve okuma bu şekilde işliyor sanırım.

Bizim tanımladığımız  EEPROM_START_ADDRESS    ((uint32_t)0x08030000) değerine aklım takılıyor. Bizim burada verdiğimiz değer kadar boşluk bırakılıp sonramı program yazılmaya başlanıyor. Bu değer tam olarak neyi temsil ediyor?

muhittin_kaplan

#96
Mucit page i değiştirdin mi

ben1kb kullandığımdan orayı ayarlamıştım.
/* Exported constants --------------------------------------------------------*/
#define PAGE_SIZE  (uint16_t)0x800  /* Page size = 2KByte */
olmalı seninki

Alıntı YapBizim tanımladığımız  EEPROM_START_ADDRESS    ((uint32_t)0x08030000) değerine aklım takılıyor. Bizim burada verdiğimiz değer kadar boşluk bırakılıp sonramı program yazılmaya başlanıyor. Bu değer tam olarak neyi temsil ediyor?

yukardaki adres program belliğinin "EEPROM" Olarak kullanılacak yerin başlangıç adresi. Page3 ün başlangıç adresini ver (programın uzun değilse)
(sonra Page255 ile Page 254 ü kullan. Page 254 ün adresi 0x0807F000 olarak ata)

Klein

#97
Okuma tam tersi şekilde , sondan başlayıp başa doğru taranıyor.
Yazarken baştan sona doğru. Okurken sonadn başa doğru.   Aynı verinin en son yazılmış halini bulmak için sondan okunuyor.

EEPROM_START_ADDRESS    ((uint32_t)0x08030000)  Bu  eeprom verisinin başlayacağı adres.
Program 0x8000000 adresinden başlıyor.   

Sen son 2 sayfayı kullanacaksın. bunun için başlangıç adresini 0x803F000 vermen gerek.

mesaj birleştirme:: 12 Şubat 2013, 12:17:17

@muhittin

#if defined (STM32F10X_LD) || defined (STM32F10X_MD)
  #define PAGE_SIZE  (uint16_t)0x400  /* Page size = 1KByte */
#elif defined (STM32F10X_HD) || defined (STM32F10X_CL)
  #define PAGE_SIZE  (uint16_t)0x800  /* Page size = 2KByte */
#endif

Derleyici opsiyonlasına eklediğimiz  "STM32F10X_HD" tanımı, sayfa ayarı içindi zaten.

Mucit23

Anladım hocam.

Birde daha önce yazma yapmadığım bir adresten okuma yaptığım zaman 127 değeri geliyor. Normalde 0 gelmesi gerekmezmi?

muhittin_kaplan

#99
yok o adreste FF var. Yani Boşsa FF bulunuyor.

mesaj birleştirme:: 12 Şubat 2013, 12:26:20

Alıntı YapDerleyici opsiyonlasına eklediğimiz  "STM32F10X_HD" tanımı, sayfa ayarı içindi zaten.
Hocam Benim derleyici burada Hata verdi. Bende Doğrudan Tanımladım. Yukarda Tanımlamayı Ekletmişsiniz Doğrudur.

Klein

#100
Okurken aynı zamanda fonksiyonun geri dönüş değerine bakman gerek. Eğer geriye 0 dönerse adres bulundu demek. 1 dönerse daha önce o adres kaydedilmemiş demek.

Eğer sanal adresin bulunanamamışsa  Data değişkenine hiç elleşmez. Muhtamelen aldığın değer Data değişkeninin önceki içeriği.

mesaj birleştirme:: 12 Şubat 2013, 12:30:04

Alıntı yapılan: muhittin_kaplan - 12 Şubat 2013, 12:25:10
yok o adreste FF var. Yani Boşsa FF bulunuyor.

mesaj birleştirme:: 12 Şubat 2013, 12:26:20
Hocam Benim derleyici burada Hata verdi. Bende Doğrudan Tanımladım. Yukarda Tanımlamayı Ekletmişsiniz Doğrudur.

Coocox kullanıyorsunsanırım.  Muhtemelen çip seçimi yaptığında kendisi ekledi. Sen ikinci kez tanım yapmaya kalktığın için hata verdi.

mesaj birleştirme:: 12 Şubat 2013, 12:32:33


Ayrıca:
Klasik eeprom okuma alışkanlıklarımızı değiştirmemiz gerektiğinden bahsetmiştim.  Eğer flash taranır ve sizin sanal adresiniz flash içinde bulunamazsa Data değişkeninize hiç bir şey yazılmaz. 
Okuma ve yazma yaparken Fonksiyon geri dönüş değerini muhakkak izleyin.

    if (AddressValue == VirtAddress)
    {
      /* Get content of Address-2 which is variable value */
      *Data = (*(__IO uint16_t*)(Address - 2));

      /* In case variable value is read, reset ReadStatus flag */
      ReadStatus = 0;

      break;
    }

Mucit23

#101
Hocam Yazma fonksiyonumu değiştirdim. Durum bilgisini geriye gönderiyorum

u8 Save_Parameters(u8 addr, u16 oldvalue, u16 newvalue){
   u8 status;
   if (newvalue!=oldvalue)
   {
     status=EE_WriteVariable(VirtAddVarTab[addr],newvalue);
  }
   return status;
}

u16 Read_Parameters(u8 addr){
     u16 data;
    EE_ReadVariable(VirtAddVarTab[addr],&data);
   return data;
}

Fakat okuma fonksiyonumda zaten data bilgisiyle geri geliyor. Aynı anda durum bilgisiyle birlikte datayı nasıl gönderirim?

Acaba okuma fonksiyonu içerisinde EE_Read fonksiyonun geri gönderdiği değere bakıp ona göre data değerine bir hata kodumu yükleyeyim? Aklıma bu geldi.

Klein

Okuma rutini bence gereksiz olmuş. 

"status=EE_ReadVariable(VirtAddVarTab[addr],&data);" fonksiyonunu kullanırsan, istediğin adreste veri bulunamadığında zaten değişkenine elleşmeyeceği için, değişkeninin değeri değişmez. 
Status bitine bakarak da veri bulunamayınca ne yapacağına karar verirsin.

İlla  bu şekilde veriyi geri dönüş değeri olarak almak istiyorum dersen;
0xFFFF ile dönersin.  Zaten eeprom da kullansan daha önce yazılmamış bir hücreden 0xFFFF alırsın. 

muhendisbey

Hocam birşey farkettim TI Stellaris Launchpad üzerindeki M4'te 2kb EEprom var.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

SpeedyX

Alıntı yapılan: muhittin_kaplan - 09 Şubat 2013, 11:43:17
int main(void)
{
  SystemInit();
  FLASH_Unlock();
  EE_Init();

  uint16_t deger;
  EE_WriteVariable(0x5501, 0x1235);
  EE_ReadVariable(0x5501,&deger);
  while (1);
}
Burada flash hep kilidi açık olarak mı kullanılıyor?

Bu örnek kod korumalı bir programda kullanılabilir mi?