Harici Eeprom Yazma ardından Okuma Hakkında.

Başlatan xoom, 08 Aralık 2013, 12:58:22

xoom

Arkadaşlar eeprom konusunda ilk defa çalışma yapacağım internette araştırdım ama tam istediğim bilgiye erişemedim. sizden yardım bekliyorum.

Elimde 72 Byte'lık dizi var.
int Dizi2[72]={0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33,
               0x33,0x33,0x33,0x3F,0x3F,0x33,0x33,0x33
};

Bu diziyi 24LC64 eepromuna nasıl kaydedebilirim ve daha sonra eepromdan nasıl okuyabilirim.

xoom

Ups. Bugünkü araştırmalarımlada çözemedim.

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

xoom

Kitabı var bende zaten belki cevabıda kitapta olabilir. ama ben anlamadım o yüzden temsili bir kod rica ediyorum.

olemiss

Yazılım Mühendisi, Çevirmen.

xoom

Yazdığınız programlar ve kitap bende var. ama kitaptaki bu bilgilerden anladığımla bahsettiğim diziyi eeproma halen daha nasıl kaydedip okuyacağımı anlamadım.
Lütfen bir diziyi eeproma kaydetmeye örnek verirseniz daha faydalı olacak..

olemiss

Alıntı yapılan: xoom - 09 Aralık 2013, 19:41:43
Yazdığınız programlar ve kitap bende var. ama kitaptaki bu bilgilerden anladığımla bahsettiğim diziyi eeproma halen daha nasıl kaydedip okuyacağımı anlamadım.
Lütfen bir diziyi eeproma kaydetmeye örnek verirseniz daha faydalı olacak..

Şu ana kadar herhangi bir datayı EEPROM'a başarılı bir şekilde yazdınız mı?  Evet ise o programı burada gösterebilir misiniz?
Yazılım Mühendisi, Çevirmen.

xoom

Alıntı YapArkadaşlar eeprom konusunda ilk defa çalışma yapacağım internette araştırdım ama tam istediğim bilgiye erişemedim. sizden yardım bekliyorum.
İlk mesajımda sorunuza cevap vermiştim.. Bugüne kadar eeproma ihtiyaç duymadım ama hep öğrenmek istemiştim. ve öğrenmek için çaba sarfedeceğim bir uğraş buldum. ve takıldım..

olemiss

#8
Alıntı yapılan: xoom - 09 Aralık 2013, 19:55:25
İlk mesajımda sorunuza cevap vermiştim.. Bugüne kadar eeproma ihtiyaç duymadım ama hep öğrenmek istemiştim. ve öğrenmek için çaba sarfedeceğim bir uğraş buldum. ve takıldım..
Anlıyorum, fakat soruyu sormamın nedeni, ısrarla dizi yazdırmak istemeniz.  Yerinizde olsam önce tek byte yazdırarak basit bir şekilde başlarım.  Yazdırdığınız söz konusu byte'ı sağlıklı bir şekilde geri okuyabilirseniz, bir sonraki aşamaya geçebilirsiniz.

Ayrıca kullanacağınız yazılım ve donanım sistemi hakkında hiç bilgi vermiyorsunuz.  Aklınızı okuyacak sistem üzerinde çalışmalarımız halen devam ediyor ama henüz sonuçlanmadı!  ;)

Edit: 24LC64 yazmışsınız şimdi gördüm.  Hangi MCU, hangi derleyici, hangi kütüphane?

mesaj birleştirme:: 09 Aralık 2013, 20:04:07

... ayrıca hangi arayüz? I2C?

mesaj birleştirme:: 09 Aralık 2013, 20:07:06

Soru CCS klasöründe açılmış... puzzle parçaları yavaş yavaş biraraya geliyor!  :-[
Yazılım Mühendisi, Çevirmen.

xoom

#9
Ben  tamamen yapmak istediğim şeyi burada yazmadım çünkü gerek görmedim. dediğim gibi eeproma veri yazıp okumak için birşeyler yapmak amacım.
madem sordunuz ne yapmak istediğimi 1-2 cümle ile söylemesem olmaz artık.
-Dotmatrixe "XOOM" kelimesini oluşturan Sütun bilgileri Yani yukaridaki gibi bir diziyi atmak ve MCU hafızasından yer açmak istiyorum..
Dotmatrixlere "XOOM" yazısını yazdırabiliyorum orda sıkıntım yok fakat XOOM'u oluşturan sutün bilgilerini Eepromdan çekmek istiyorum.
16f876'yı tercih ettim.(Herhangi bir sebebi yok)
I2C mi sorunuza gelince bilgim yok herhalde I2C olucak.
Gerekiyorsa İSİS şemamıda ekleyeyim.

olemiss

#10
Şu linkde çalışan (ve ödül kazanmış!) bir program var: http://www.ccsinfo.com/forum/viewtopic.php?t=22587

Programın comment'lerini Türkçe'ye çevirdim.
/* Harici EEPROM için I2C adresi. */

#define EEpromWrite      0b10100000
#define EEpromRead       0b10100001
#define ACK                     0
#define NoACK                 1

//------------------------------------
// EEPROM'dan oku.
//------------------------------------
int1 ReadExtMem(int16 Address, char *data, int16 length)
{
   int16 i, blockmask;
   BlockMask=0;
   if (address>0x7FFF)
      blockmask=0b00001000;
   disable_interrupts(global) // Interrupt'ları engelle.
   i2c_start();
   if (i2c_write(EEpromWrite | blockmask)||
       i2c_write(make8(Address, 1))||
       i2c_write(make8(Address, 0)))
   {
       enable_interrupts(global);
       return ERROR;
   }
   i2c_start(); // start'ı tekrarla.
   if (i2c_write(eePromRead | blockmask))
   {
       enable_interrupts(global);
       return ERROR;
   }
   for( i = 0; i < length-1 ; i++)
      *Data++ = i2c_read(ACK);  // En son byte hariç tüm verileri oku.
   *Data = i2c_read(NoACK);     // En son veri byte'ını oku (NoACK modu kullanarak).
   i2c_stop();
   enable_interrupts(global);
   return noError;
}

//------------------------------------
// EEPROM'a yaz.
//------------------------------------

int1 WriteExtMem(int16 Address, char *data, int16 length)
{
   int8 i, blockmask, waiting;
   BlockMask=0;
   if (address>0x7FFF)
      blockmask=0b00001000;
   if (length==0) return NoError;
   disable_interrupts(global);
   i2c_start();
   if (i2c_write(EEpromWrite | blockmask))
       return ERROR;
WriteStart:                                         //  GOTO kullanılmasını mazur gösteren bir durum!
   if (i2c_write(make8(Address, 1))||
       i2c_write(make8(Address, 0)))
   {
       enable_interrupts(global);
       return ERROR;
   }
   for (i=0; i<64 && length; i++, length--)          //  Her bir seferde maximum 64 byte yazılabilir.
   {
      if(i2c_Write(*Data++)==NoACK)
         {
            enable_interrupts(global);
            Return ERROR;
         }
   }
   i2c_stop();
   enable_interrupts(global)
   if (length)                                      // 64 byte yazdıktan sonra başka yazacak veri var mı?
   {
      Address=address+64;
      i2c_start();
      while (i2c_write(EEpromWrite | blockmask)==1)  //NoACK // yazma işleminin bitmesini bekle.
         i2c_start() ;
      disable_interrupts(global);
      goto WriteStart;
   }
   return noError;

}


Not: Çalışan bir LCD olması güzel, debugging için çok yararlı olur.
Yazılım Mühendisi, Çevirmen.

xoom

Hocam Sizce ben bu kodları anlayabilecek olsaydım bu soruyu burda sorarmıydım:)
Neyse Teşekkürler bir çözüm bulmaya çalışacağım.

olemiss

Alıntı yapılan: xoom - 09 Aralık 2013, 21:06:24
Sizce ben bu kodları anlayabilecek olsaydım bu soruyu burda sorarmıydım:)
Ben sizin bilgi seviyenizi bilmiyorum ki - önce dotmatrix'e yazı yazdırabiliyorum, sonra kodu anlamıyorum diyorsunuz.  Madem elinizde kitap var, önce kitaptaki adımlardan geçin.

Ayrıca kodun neresini anlamadınız, söyleyin anlatalım.
Yazılım Mühendisi, Çevirmen.

xoom

Kodun hiçbiryerini anlamadım..
-Arkadaşlar Elimde 
Kayit1[40]={0x00,0x01,0x02,0x03,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};

şeklinde 60 tane dizim var.. ( bu dizilerde 40 sutunlu dotmatrixe yazdırılacak olan 60 farklı yazının sütun bilgileri var )}
Bukadar veriyi MCU'nun hafızasına sığdırmam sanırım imkansız.(yada ben bilmiyorum)
ben bu 60 adet 40Bytelik Dizilerdeki veriyi 1 kereye mahsus EEPROM'a yazmak istiyorum..
ve daha sonra istediğimde
Kayit1[40]={}; istediğimde Kayit2[40]={}; adlı 60 diziden hangisini istersem onu okumak istiyorum.
------
Eprom hakkında hiçbilgim yok.. bu konuda sadece yol göstermek için fikirlerinize veya kod örneklerine ihtiyacım var..
Yol göstermek için yapmam gerekenleri  veya Temsili bir örnek C veya CCS kodu ile yardımınızı bekliyorum.
---


xoom

en azından bir yol haritası vermenizi istiyorum. ne yapmalıyım?