پاسخ : آموزش winavr و avrlib
استفاده از حافظه EEPROM داخلی avr
(_مطالبی رو که میگم تست کردم و جواب گرفتم...)
همونطور که میدونین، متغیرهایی که تعریف میکنیم در حالت عادی در حافظه sram میکرو ذخیره میشن.
نوع دیگه حافظه، eeprom که با قطع برق، اطلاعاتش پاک نمیشه. در میکروکنترلری مثل mega16 حافظه eeprom داخلی 512 کیلوبایت با امکان نوشتن و خواندن 100000 بار وجود داره.
رجیسترهای EEARH/L و EEDR و EECR برای کار با حافظه eeprom داخلی هستن. در winavr کتابخونه eeprom.h برای راحتی ارتباط با eeprom درنظر گرفته شده.
#include <avr/eeprom.h>
با دستور EEMEM به کامپایلر میگیم که یه متغیر رو در حافظه eeprom ذخیره کنه.
unsigned char EEMEM char_eeprom;
unsigned int EEMEM int_eeprom;
unsigned char EEMEM str_eeprom[12];
متغیر اول یک بایت، متغیر دوم 2 بایت و آخری هم یک رشته 12 بایتی در حافظه eeprom ذخیره میشن.
برای نوشتن روی این متغیرها در حافظه eeprom از توابع زیر استفاده می کنیم:
void eeprom_write_byte (uint8_t *addr, uint8_t value)
void eeprom_write_word (uint16_t *addr, uint16_t value)
void eeprom_write_block (void *pointer_eeprom, const void *pointer_ram, size_t n)
تابع eeprom_write_byte یک بایت در حافظه eeprom مینویسه. پارامتر اولش یک آدرس از حافظه و پارامتر دوم مقداری که باید در مکان مورد نظر بنویسه. دقت کنید که طبق تعریف، آدرس باید از اشاره گر 1 بایتی باشه.
تابع eeprom_write_word دو بایت تو حافظه eeprom مینویسه. مثل تابع قبل، با این تفاوت که پارامترهاش 2 بایتی هستن.
تابه eeprom_write_block میتونه n بایت تو eeprom بنویسه. پارامتر اول آدرس مورد نظر از حافظه eeprom ، پارامتر دوم آدرسی از حافظه sram که شامل اطلاعاتی میشه که میخوایم رو eeprom بنویسیم (احتمالا flash هم بشه برای نوشتن مستقیم رشته). پارامتر سوم، تعداد بایتی که باید بخونه. همونطور که می بینید اشاره گرها از نوع void هستن. یعنی اهمیتی نداره که داده مورد نظر از چه نوعی (چند بایتی) باشه.
کد نحوه استفاده از این توابع:
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char EEMEM char_eeprom;
unsigned int EEMEM int_eeprom;
unsigned char EEMEM str_eeprom[12];
int main()
{
unsigned char str_var[12] = "my str";
eeprom_write_byte (&char_eeprom, 3);
eeprom_write_word (&int_eeprom, 4);
eeprom_write_block (str_eeprom, str_var, 12);
return 0;
}
لازمه به این نکته اشاره کنم که در زبان C ، اپراتور & قبل از نام یک متغیر، آدرس اون رو برمیگردونه. ضمنا نام یک آرایه، خودش اشاره گر به اولین خانه اشغال شده حافظه است.
برای خوندن حافظه eeprom از توابع زیر استفاده میکنیم:
uint8_t eeprom_read_byte (const uint8_t *addr)
uint16_t eeprom_read_word (const uint16_t *addr)
void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)
عملکرد اینام دیگه مشخصه. دو تابع اول آدرس رو به عنوان پارامتر میگیرن و مقدار خونده شده رو برمیگردونن. تابع سوم، n بایت خونده شده از آدرس pointer_eeprom رو در آدرس pointer_ram برمیگردونه.
کد قبل رو کامل میکنم:
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char EEMEM char_eeprom;
unsigned int EEMEM int_eeprom;
unsigned char EEMEM str_eeprom[12];
int main()
{
unsigned char char_sram;
unsigned int int_sram;
unsigned char str_sram[12];
unsigned char str_var[12] = "my str";
eeprom_write_byte(&char_eeprom, 3);
eeprom_write_word(&int_eeprom, 4);
eeprom_write_block(str_eeprom, str_var, 12);
char_sram = eeprom_read_byte(&char_eeprom);
int_sram = eeprom_read_word(&int_eeprom);
eeprom_read_block(str_sram, str_eeprom, 12);
return 0;
}
حرف آخر در مورد مقداردهی اولیه این متغیرها...
unsigned char EEMEM char_eeprom = 1;
unsigned int EEMEM int_eeprom = 2;
unsigned char EEMEM str_eeprom[12] = "test str";
متغیرها رو که به این صورت تعریف کردین، کامپایلر یه فایل با پسوند .eep میسازه. باید این فایل رو با استفاده از پروگرمر روی میکرو بنویسین. تصویر زیر رو ببینید ...
استفاده از حافظه EEPROM داخلی avr
(_مطالبی رو که میگم تست کردم و جواب گرفتم...)
همونطور که میدونین، متغیرهایی که تعریف میکنیم در حالت عادی در حافظه sram میکرو ذخیره میشن.
نوع دیگه حافظه، eeprom که با قطع برق، اطلاعاتش پاک نمیشه. در میکروکنترلری مثل mega16 حافظه eeprom داخلی 512 کیلوبایت با امکان نوشتن و خواندن 100000 بار وجود داره.
رجیسترهای EEARH/L و EEDR و EECR برای کار با حافظه eeprom داخلی هستن. در winavr کتابخونه eeprom.h برای راحتی ارتباط با eeprom درنظر گرفته شده.
#include <avr/eeprom.h>
با دستور EEMEM به کامپایلر میگیم که یه متغیر رو در حافظه eeprom ذخیره کنه.
unsigned char EEMEM char_eeprom;
unsigned int EEMEM int_eeprom;
unsigned char EEMEM str_eeprom[12];
متغیر اول یک بایت، متغیر دوم 2 بایت و آخری هم یک رشته 12 بایتی در حافظه eeprom ذخیره میشن.
برای نوشتن روی این متغیرها در حافظه eeprom از توابع زیر استفاده می کنیم:
void eeprom_write_byte (uint8_t *addr, uint8_t value)
void eeprom_write_word (uint16_t *addr, uint16_t value)
void eeprom_write_block (void *pointer_eeprom, const void *pointer_ram, size_t n)
تابع eeprom_write_byte یک بایت در حافظه eeprom مینویسه. پارامتر اولش یک آدرس از حافظه و پارامتر دوم مقداری که باید در مکان مورد نظر بنویسه. دقت کنید که طبق تعریف، آدرس باید از اشاره گر 1 بایتی باشه.
تابع eeprom_write_word دو بایت تو حافظه eeprom مینویسه. مثل تابع قبل، با این تفاوت که پارامترهاش 2 بایتی هستن.
تابه eeprom_write_block میتونه n بایت تو eeprom بنویسه. پارامتر اول آدرس مورد نظر از حافظه eeprom ، پارامتر دوم آدرسی از حافظه sram که شامل اطلاعاتی میشه که میخوایم رو eeprom بنویسیم (احتمالا flash هم بشه برای نوشتن مستقیم رشته). پارامتر سوم، تعداد بایتی که باید بخونه. همونطور که می بینید اشاره گرها از نوع void هستن. یعنی اهمیتی نداره که داده مورد نظر از چه نوعی (چند بایتی) باشه.
کد نحوه استفاده از این توابع:
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char EEMEM char_eeprom;
unsigned int EEMEM int_eeprom;
unsigned char EEMEM str_eeprom[12];
int main()
{
unsigned char str_var[12] = "my str";
eeprom_write_byte (&char_eeprom, 3);
eeprom_write_word (&int_eeprom, 4);
eeprom_write_block (str_eeprom, str_var, 12);
return 0;
}
لازمه به این نکته اشاره کنم که در زبان C ، اپراتور & قبل از نام یک متغیر، آدرس اون رو برمیگردونه. ضمنا نام یک آرایه، خودش اشاره گر به اولین خانه اشغال شده حافظه است.
برای خوندن حافظه eeprom از توابع زیر استفاده میکنیم:
uint8_t eeprom_read_byte (const uint8_t *addr)
uint16_t eeprom_read_word (const uint16_t *addr)
void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)
عملکرد اینام دیگه مشخصه. دو تابع اول آدرس رو به عنوان پارامتر میگیرن و مقدار خونده شده رو برمیگردونن. تابع سوم، n بایت خونده شده از آدرس pointer_eeprom رو در آدرس pointer_ram برمیگردونه.
کد قبل رو کامل میکنم:
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char EEMEM char_eeprom;
unsigned int EEMEM int_eeprom;
unsigned char EEMEM str_eeprom[12];
int main()
{
unsigned char char_sram;
unsigned int int_sram;
unsigned char str_sram[12];
unsigned char str_var[12] = "my str";
eeprom_write_byte(&char_eeprom, 3);
eeprom_write_word(&int_eeprom, 4);
eeprom_write_block(str_eeprom, str_var, 12);
char_sram = eeprom_read_byte(&char_eeprom);
int_sram = eeprom_read_word(&int_eeprom);
eeprom_read_block(str_sram, str_eeprom, 12);
return 0;
}
حرف آخر در مورد مقداردهی اولیه این متغیرها...
unsigned char EEMEM char_eeprom = 1;
unsigned int EEMEM int_eeprom = 2;
unsigned char EEMEM str_eeprom[12] = "test str";
متغیرها رو که به این صورت تعریف کردین، کامپایلر یه فایل با پسوند .eep میسازه. باید این فایل رو با استفاده از پروگرمر روی میکرو بنویسین. تصویر زیر رو ببینید ...

دیدگاه