Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: alikilavuz - 09 Aralık 2011, 15:27:47

Başlık: ATMEGA16 nın dahili EEPROM UNU KULLANMA
Gönderen: alikilavuz - 09 Aralık 2011, 15:27:47
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,


Başlık: Ynt: ATMEGA16 nın dahili EEPROM UNU KULLANMA
Gönderen: alikilavuz - 09 Aralık 2011, 15:43:44
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,
Başlık: Ynt: ATMEGA16 nın dahili EEPROM UNU KULLANMA
Gönderen: Kabil ATICI - 09 Aralık 2011, 16:00:41
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.
Başlık: Ynt: ATMEGA16 nın dahili EEPROM UNU KULLANMA
Gönderen: Kabil ATICI - 09 Aralık 2011, 16:07:12
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.
Başlık: Ynt: ATMEGA16 nın dahili EEPROM UNU KULLANMA
Gönderen: alikilavuz - 09 Aralık 2011, 16:25:48
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,