Gönderen Konu: EEPROM'a Dizi Kaydetme  (Okunma sayısı 459 defa)

Çevrimdışı ugurer

  • Kıdemli
  • ****
  • İleti: 106
EEPROM'a Dizi Kaydetme
« : 03 Aralık 2016, 05:51:58 »
Merhabalar. Daha önce böyle bir çalışması olan var mı acaba aramızda. Normal değişkenleri eeproma yazabiliyorum bir sorun yok ama dizi kaydetmeyi bir türlü beceremedim.

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1766
Ynt: EEPROM'a Dizi Kaydetme
« Yanıtla #1 : 03 Aralık 2016, 07:46:28 »
Şu şekilde yapabilirsin.
Kod: [Seç]
#define LEN_OF_ARRAY   (8)

uint8_t myArray[LEN_OF_ARRAY] =  {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

for (uint8_t i = 0; i < LEN_OF_ARRAY; i++)
   EEPROM_Write(i , myArray[i]);
EEPROM_Write(x, y) Burada X adres Y ise veri oluyor. Kendi fonksiyonuna göre düzenlersin.

Çevrimdışı ugurer

  • Kıdemli
  • ****
  • İleti: 106
Ynt: EEPROM'a Dizi Kaydetme
« Yanıtla #2 : 04 Aralık 2016, 01:53:42 »
@baran123 teşekkürler yorumunuz için
yazma:
Kod: [Seç]
for(i=0;i<RX_Wr_Index;i++)
        {
        klavye[i]=getchar();                             
        }                         
        k1=RX_Wr_Index;
        eeprom_write_word(133,k1);
        for(i=0;i<k1;i++)
        {
         eeprom_write_byte(100+i,klavye[i]);
        }
okuma:
Kod: [Seç]
k1=eeprom_read_word(133);
for(i=0;i<k1;i++)
{
klavye[i]=eeprom_read_byte(100+i);
}
k1 değişkenini dizide ki eleman kadar yer kaplaması için verdim. Eeprom ve Usartla alakalı sorular için bana ulaşabilirsiniz

Çevrimdışı JOKERAS

  • Emektar
  • *****
  • İleti: 623
Ynt: EEPROM'a Dizi Kaydetme
« Yanıtla #3 : 04 Aralık 2016, 03:13:35 »
Yazma...
Eepromun Page sınırı yokmu?64,128,256 gibi.

Okuma...
Eerprom veri size için k1 gibi bir değişkene ve bu değişkene değer atamak için ReadEerpom fonksiyonuna gerek yok.
Bu zamandan yer.

Kod: [Seç]
#define PAGE_SIZE 256

unsigned char Idx = PAGE_SIZE;

do{
     if( ReadEeprom(EeAdr+Idx) != 0xFF) {
         Klavye[Idx] =  ReadEeprom(EeAdr+Idx);
     }
     else {
         break;
     }
} while(--Idx);

Not:Moderatör arkadaşlar, Kod ekle  sekmesine yazdığımız kodlar Code tag uyumlu olamıyormu?
« Son Düzenleme: 04 Aralık 2016, 03:26:21 Gönderen: JOKERAS »

Çevrimdışı xoom

  • Emektar
  • *****
  • İleti: 792
Ynt: EEPROM'a Dizi Kaydetme
« Yanıtla #4 : 04 Aralık 2016, 03:53:04 »
Bu konu altından bir soruda ben sormak istiyorum. Mantık  hatama çözü m arıyorum.

Kod: [Seç]
Main(){
okunan=eepromokuyorum();

output_b(okunan);// ilgili ledler yanıyor

while(1)
{
if(buton){
output_b(YeniLedDurumlari)
epromayaziyorum(YeniLedDurumlari);}

}

Bu mantıkla kod yazdığımda eepromokuyorum(); fonnksiyonum ilk enerji verdiğimde b portuna rastgele ledleri yakıyor. İlk başta Tüm ledler sönük başlayamıyorum.
-Amacım:
Başlangıçta Çıkışlar Sıfır olsun.
Program çalışsın istenilen ledler yansın sönsün vs. ve Eproma kaydedilsin.
ENERJİ KESİYORUM
Şimdi Enerji kesilmeden önceki  Son Led Durumlar gelsin.
Bu algoritma yukarıdaki kod sıralamasıyla olmuyor. Sistem başlangıçta rastgele çıkış alıyor.
« Son Düzenleme: 04 Aralık 2016, 04:06:07 Gönderen: xoom »

Çevrimdışı JOKERAS

  • Emektar
  • *****
  • İleti: 623
Ynt: EEPROM'a Dizi Kaydetme
« Yanıtla #5 : 04 Aralık 2016, 04:32:26 »
Hangi adresleri okuyup yazıyorsunuz?
Fonksiyonlarda adresler yok.
Kod: [Seç]

void main(void) {

if(ReadEeprom(EeAdr) != 0xFF) { 
    EeVal = ReadEeprom(EeAdr);    //Eerom Değeri 0xFF'ten farklı,yani daha önce bir değer yüklenmiş.
 }else {
    WriteEeprom(EeAdr, 0x00);     //Eeprom ilk olarak boş olacağından durumunu bozmak gerekir.
    EeVal = ReadEeprom(EeAdr);    //Bozulmuş Durum okunuyor,sonuç 0x00 Ledler Sönük.
 }                                //Else Bloğu sadece bir kez çalışır.
 while(1) {
        if(Button == 0) {
           Debounce();            //Debunce kodu veya bir gecikme koyun.           
           WriteEeprom(EeAdr, YeniLedDurumu);
           EeVal = ReadEeprom(EeAdr);
        }
        OutPut(EeVal);
}
Şu şekilde bir deneyin.

Çevrimdışı xoom

  • Emektar
  • *****
  • İleti: 792
Ynt: EEPROM'a Dizi Kaydetme
« Yanıtla #6 : 04 Aralık 2016, 05:01:12 »
Hangi adresleri okuyup yazıyorsunuz?
Fonksiyonlarda adresler yok.
Kod: [Seç]

void main(void) {

if(ReadEeprom(EeAdr) != 0xFF) { 
    EeVal = ReadEeprom(EeAdr);    //Eerom Değeri 0xFF'ten farklı,yani daha önce bir değer yüklenmiş.
 }else {
    WriteEeprom(EeAdr, 0x00);     //Eeprom ilk olarak boş olacağından durumunu bozmak gerekir.
    EeVal = ReadEeprom(EeAdr);    //Bozulmuş Durum okunuyor,sonuç 0x00 Ledler Sönük.
 }                                //Else Bloğu sadece bir kez çalışır.
 while(1) {
        if(Button == 0) {
           Debounce();            //Debunce kodu veya bir gecikme koyun.           
           WriteEeprom(EeAdr, YeniLedDurumu);
           EeVal = ReadEeprom(EeAdr);
        }
        OutPut(EeVal);
}
Şu şekilde bir deneyin.

a3,b5,c1,d3 portlarındaki ledlerin durumlarının farklı butonlara basınca eepromon sırasıyla 0-1-2-3 Adreslerine kaydetmek ve enerji kesip tekrar geldiğinde son durumlarından devam etmesini sağlamak amacım.Ben algoritmamdaki mantığı açıklamak için kodları detaylı yazmamıştım. Sizin kodları uyarlamak gerek ccs ye