PDA

View Full Version : دخیره اطلاعات بصورت دائم در avr



vaheeed
پنج شنبه 17 اسفند 1391, 22:28 عصر
سلام
من با atmega8 میخوام یه عدد رو داخل حافظه اش ذخیره کنم که با قطع و وصل برق از بین نره ،چون عددم 4 رقمی است باید در 2 خونه بنویسم تا جایی که خوندم باید با دستورات زیر کار کنم که داخل eeprom ذخیره بشه ، اول 2 خونه 200 و 300 رو میخونم :
EEAR=200;
EECR=0x01;
num1=EEDR;

EEAR=300;
EECR=0x01;
num2=EEDR;
num=(num1*100)+num2;


بعد رمز رو میگیرم و اینطوری ذخیره میکنم :
newPass=1234;
num1=newPass/100;
EEDR=num1;
EEAR=200;
EECR=0x04;
EECR=0x02;
while((EECR&0x02)==1);

num2=newPass-(num1*100);
EEDR=num2;
EEAR=300;
EECR=0x04;
EECR=0x02;
while((EECR&0x02)==1);

حالا بلافاصله با این دستور میخونم دوباره همون 2 تا خونه رو :

EEAR=200;
EECR=0x01;
num1=EEDR;

EEAR=300;
EECR=0x01;
num2=EEDR;
num=(num1*100)+num2;

عدد 1234 رو بصورت 3434 نشون میده !!!
جالب اینجاست که برق رو قطع و وصل میکنم حالا همون اول که میخواد این 2 تا خونه رو بخونه عدد 1455 نشون میده !!!! میشه راهنمایی کنید ممنون از همگی

Abbas Amiri
جمعه 18 اسفند 1391, 14:47 عصر
سلام
دوست عزیز ، شما فراموش کرده اید که در محیط C هستید و دقیقا عملیات مشابه اسمبلی انجام می دهید . البته مشکلی نیست و چنانچه خطایی نداشته باشید به نتیجه مطلوب می رسید.
اما براحتی میتوانید موارد فوق رو در دو سه خط بنویسید


eeprom unsigned char pass_lsb @200, pass_msb @300;
int newPass;
//...............................
newPass=1234;
pass_lsb=(unsigned char)newPass ;
pass_msb=(unsigned char)(newPass>>8);

vaheeed
جمعه 18 اسفند 1391, 15:45 عصر
ممنون از جوابتون من اینو یه جا خوندم و استفاده کردم ، میشه کدی که نوشتید رو توضیح بدید متوجه نمیشم تا جایی که فهمیدم دو تا متغییر تعریف کردید به اسم pass_lsb , pass_msb که ادرس های 200 و 300 رو دارن و متغییر pass_lcb مقدار newpass رو گرفته خط بعدش چیه ؟؟ و اینکه این خط ها دارن اطلاعات داخل حافظه eeprom میریزن حالا واسه خوندن ازش باید چیکار کنم؟؟ میشه اگه منبع خوب واسه دستورات avr در c دارین معرفی کنید ؟؟ ممنون

Abbas Amiri
جمعه 18 اسفند 1391, 17:41 عصر
ممنون از جوابتون من اینو یه جا خوندم و استفاده کردم ، میشه کدی که نوشتید رو توضیح بدید متوجه نمیشم تا جایی که فهمیدم دو تا متغییر تعریف کردید به اسم pass_lsb , pass_msb که ادرس های 200 و 300 رو دارن و متغییر pass_lcb مقدار newpass رو گرفته خط بعدش چیه ؟؟ و اینکه این خط ها دارن اطلاعات داخل حافظه eeprom میریزن حالا واسه خوندن ازش باید چیکار کنم؟؟ میشه اگه منبع خوب واسه دستورات avr در c دارین معرفی کنید ؟؟ ممنون

خط شماره 5 بایت کم ارزش newPass رو در pass_lsb ذخیره میکنه و خط 6 بایت پر ارزش آن را در pass_msb.
اگر هم خواستید آن مقدار رو بخونید و مثلا در همان متغیر newPassکه از نوع Integer هست بریزید :


newPass = pass_lsb + (pass_msb << 8)


برای راهنما هم هم کتب مربوط به زبان سی و هم Help محیطی که در آن برنامه نویسی میکنید(,...CodeVision,AtmelStudio) را مطالعه کنید

vaheeed
جمعه 18 اسفند 1391, 17:53 عصر
متوجه شدم اون متغیری که از eeprom میسازیم مثل متغیر های دیگه کار میکنه ، مشکلم حل شد فقط یه سوالی وقتی متغیر eeprom رو مقدارش رو تغییر میدم بلافاصله در حافظه ذخیره میشه ؟؟ چون وقتی تغیرشون میدم و همون موقع میخونم اطلاعات رو یه چی نشون میده و بعد از ریست شدن یه چی دیگه نشون میده ، اگه بخوام بدون ریست اطلاعات در حافظه ذخیره بشه باید چیکار کنم؟؟

Abbas Amiri
جمعه 18 اسفند 1391, 22:48 عصر
سلام
اگر بعد از ریست شدن میکرو تغییرات ایجاد شده ، به این معنی است که کد اشکالی ندارد . شما آن قسمتی از برنامه که نوشته اید و به مشکل خورده اید را نمایش بدید تا بررسی شود.