PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ذخیره متغیر بدون پاک شدن با قطع برق



Romax
06-07-2013, 05:11
شاید سوال ابتدایی باشه. میخواستم بدونم چطور میشه یک متغیر رو ذخیره کرد که با قطع برق پاک نشه. به عبارت بهتر من میخوام در اولین بار که میکرو روشن میشه متغیرم یک داده ای رو بگیره حالا بعد از اون اگه تو برنامه تغییر کرد و داده جدید گرفت متغیرم با خاموش روشن شدن میکرو همین داده جدید رو حفظ کنه نه اینکه دوباره اون داده اولیه رو دریافت کنه؟ (نمیدونم تو flash باید ذخیره کرد یا eeprom و با چه دستوری به زبان C )

esisafa
06-07-2013, 09:56
باید در eeprom ذخیره کنید.
بستگی به کامپایلر داره. اگه codevision کار میکنید باید اول تعریف متغیر این کلمه رو اضافه کنید

Ma3ood
06-07-2013, 18:33
شما باید در حافظه ایتوپرام ذخیره کنی در امورد اینکه داده جدید کی جایگزین بشه و در این متغییر ریخته بشه برمیگیرده به نوع برنامه و کارتون و نوع داده تون

Romax
07-07-2013, 01:41
نمیشه تو flash ذخیره کرد؟ فرقشون چیه؟

vahidasm
07-07-2013, 01:54
فرقش تو اینه که اولا فلش حافظه برای ذخیره سازی کد و دستور العملهایی هستش که شما برای میکرو نوشتین
دوما اگه داده ای رو روی فلش بخوای بریزی تو کد برنامه (کدویژن) باید کلمه flash رو قبل متغیر بنویسی که اینطوری از حافظه فلشت برای ذخیره این متغیر استفاده کرده باشی ولی دوتا عیب داره
1-دیگه تو حین کار کردن میکرو نمیتونی تغییرش بدی چرا که فقط تو کامپایلر و تنها موقع نوشتن برنامه این قابلیت وجود داره
2-مقداری از حافظه میکروت اشغال میشه و ممکنه برای کد اصلی جا کم بیاری
حالا چه گیریه که تو فلش ریخته بشه؟؟؟؟؟خب بریز تو eeprom :mrgreen:

Romax
07-07-2013, 23:03
میتونم بپرسم نحوه استفاده از دستور eeprom توی codevision برای نوشتن و پاک کردن و خوندن از یک خونه حافظه با آدرس مشخص چیه؟ مثلا من میخوام 20 بایت اول eeprom رو برای نوشتن یک رشته کاراکتری استفاده کنم و بعدش این 20 بایت رو پاک کنم رشته جدید بریزم و بخونم؟

Ma3ood
07-07-2013, 23:35
سلام اینطوری تعریف کن


eeprom char a[20]

Romax
07-07-2013, 23:41
سلام اینطوری تعریف کن


eeprom char a[20]

خوب این الان تو کدوم خونه حافظه میریزه؟ چجوری باید خوندش؟ چجوری پاک کرد؟
یعنی کافیه اینو اول برنامه بیاریم بعد دیگه با a مثل یک متغیر معمولی کارکنیم؟ لازم نیست به آدرس و بقیه موارد کار داشته باشیم؟ اگه چندتا متغیر رو بخوایم تو eeprom ذخیره کنیم چی بازم نیاز به آدرس نیست و خود codevision انجام میده؟

Ma3ood
08-07-2013, 00:17
دوست عزیز یه ارایه با بیست و یک خانه نعریف شده در حافظه دایمی میکروکنترلر
خوب شما وقتی میخوای مثلا خانه 1 از این ارایه را بخونی و بریزی در متغییر b که از نوع sram هست و با اون کار کنی پس اول محتوای متغییر را برای راحتی کار روی یک متغییر Sram بریز


b=a[0];



و برای نوشتن اون


a[0]= b;

Romax
08-07-2013, 02:18
آقا ممنون مشکل من حل شد. فقط برای من جالبه که مثلا اگه ما با وجود اینکه رشته a رو از نوع char تو eeprom تعریف میکنیم نمیتونیم این رشته رو داخل رشته b از نوع char تو Sram با دستور (strcpy(b,a بریزیم و باید بیایم با حلقه for کاراکترا رو یکی یکی بریزیم چون خطا میده که رشته a از نوع unsigned هست و تابع strcpy یا strcmp نمیتونن باهاش کارکنن.
یه برنامه ساده نوشتم واسه تست کردن نوشتن تو eeprom و اینکه بعد از قطع برق تغییری توش ایجاد نمیشه گفتم اینجا بزارم شاید یه روز به درد کسی بخوره:
تو این برنامه با روشن شدن میکرو روی LCD متن TEST EEPROM به مدت 10 ثانیه نمایش داده میشه و بعد از اون LCD پاک میشه و متن CHANGED نمایش داده میشه و از این به بعد هر وقت برق میکرو قطع و وصل شه همین متن CHANGED ثابت میمونه.


#include <mega32a.h>
#include <string.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B;
#endasm
#include <lcd.h>
eeprom char a[15];
eeprom int d;
char b[15];
char c[15];
int i=0;

void main(void){

lcd_init(16);
if(d!=1){
strcpy(c,"TEST EEPROM");
for(i=0;i<15;i++){
a[i]=c[i];
}
for(i=0;i<15;i++){
b[i]=a[i];
}
lcd_puts(b);
delay_ms(10000);
d=1;
}
strcpy(c,"CHANGED");
for(i=0;i<15;i++){
a[i]=c[i];
}
for(i=0;i<15;i++){
b[i]=a[i];
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(b);

}

farshad1989
11-12-2013, 12:27
سلام
این روش جالبیه که متغیر تعریف کنیم و داده هامونو توش بریزیم ، ولی برای پاک کردن چی ؟!
میشه متغیر رو پاک کرد ؟ منظورم اینه که برای استفاده های پویا اگه eeprom پر شد بتوانیم رشته (متغیر) دلخواه رو پاک کنیم تا حافظه بیخود اشغال نشه.

1nafar
11-12-2013, 13:56
این روش جالبیه که متغیر تعریف کنیم و داده هامونو توش بریزیم ، ولی برای پاک کردن چی ؟!
میشه متغیر رو پاک کرد ؟ منظورم اینه که برای استفاده های پویا اگه eeprom پر شد بتوانیم رشته (متغیر) دلخواه رو پاک کنیم تا حافظه بیخود اشغال نشه.
جافظه های eeprom داخلی میکرو رو هم میشه خوند و هم میشه نوشت . این کار رو بسته به نوع میکرو میشه تا 10000 بار انجام داد .
حافظه های eeprom دارای خانه های داخلی هستند که هر خونه دارای آدرس مخصوص به خودش هست . وقتی شما داده ای رو در خونه ای می نویسید ، داده ی جدید به جای داده ی قبلی نوشته میشه .

farshad1989
11-12-2013, 15:47
درسته ولی من فعلن نمیخام رشته ی جدیدی بنویسم
فقط میخام به دلخواه یه رشترو پاک کنم که خالی بشه
قرض کنید من به ترتیب کل e2prom رو با 20 رشته پر کردم ، به صورتی که مقادیرشون رو به ترتیب در خروجی نشون میده.
حالا میخام فرضن رشته ی 4 رو پاک کنم به طوری که رشته های نمایش داده شده ی من بشن 19 تا و رشته ی4 خالی باشه .

hale_dm
23-09-2014, 14:32
سلام.منم همین مشکلو دارم و میخوام عددی که تو کدویژن از حلقه ی while بدست میاد دفعه ی بعدی که حلقه رواجرا میکنه یادش بمونه.از سایت های مختلف و help کدویژن کمک گرفتم و گیجم کرد.چون الان متغیرمو eeprom تعریف میکنم و عملکرد برنامه هیچ تغییری نمیکنه.بعضی جاها از pointer استفاده کردن که سردرنمیارم.ممنون میشم اگه کمکم کنین :(