Atmel ATmega168 veya ATmega328 Eepromuna default değerleri nasıl yüklenir ?

Başlatan alexsi, 27 Kasım 2015, 18:55:56

alexsi

Arkadaşlar merhaba,
(Atmel ATmega168 veya ATmega328) serisi işlemcinin eepromuna ilk değer(default)  nasıl yüklenir ?
Teşekkürler. 
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

Kabil ATICI



İşlemci farketmeksizin, ATmega serilerinde
programı yazarken; eeprom ile ilgili satırlar oluşturursan,
kod derlendiğinde .eep uzantılı bir dosya oluşturacaktır. Bu eeprom dosyasıdır.

Atmel AVR studio ile;(dolayısı ile programlayıcısı ile)
programlayıcını devrene takıp etkinleştirdiğinde(gerekli işlemleri yaptığını varsayıyoruz), programlama penceresinde "Memories" sekmesi altında, "flash" ve "eeprom" başlıklı iki blok göreceksin." flash" olanı senin programın için ayrılmış olandır, Eeprom'da senin sorduğun sorunun cevabıdır.

Dosyanı sağdaki butondan seçiyorsun, ve "program" butonunu tıklıyorsun...


Ben başka programlayıcı veya studyo kullanıyorum diyorsan, onu kendi dokumanlarında araştırmalısın...

diğer çözüm ise bu işlemi yapacak basit bir kod yazmak... (çoğunlukla bir jumper ile karta ilk enerji verildiğinde aktif olacak küçük bir kod eklemek)
ambar7

alexsi

@Kabil ATICI  çok teşekkür ederim, ilk defa arduino uno kullanıyorum.Dolayısıyla Atmega işlemci. Pic işlemci de oldukça basit bir yöntem var. Örneğin
#if EEPROM_SIZE>0
__EEPROM_DATA( 0,10 ,0,10 , 0, 10, 0, 1);
__EEPROM_DATA( 255,206, 0,100, 0,0, 0,1);
#endif
yazıyorsunuz default değerleri eeproma yazıyor. Yada derleyici Mplab 'tan .mcp dosyasına yazdığınız değerleri yazdırabiliyorsunuz.
Acaba yukarıdaki gibi bir şey var mıdır ? (Default değerleri yazılım içerisine almak) Teşekkürler..
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

Kabil ATICI

arduino olayı farklı. Siz atmel işlemcisi olarak programladığınız zamanki durum ile arduino olarak programladığınız durum farklıdır. Arduino durumunda siz işlemciye bootloader üzerinden erişiyorsunuz. Atmel işlemcisi olarak erişiminiz ise ISP üzerinden olur. (geliştirme kartı gibi özel yapılar hariç) Bu yukarda anlattığım yapıdır.
arduino da C ile c++ karışımı bir yaklaşım vardır. O yüzden kütüphane yazmıyorsanız, c ile, kütüphane için c++ yaklaşımı ile kodluyorsunuz.

Atmel işlemcilere kod yazıyorum Atmel AVR studio ile, ama arduino konusunda yeni sayılırım.

yinede kendin kod oluşturmak istersen

başlıkta
#include <EEPROM.h>

ile eeprom programa dahil edebilirsin.

  int address = 0;
  byte value;
  //eeprom okuma;
  // EEPROM'dan geçerli adresten bir bayt okur
  value = EEPROM.read(address);

  //EEPROM'da geçerli adrese bir bayt yazar.
  EEPROM.write(address, value);


ile eeproma erişebilirsin.
oluşturduğun bir diziyi istediğin eeprom adreslerine istediğin veriyi atayabilirsin...

Biraz daha araştırabilirsin, sorduğun  şekilde bir yapı olabilir.

Sizin söylediğini pic ile ilgili durum derleyicinin özelliğidir.
ambar7

alexsi

  @Kabil ATICI  teşekkür ederim. Arduino derleyicide sanırım böyle birşey yok. Yada varsa ben bulamadım. Neyse saol hocam.
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

Kabil ATICI

arduino'da  normal kodlarda çalışmaktadır.
sorduğun soru;
#include <avr/pgmspace.h>
#include <EEPROM.h>
const PROGMEM uint8_t alfa[] = {1, 2, 3, 4, 6}; //flash'a  sabit sayı atama...

uint8_t EEMEM SomeVariable = 12; //tek başına eeprom bir değer atama

uint8_t EEMEM deger[] = {12, 11, 3, 4, 5, 9};  //dizi olarak eeprom bir değer atama
void setup() {
  // put your setup code here, to run once:
  ;
}

void loop() {
  // put your main code here, to run repeatedly:
  ;
}



uint8_t EEMEM deger[] = {12, 11, 3, 4, 5, 9};  //bu şekilde...

şeklinde çözülebilmektedir...
ambar7

alexsi

Alıntı yapılan: Kabil ATICI - 27 Kasım 2015, 23:28:00
arduino'da  normal kodlarda çalışmaktadır.
sorduğun soru;
#include <avr/pgmspace.h>
#include <EEPROM.h>
const PROGMEM uint8_t alfa[] = {1, 2, 3, 4, 6}; //flash'a  sabit sayı atama...

uint8_t EEMEM SomeVariable = 12; //tek başına eeprom bir değer atama

uint8_t EEMEM deger[] = {12, 11, 3, 4, 5, 9};  //dizi olarak eeprom bir değer atama
void setup() {
  // put your setup code here, to run once:
  ;
}

void loop() {
  // put your main code here, to run repeatedly:
  ;
}



uint8_t EEMEM deger[] = {12, 11, 3, 4, 5, 9};  //bu şekilde...

şeklinde çözülebilmektedir...
#include <avr/pgmspace.h>
#include <EEPROM.h>
uint8_t EEMEM deger[] = {12, 11, 3, 4, 5, 9};  //bu şekilde...
Hocam deneme yaptım ama eeprom'a bu değerleri atamadı. Acaba başka  birşey daha yazmak mı lazımdır ?

mesaj birleştirme:: 29 Kasım 2015, 10:40:36

#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <EEPROM.h>
// defines for eeprom access  
#define read_eeprom_byte(address) eeprom_read_byte ((const uint8_t*)address)
#define write_eeprom_byte(address,value) eeprom_write_byte ((uint8_t*)address,(uint8_t)value)
#define read_eeprom_word(address) eeprom_read_word ((const uint16_t*)address)
#define write_eeprom_word(address,value) eeprom_write_word ((uint16_t*)address,(uint16_t)value)

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;
int vale;

void setup()
{
  vale = read_eeprom_word(200);
  if ((vale == 0xFFFF))
{  
//Default değerlerin yüklenmesi...  
     write_eeprom_word(0,1);
     write_eeprom_word(2,4);
     write_eeprom_word(4,10);
     write_eeprom_word(6,20);
     write_eeprom_word(8,40);
     write_eeprom_word(10,50);
     write_eeprom_word(12,60);
     write_eeprom_word(14,70);
     write_eeprom_word(200,0xA000);// Koruma adresi
 }
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) 
  {
    ; // wait for serial port to connect. Needed for native USB port only
  }
}

void loop() {
  // read a byte from the current address of the EEPROM
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value,DEC);
  Serial.println();

  address = address + 1;
  if (address == EEPROM.length()) 
  {
    address = 0;
  }
  delay(500);
}

Yukarıda başka bir deneme yaptım. Paylaşmak istedim. 200 üncü adreste 0xFFFF varsa ilk açılışta bir defaya mahsus default değerleri eeproma yazılıyor. Tabi  tekrar tekrar açılışta yüklenmemesi için korumalar artırılabilir. Ben hala daha basit  bir yolu olmalı diye düşünüyorum. 
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

mehmet

Setup dan önce;
#include <avr/eeprom.h> 

uint8_t  EEMEM NonVolatileChar = 0; 
uint16_t EEMEM NonVolatileInt = 7; 
uint8_t  EEMEM NonVolatileString[10] = {
      0, 1, 2, 3, 4, 5, 6, 7, 8, 9};


Yazılabilir. Burada eeprom 0x00 a 1 byte bir
sayı, 0x01 e iki byte,  0x03 den itibaren de
on byte yerleştirilmiş olmaktadır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

alexsi



#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <EEPROM.h>

// defines for eeprom access  
#define read_eeprom_byte(address) eeprom_read_byte ((const uint8_t*)address)
#define write_eeprom_byte(address,value) eeprom_write_byte ((uint8_t*)address,(uint8_t)value)
#define read_eeprom_word(address) eeprom_read_word ((const uint16_t*)address)
#define write_eeprom_word(address,value) eeprom_write_word ((uint16_t*)address,(uint16_t)value)
#define read_eeprom_dword(address) eeprom_read_dword ((const uint32_t*)address)
#define write_eeprom_dword(address,value) eeprom_write_dword ((uint32_t*)address,(uint32_t)value)
#define read_eeprom_float(address) eeprom_read_float ((const float *)address)
#define write_eeprom_float(address,value) eeprom_write_float ((float*)address,(float)value)
#define read_eeprom_array(address,value_p,length) eeprom_read_block ((void *)value_p, (const void *)address, length)
#define write_eeprom_array(address,value_p,length) eeprom_write_block ((const void *)value_p, (void *)address, length)

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;
int vale;
uint8_t  EEMEM NonVolatileChar = 0;
uint16_t EEMEM NonVolatileInt = 7;
uint8_t  EEMEM NonVolatileString[10] = {
      0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

void setup()
{
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) 
  {
    ; // wait for serial port to connect. Needed for native USB port only
  }
}

void loop() {
  // read a byte from the current address of the EEPROM
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value,DEC);
  Serial.println();
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  delay(500);
}

@mehmet hocam, Yukarıda eepromu okuyan bir kod var ve bu kodu alete atıp denedim. 255 (0xFF ) olduğunu okuyorum.En sol adres, sağdaki değeri. Acaba yazarken eksik yazdığım bir yer mi var? Teşekkürler..
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

mehmet

Benim atladığım nokta şu;
AVR ile derlenmiş bir projede .hex ve .eep dosyalarının
oluşması ve bu iki dosyanın birlikte mcu içine programlanması.
Arduino' da bu iki dosyayı oluşturuyor. Ancak sadece .hex
dosyası programlanıyor.
Bu nedenle; once ilgili eeprom hafızası okunur, istenilen değer
yoksa yeni değerler eeproma yazılır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

alexsi

Mehmet hocam teşekkürler, mesele @Kabil ATICI hocamın anlattığı, meseleye geliyor. Anlaşılan o ki Bootloader üzerinden programlama ile ISP programlama arasındaki farktan kaynaklanıyor.
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?