با سلام می خواستم اگر امکان دارد نحوه تعریف متغییر از حافظه eeprom در میکرو 89c51ed2 را توضیح دهید من این کار رو در کامپایلر keil انجام دادم ولی پس از قطع برق از میکرو اطلاعات پاک می شد
اطلاعیه
Collapse
No announcement yet.
89c51ed2
Collapse
X
-
پاسخ : 89c51ed2
با سلام
من مطلب زیر رو از خود دیتاشیت این قطعه نقل قول میکنم:
بلوک دو کیلو بایتیEEPROM داخلی در آدرسهای 0000H تا 07FFH از XRAM قرار گرفته است که از طریق تنظیم بیتهای ثبات EECON انتخاب می شود.
عملیات خواندن/نوشتن از/روی این حافظه توسط دستور MOVX انجام می شود.
برای نوشتن باید مراحل زیر را طی کنید:- [li]ابتدا پرچم EEBUSY را بررسی کنید. (این پرچم نشانگر مشغول بودن EEPROM است و اگر بالا بود نباید عملیات را ادامه دهیم.)[/li]
[li]اگر در برنامه روالهای وقفه ای وجود دارند که از XRAM استفاده میکنند آنها را ذخیره و غیر فعال کنید.[/li]
[li]آدرس خانه ای که قصد دارید روی آن بنویسید را در ثبات DPTR بریزید.[/li]
[li]داده ای که قرار است نوشته شود را در ثبات A بریزید.[/li]
[li]بیت EEE از ثبات EECON را "یک" کنید.[/li]
[li]سپس با استفاده از دستور MOVX @DPTR,A ، داده را روی آدرس مورد نظر بنویسید.[/li]
[li]بیت EEE از ثبات EECON را "صفر" کنید.[/li]
[li]روالهای وقفه ای را که غیر فعال کرده بودید، مجدداً فعال کنید.[/li]
[li]در این زمان پرچم EEBUSY توسط سخت افزار به نشانه مشغول بودن و غیر قابل دسترسی بودنِ قسمت EEPROM بالا می رود. (مثل پرچم کمک داور به نشانه آفساید!! :icon_razz: )[/li]
[li]در نهایت و پس از انجام عملیات پرچم EEBUSY به نشانه آزاد بودن EEPROM پایین آورده می شود.[/li]
برای خواندن نیز مراحلی نظیر مراحل نوشتن طی میشود با این تفاوت که در خواندن به جای دستور MOVX @DPTR,A آنرا به این صورت بکار میبریم: MOVX A,@DPTR
ساختار ثبات EECON به این صورت است:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
_______________________________________________
| EEE | EEBUSY | - | - | - | - | - | - |
که در اینجا EEE بیت فعال ساز EEPROM و EEBUSY پرچم مشغول بودن EEPROM است.
(توجه: ثبات EECON "بیت آدرس پذیر" (bit addressable) نیست یعنی قابلیت آدرس پذیری بیتی ندارد لذا برای فعال کردن EEPROM باید دستور را به این صورت بنویسیم: MOV EECON,#02H
امیدوارم مفید بوده باشه. اگر باز هم سوالی داشتی خوشحال میشم بتونم جواب بدم .(اگه بتونم! :mrgreen: )
موفق باشی
- [li]ابتدا پرچم EEBUSY را بررسی کنید. (این پرچم نشانگر مشغول بودن EEPROM است و اگر بالا بود نباید عملیات را ادامه دهیم.)[/li]
-
پاسخ : 89c51ed2
ممنون ولی پاک شدنش رو نمیدونم چکار کنم در کامپایلر keil در مسیر \Keil\C51\EXAMPLES\FarMemory\E2PROM for the 80C51RD2 مثالی برای این موضوع به زبان c موجود است و کار هم می کند ولی به محض اینکه شما برق رو از میکرو قطع می کنید اطاعات پاک میشه بد جوری سر کارم گذاشته :eek: :eek: :eek: :eek:به دیگران بیاموز تا بتو بیاموزند
bioosun@gmail.com
دیدگاه
-
پاسخ : 89c51ed2
چی بگم والا
احتمالاً مشکل از جای دیگست و این جور مشکل ها رو هیچکس به جز خود صاحب پروژه نمیتونه حل کنه. ولی من پیشنهاد میکنم یه برنامه ای بنویسید که روی EEPROM بنویسه و از روش بخونه و نمایش بده.
بعد از این که مطمئن شدین در موقع بودن برق مشکلی نیست برق رو قطع کنید و بعد از وصل برق دوباره همونجا ها رو بخونید.
همچنین توصیه میکنم کدی که نوشتین رو اینجا بذارین . متاسفانه من C کار نکردم ولی شاید دوستان بتونن کمک کنن.
موفق باشید
دیدگاه
-
پاسخ : 89c51ed2
بلاخره مشکل حل شد روتین رو ایجا قرار میدم تا بقیه هم استفاده کنند
unsigned char read_8bit_EEPROM (unsigned int adr)
{
unsigned char val;
bit ea_save;
while (EECON&1); //wait while busy
ea_save=EA;
EA=0;
EECON |= 0x02;//Enable eeprom data;
val=*(unsigned char xdata*)adr;
EECON &= ~0x02;//Disable eeprom data;
EA=ea_save;
return val;
}
// Write EEPROM 8-bit 'val' at address 'adr'
void write_8bit_EEPROM (unsigned int adr, unsigned char value)
{
bit ea_save;
while(EECON & 0x01);
ea_save=EA;
EA=0;
EECON |= 0x02;//Enable eeprom data
*(unsigned char xdata*)adr=value;
EECON &= ~0x02;//Disable eeprom data
EA=ea_save;
}
به دیگران بیاموز تا بتو بیاموزند
bioosun@gmail.com
دیدگاه
دیدگاه