ATMEGA16 nın dahili EEPROM UNU KULLANMA

Başlatan alikilavuz, 09 Aralık 2011, 15:27:47

alikilavuz

Merhaba,

Bildiğiniz üzere ATMEGA16'nın 512 Byte EEPROM u var. AvrLibC nin eeprom_write_byte() ve eeprom_read_byte() fonksiyonları mevcut. Ama benim sorum şöyle. ATMEGA16 nın 300. EEPROM adresine mesela 0x0A verisini nasıl yazabilirim?

Aşağıdaki kodu denedim ancak 0. adreste 0x00 yazacağı yerde 0x01 yazıyor.


   uint16_t counter;
   uint8_t dat;

   while(1)
   {
   
      for(counter=0;counter<512;counter++)
      {
         eeprom_write_word((uint16_t*)counter,counter);
            
      }
      
      for(counter=0;counter<512;counter++)
      {
         dat = eeprom_read_word((uint16_t*)counter);
         rprintfu08(dat);
         _delay_ms(10);
      
      }    // sonuç 0x01,0x01,0x02.....0xFF,0x00,0x01,0x02...0xFF   şeklinde oluyor.   İlk byte 0x00 olması gerekirken 0x01 oluyor
       }

    Acaba problem nedir?

  Saygılarla,



alikilavuz

Merhaba ,


Şimdi bir diğer problemde EEPROM hafızasının silinmesi.  Yukarıdaki kodda önce yazıp sonra okuyordum. Sonra yazma kısmını silip sadece okuma kısmını bırakıp programladığımda bütün datalar 0xFF şeklinde dönüyor.

EEPROM siliniyor mu? Bu nasıl oluyor?

Usbasp programlayıcısını kullanıyorum.

Saygılarla,

Kabil ATICI

Yazmak için veri kağıtlarında yeterli gibi görünüyor.
EEPROM_write (300, 0x0a);

okumak için
data=EEPROM_read(300);

Aslında tümden veri alanını yazmaya çalışmak yerine doğrudan belirli bir adres üzerinde çalış.
Buradan istediğini alırsan sıralı adres aralığını kullanırsın.

C konusunda bir şey diyemem ama assemler'de yardımcı olmam daha kolay olur.
veri kağıdındaki assembler kodunun çalışıtğını biliyorum, kullandım.
ambar7

Kabil ATICI

Programlama işleminden sonraflash bellek ile birlikte eeprom hafızası da silinir. Bunu önlemek için işlemci sigortalarından EESAVE sigortasını programlamanız gerekir.  bu sigorta programsız gelir, programlanırsa, bir sonraki işlemci programlama esnasında işlemci eepromundaki veriler silinmez.
ambar7

alikilavuz

Merhaba ,

ambar7 cevabınız için çok teşekkür ederim. EESAVE fuse bitini değiştirince sorunum çözüldü. Okuma işlemini de dediğiniz gibi direk byte olarak belirli bir adresten okuyacağım.

Saygılarla,