باسلام .
کاربر محترم،به این نکته توجه کنید،تابع eeprom براساس char هستن،و شما نباید متغییر int را برای تابع int بفرستید،اگر بفرستید هشت بایت اول ان فقط فرستاده میشود.
برای اینکه،هر ادرس ایسی ها eeprom خارجی هشت بایتی هستن.
شما باید هشت باید اول را در ادرس 0 و هشت بایت بعد را در ادرس 1 قرار دهید !(ادرس 0 و 1 یک مثال بود!)
به عنوان مثال این دو تابع دریافت و ارسال برای حافظه eeprom ما هستن:
Please Login or Register to see this code
int v=58200;
int Get;
نحویه نوشتن
;((eeprom_write(0,(v<<8
;(eeprom_write(1,v
نحویه خواندن:
;(Get=eeprom_read(0
8>>Get=Get
;(Get=eeprom_read(1
در واقع به کمک شیفت دادن،ابتدا هشت بایت اول فرستاده میشود! سپس،ادرس بعدی هشت بایت eeprom انتخاب میشود،سپس هشت بایت انتهای فرستاده میشود.
و برخواندن نیز،با همان ترتیب ادرس ها از ایسی حافظه خوانده میشود و دیتات شیفت داده میشوند، تا متغییر int که Get می باشد،همان مقدار V ابتدای شود.
باتشکر.
آموزش کار با حافظه EEPROM خارجی(خواندن و نمایش عکس!بررویLCD)
مدیران انجمن: SAMAN, sinaset, شوراي نظارت
-
- پست: 1
- تاریخ عضویت: یکشنبه ۲۲ اردیبهشت ۱۳۹۸, ۱۲:۳۸ ب.ظ
- سپاسهای ارسالی: 1 بار
- سپاسهای دریافتی: 1 بار
Re: آموزش کار با حافظه EEPROM خارجی
سلام و خداقوتsinaset نوشته شده: ↑دوشنبه ۱۹ مهر ۱۳۹۵, ۴:۰۴ ب.ظ بنام خدا
باسلام
نحویه برنامه نویسی و پرتئوس!
همانجور که در پست قبل گفتیم ما از ایسی کرده ایم . می خواهیم،در برنامه شبیه ساز ، حرف " " رو بر روی خانه 0 ایسی کنیم،سپس بعد از ذخیر سازی،ان را بر روی کنیم !
قبل از هر چیز،در برنامه کدویژن باید در قسمت ، تنظیمات مربوط به I2c را مشخص کنیم،
در ==> project/configure/c compiler/Libraries/
در این قسمت باید پایه کلاک پایه دیتا DATA که به میکرو اتصال پیدا کرده اند را مشخص کنید. ( مانند تصویر )
در ادامه،بعد از مشخص کردن پایه ها، باید همراه به کتابخانه لازم،کتابخانه، i2C را معرفی کنیم
Please Login or Register to see this code
سپس در مرحله بعد،برای راحتی کارهای ما در برنامه،دو شناسه ،مربوط به آدرس سخت افزاری ایسی و آدرس سخت افزاری برای زمان که قصد خواندن از حافظه تعریف می کنیم
Please Login or Register to see this code
همانجور که می ببینید مقدار (آدرس سخت افزاری برای شناسایی ایسی و برای نوشتن بر روی آیسی نیز استفاده )برابر با می باشد! که به باینری میشود ، همان مقداری که در پست بالا بطور مفصل تر توضیح دادیم
و در یک شناسه دیگر با 161 دسیمال می باشد که به باینری باشد، همان مقداری که در اخر پست قبل ان را توضیح دادیم، مقداری که زمانی که برای ایسی فرستاده شود،می توان مقداری را از ایسی خواند!
اما در ادامه کارهای مهم ، وارد تابع شویم ، در انجا ابتدا باید، مقدار دهی اولیه کنیم.
Please Login or Register to see this code
اکنون میکروکنترولر خود را اماده کرده است تا به ایسی ارتباط برقرار کند.
برای شروع ابتدا به کمک دستور زیر (که مربوط به تابع i2c می باشد ) بیت شروع را برای ایسی ارسال می کنیم( شروع را در پست قبل توضیح )
Please Login or Register to see this code
بعد از فرستادن دستور شروع، آدرس سخت افزاری ایسی را به کمک () برای ایسی ارسال می کنیم:
Please Login or Register to see this code
همانجور که می ببینید، بین دستور i2c_write ، شناسه آدرس سخت افزاری (که 160 یا 10100000 می ) برای ایسی ارسال می شود،تا بعد از صحیح بودن ادرس، ایسی خود را برای دستور بعدی ما،خود را اماده کند!
اما در ادامه،باید، آدرس خانه حافظه،برای ذخیر شدن اطلاعات در ایسی را ارسال کنیم، ( که در پست گذشته گفتیم،آدرس خانه ها ،مجموعه دو بایت می باشد! ) چون ما قصد داریم،در آدرس 0،دیتا را ذخیر کنیم،هر دو بایت را برابر با 0 قرار میدهیم:
Please Login or Register to see this code
اکنون که ادرس را برای ایسی فرستاده ایم،باید دیتا را بفرستیم،که ما قصد داریم را ذخیر کنیم برای این منظور،کد زیر را ارسال می کنیم:
Please Login or Register to see this code
خوب کار تمام است و اطلاعات بر روی ایسی ذخیر شده است! ولی هنوز ارتباط است!برای همین باید دستور ( همان بیت stop می ) را برای ایسی ارسال کنیم
Please Login or Register to see this code
و در پایان باید 5 میلی ثانیه تاخیر نیز لحاظ شود ( eeprom سرعت پایین در ذخیر سازی دارد،که در حدود چند میلی ثانیه می باشد، برای همین بعد از ذخیره سازی هر دیتا،یک تاخیر 5 میلی ثانیه باید لحاظ باید )
-----
[HIGHLIGHT=#76923c]اما برای خواندن دیتا از ایسی:
ابتدا بیت می کنیم
Please Login or Register to see this code
سپس آدرس سخت افزاری ایسی را ارسال می کنیم
Please Login or Register to see this code
سپس آدرس خانه حافظه را از ارسال می کنیم (چون دیتا در ادرس 0 صفر می باشد، آدرس هردو بایت 0 قرار )
Please Login or Register to see this code
اما در ادامه،باید یک بار دیگر بیت شروع را از دوباره بفرستیم!
Please Login or Register to see this code
در ادامه،باید آدرس سخت افزاری،برای خواندن اطلاعات را ارسال کنیم ( در واقع همان آدرس سخت افزاری ایسی می باشد! با این تفاوت که فقط بیت اخر،که مربوط به نوشتن و خواندن می باشد، 1 )
Please Login or Register to see this code
حال به کمک دستور زیر،دیتا را می خوانیم و د متغیر مدنظرمان میریزیم
Please Login or Register to see this code
دیتا به درون متغیر ریخته میشود!
اکنون دیگر همه چیز اماده است و می توانیم دیتا را بر روی بدهیم !
برنامه:
Please Login or Register to see this code
[External Link Removed for Guests]برنامه و شبیه ساز.
باتشکر.
آیا درصورتی که فرکانس کریستال ریزپردازنده 12MHZ باشد در کد نویسی تغییری باید بدهیم؟
درآزمایشگاه ریزپردازنده که نمونه پروژه کتاب AVR جابر الوندی را تست کردیم هیچ عددی در حافظه نوشته نشد و فقط مقدار خواندن را 255 نمایش داد
ممنون می شوم راهنمایی کنید
تشکر از مطالب خوب و توضیح کاملتان
Re: آموزش کار با حافظه EEPROM خارجی(خواندن و نمایش عکس!بررویLCD)
سلام دوست من
یه سوال دارم اگر راهنمایی کنی بی نهایت ازت ممنون میشم
من برای ارتباط با میخوام دو تا رشته 8 بایتی رو به یک eeprom ارسال کنم . مثلا رشته "helloboy" که 8 بایت هست رو به یک 24c02 در ادرس 0x00 و رشته 6 بایتی "sorena" رو هم به آدرس 0x08 می فرستم . موقعی که میخوام باین مقادیر رو بخونم فقط آخرین پیج یعنی "sorena" رو میتونه بخونه . و وقتی ادرس 0x00 رو میفرستم چیزی نمیتونه بخونه .
تمام دستورات مربوط به مراحل گفته شده رو هم اجرا کردم . نکته ای چیزی ندارید راهنمایی کنید؟. میکرویی که کار میکنم stm32f107 هست ولی خب نوع میکرو مهم نیست البته
یه سوال دارم اگر راهنمایی کنی بی نهایت ازت ممنون میشم
من برای ارتباط با میخوام دو تا رشته 8 بایتی رو به یک eeprom ارسال کنم . مثلا رشته "helloboy" که 8 بایت هست رو به یک 24c02 در ادرس 0x00 و رشته 6 بایتی "sorena" رو هم به آدرس 0x08 می فرستم . موقعی که میخوام باین مقادیر رو بخونم فقط آخرین پیج یعنی "sorena" رو میتونه بخونه . و وقتی ادرس 0x00 رو میفرستم چیزی نمیتونه بخونه .
تمام دستورات مربوط به مراحل گفته شده رو هم اجرا کردم . نکته ای چیزی ندارید راهنمایی کنید؟. میکرویی که کار میکنم stm32f107 هست ولی خب نوع میکرو مهم نیست البته