آموزش کار با حافظه EEPROM خارجی(خواندن و نمایش عکس!بررویLCD)

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

ارسال پست
Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

آموزش کار با حافظه EEPROM خارجی(خواندن و نمایش عکس!بررویLCD)

پست توسط sinaset » جمعه 5 شهریور 1395, 12:21 pm

بنام خداوند بخشنده و مهربان
باسلام

در این تاپیک به امید خدا آموزش کار کردن با حافظه EEPROM خارجی داده میشود.
تصویر
این حافظه کم حجم! و کم سرعت، ولی بسیار ارزان قیمت،می تواند نزدیک به 100 سال!!! اطلاعات را درون خود نگه دارد! این حافظه در بیشتر مدل ها می تواند تا 1 میلیون بار اطلاعات خود را حذف ! بدون انکه حافظه از کار بی افتاد!

*لازم به ذکر است حافظه های فلش،از همین مدل حافظه EEPROM الگوبرداری کرده است!

قیمت این ایسی از 200 تومان! تا چندین هزارتومان می باشد و همچنین حجم حافظه های که بیشتر در دسترس هستن از چند صد بایت تا چند مگابیت(و بیشتر) می باشد.

در این تاپیک سعی خواهیم کرد،ایسی ها EEPROM خارجی معرفی شود و همچنین انواع مثال ها به ان زده شود ..
تصویر
حافظه EEPROM با بسته بندی DIP
تصویر
حافظه EEPROM با بسته بندی SMD

فهرست آموزش ها تاپیک:


صفحه اول:
شرکت سازنده.
مدل ها
-مدل های AT24C01 و AT24C02 و AT24C04 و AT24C08 و AT24C16
-مدل های AT24C32 و AT24C64
-مدل های AT24C128 و AT24C256
-مدل AT24C512
-مدل AT24C1024
ارتباط با میکروکنترولر
پایه ها در ایسی هایی EEPROM
اما چطور باید با این ارتباط برقرار کرد.
اما نحویه برنامه نویسی و پرتئوس!
خواندن دیتا از ایسی
ارتباط با 4 ایسی EEPROM !
خواندن و نمایش عکس از حافظه EEPROM بر روی LCD!
..
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی

پست توسط sinaset » یک شنبه 7 شهریور 1395, 2:30 pm

بنام خدا
باسلام


اما در ادامه..
شرکت سازنده.

ما در این تاپیک،ایسی ها EEPROM شرکت ATMEL( سازنده میکروکنترولرهای AVR) را بررسی خواهیم کرد .(بدیل اینکه می توان انها را در بازار پیدا کرد و همچنین به کمک پرتئوس انها را شبیه سازی کرد)

مدل ها

شرکت ATMEL ایسی ها EEPROM از ظرفیت 128 بایت تا 256 کیلوبایت را تولید می کند.
ایسی های که ما می خواهیم در این تاپیک بررسی کنیم،با واحد I2C (دوسیم ) می تواند کار کنند.

اما این ایسی ها در ویژگی ها و مشخصات باهم دیگر تفاوت های نیز دارند،که ما بصورت دسته دسته انها را معرفی می کنیم

*قبل از شروع،میزان حافظه ها EEPROM را بیت مشخص می کنند! به عنوان مثال 1024 بیت! که برای انکه متوجه بشویم،چند باید می باشد،باید ان را تقسیم بر 8 کنیم .(این نکته همیشه بخاطره داشته باشیم)

مدل های AT24C01 و AT24C02 و AT24C04 و AT24C08 و AT24C16
تصویر
تصویر
این مدل ها جزو،مدل های کم ظرفیت و قیمت ارزانتر سری ایسی ها EEPROM می باشد.

این مدل ها می توانند با فرکانس 100 کیلو هرتز (با ولتاژ 2.7 ) و 400 کیلوهرتز (با ولتاژ 5 ) کار و فعالیت کنند.

چرخه ایسی ها برای نوشتن نیاز به یک زمان 5 میلی ثانیه دارد!(همان تاخیری که در پست اول به ان اشاره شد)

[HIGHLIGHT=#00b050]عدد بعد از AT24cXX میزان حافظه EEPROM به معنی کیلو بیت می باشد .
 
که اینطور می باشند :

AT24C01 ، عد 1 به معنی 1024 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 1024 تقسیم بر 8 میشود 128 بایت.
AT24C02 ، عد 2 به معنی 2024 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 2048 تقسیم بر 8 میشود 256 بایت.
AT24C04 ، عد 4 به معنی 4096 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 4096 تقسیم بر 8 میشود 512 بایت.
AT24C08 ، عد 8 به معنی 8192 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 8192 تقسیم بر 8 میشود 1024 بایت.(که برای کیلو بایت 1024 تقسیم بر 1024 میشود،که نتیجه 1 کیلوبایت ظرفیت میشود)
AT24C16 ، عد 16 به معنی 16384 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 16384 تقسیم بر 8 میشود 2024 بایت.(که برای کیلو بایت 2024 تقسیم بر 1024 میشود،که نتیجه 2 کیلوبایت ظرفیت میشود)

می توان اطلاعات درون این ایسی ها را تا 1 میلیون بار نوشت و از دوباره پاک کرد!( چرخه کامل)
این ایسی ها می توانند تا 100 سال ! اطلاعات را درون خودشان نگه دارند .

مدل های AT24C32 و AT24C64

تصویر
  مدل از ایسی ها EEPROM می تواند به فرکانس 100 کیلوهرتز (با ولتاژ 1.8 و 2.5 و 2.7 ) و فرکانس 400 کیلوهرتز(با ولتاژ 5) کار    ایسی ها برای نوشتن نیاز به یک زمان 10 میلی ثانیه دارد! 

ظرفیت ایسی ها:

AT24C32 ، عد 32 به معنی 32,768 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 32,768 تقسیم بر 8 میشود 4096 بایت.(که برای کیلو بایت 4096 تقسیم بر 1024 میشود،که نتیجه 4 کیلوبایت ظرفیت میشود)
AT24C64 ، عد 64 به معنی 65,536 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 65,536 تقسیم بر 8 میشود 8192 بایت.(که برای کیلو بایت 8192 تقسیم بر 1024 میشود،که نتیجه 8 کیلوبایت ظرفیت میشود)

می توان اطلاعات درون این ایسی ها را تا 1 میلیون بار نوشت و از دوباره پاک کرد!( چرخه کامل)
این ایسی ها می توانند تا 100 سال ! اطلاعات را درون خودشان نگه دارند .

مدل های AT24C128 و AT24C256
تصویر
  مدل از ایسی ها می توانند با فرکانس 100 کیلوهرتز (در ولتاژ 1.8) و 400کیلوهرتز(در ولتاژ 2.5 و 2.7) و 1 مگاهرتز( در ولتاژ 5 ) کار کند.   ایسی ها برای نوشتن نیاز به یک زمان 5 میلی ثانیه دارد! 
ظرفیت ایسی ها:

AT24C128 ، عد 128 به معنی 131,072 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 131,072 تقسیم بر 8 میشود 16384 بایت.(که برای کیلو بایت 16384 تقسیم بر 1024 میشود،که نتیجه 16 کیلوبایت ظرفیت میشود)
AT24C256 ، عد 256 به معنی 262,144 بیت می باشد پس برای مشخص شدن ظرفیت به بایت262,144 تقسیم بر 8 میشود 32768 بایت.(که برای کیلو بایت 32768 تقسیم بر 1024 میشود،که نتیجه 32 کیلوبایت ظرفیت میشود)

می توان اطلاعات درون این ایسی ها را تا 1 میلیون بار نوشت و از دوباره پاک کرد!( چرخه کامل)
این ایسی ها می توانند تا 40 سال اطلاعات را درون خودشان نگه دارند .

مدل AT24C512
تصویر
  مدل از ایسی ها می توانند با فرکانس 100 کیلوهرتز (در ولتاژ 1.8) و 400کیلوهرتز(در ولتاژ 2.7) و 1 مگاهرتز( در ولتاژ 5 ) کار کند.   ایسی ها برای نوشتن نیاز به یک زمان 5 میلی ثانیه دارد!   این مدل ایسی:   ، عد 512 به معنی 524,288 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 524,288 تقسیم بر 8 میشود 65536 بایت.(که برای کیلو بایت65536 تقسیم بر 1024 میشود،که نتیجه 64 کیلوبایت ظرفیت میشود)   توان اطلاعات درون این ایسی ها را تا 100هزار بار نوشت و از دوباره پاک کرد!( چرخه کامل)
این ایسی ها می توانند تا 40 سال اطلاعات را درون خودشان نگه دارند .  مدل AT24C1024 
تصویر
این مدل از ایسی ها می توانند با فرکانس 400کیلوهرتز(در ولتاژ 2.7) و 1 مگاهرتز( در ولتاژ 5 ) کار کند.

  ایسی ها برای نوشتن نیاز به یک زمان 5 میلی ثانیه دارد!  ظرفیت این مدل ایسی:  AT24C512 ، عد 1024 به معنی 1,048,576 بیت می باشد پس برای مشخص شدن ظرفیت به بایت 1,048,576 تقسیم بر 8 میشود 131,072 بایت.(که برای کیلو بایت 131,072 تقسیم بر 1024 میشود،که نتیجه 128 کیلوبایت ظرفیت میشود)   توان اطلاعات درون این ایسی ها را تا 100هزار بار نوشت و از دوباره پاک کرد!( چرخه کامل)
این ایسی ها می توانند تا 40 سال اطلاعات را درون خودشان نگه دارند . 
  مدل های معروفی شده،تقریبا معروفترین مدل های ایسی های EEPROM شرکت ATMEL می باشد .انشالله در پست های اینده نحویه ارتباطت با ایسی بیشتر توضیح داده خواهد شد.  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی

پست توسط sinaset » سه شنبه 16 شهریور 1395, 9:33 am

بنام خدا
باسلام

ارتباط با میکروکنترولر

این ایسی همانجور که در ابتدا گفته شده ،با ارتباط I2C (یا همون ارتباط دوسیمه) می تواند به میکروکنترولر ارتباط برقرار کنند. همانطور که مستحضر هستید،در ارتباطه I2C یک سیم برای Clock و یک سیم دیگر برای DATA های ما می باشد.
تصویر
تصویر از ایسی at25c64 :
در ایسی بالا،پایه Scl و Sda به میکروکنترولر اتصال پیدا کرده است
همانجور که می ببینید مقاومت ها پول آپ انها نیز اتصال پیدا کرده است
 *در ارتباط I2C همیشه باید مقاومت پول آپ بر روی پایه ها (SDA (DATA و(SCL(CLOCK اتصال پیدا کند. 

پایه ها در ایسی هایی EEPROM

پایه ها در ایسی ها EEPROM همگی شبیه به هم می باشند! فقط در بعضی مدل ها یک یا دو پایه (ادرسی دهی ) کمتر دارند!

تصویر
 پایه 1 یا AD1 تا پایه 3 یا AD3 برای آدرسی دهی ایسی می باشند!(برای زمانی که شما قصد داشته باشید،چندین ایسی EEPROM را در یک خط i2C،مورد استفاده قرار دهید) و در صورتی که می خواهید فقط از یک ایسی EEPROM استفاده کنید باید هر سه پایه را به GND اتصال دهید (در آموزش های اینده با اتصال چند ایسی eeprom با میکرو بیشتر آشنا خواهید شد)  پایه 4 ایسی، پایه GND یا منفی می   پایه 5 SDA یا همان دیتا می باشد (برای I2C)  پایه 6 SCL یا همان کلاک می باشد(برای I2C)  پایه 7، WP برای زمانیست،که ما قصد نداشته باشیم،بر روی ایسی چیزی بنویسیم!و فقط قصد داشته باشیم، از روی ایسی بخوانیم! (در صورتی که بخواهید بر روی ایسی هم بنویسید و هم بخوانید باید پایه WP را به GND اتصال دهید)(این پایه در واقع یک نوع محافظ برای از بین نرفتن اطلاعات مهم،در طرح های خاص می باشد)  پایه 8 VCC یا مثبت ایسی می باشد.  ---------  نکته:   آدرسی دهی در مدل های مختلف ایسی ها،متفاوت می باشد! ولی هر چقدر حجم و ظرفیت ایسی ها بالاتر می رود،معمولا تعداد پایه ها ادرس دهی نیز کمتر میشود! 
در ایسی at24c32
سه پایه برای آدرس دهی(A0 و A1 و A2)
(که جمعا میشود 8 ایسی از این مدل را، در ارتباط i2c به میکروکنترولر معرفی کرد)
تصویر
در ایسی At24c256
دو پایه برای آدرسی دهی (A0و A1)
(که جمعا میشود 4 ایسی از این مدل را، در ارتباط i2c به میکروکنترولر معرفی کرد)
پایه NC نیز باید به GND اتصال پیدا کند
تصویر
 
در ایسی At24c1024
یک پایه برای آدرسی دهی (A0)
(که جمعا میشود 2 ایسی از این مدل را، در ارتباط i2c به میکروکنترولر معرفی کرد)
دو پایه NC نیز باید به GND اتصال پیدا کند
تصویر
 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی

پست توسط sinaset » چهار شنبه 14 مهر 1395, 4:11 pm

بنام خدا
باسلام
اما در ادامه نحویه برقراری ارتباط با ایسی توضیح داده میشود

رابط ایسی I2C می باشد،که همین عمر باعث شده کار ما نیز راحتر بشود! کتابخانه کار با این ایسی نیز وجود دارد،و کافیست فقط ان را از طریق کدویژن تنظیم کنید.

اما چطور باید با این ارتباط برقرار کرد.

بعد از انکه مدار را طبق پست قبلی با ایسی حافظه تنظیم کردیم .حال باید به سراغ برگه اطلاعاتی ایسی برویم،تا ببینیم چطور باید با این ایسی ارتباط برقرار کرد!

در رابطه I2c همیشه بایت اول مربوط به آدرس سخت افزاری می باشد، پس ما برای شروع ارتباطه با ایسی ابتدا باید هشت بایت حاوی آدرس سخت افزاری ایسی را ارسال کنیم

آدرس سخت افزار ایسی at24c32 باید چنین باشد (طبق دیتاشیت حافظه)
تصویر
بیت اول از سمت چپ،مربوط به بیت شروع کار می باشد،که به ان بیت Start نیز گفته میشود،که با 1 شود. وقتی 1 شود،باقی بیت بعد از نیز خوانده میشود (اگر 1 نشود،باقی بیت ها خوانده نمی شود(که البته تصویر بالا دیده نمی شود، و در تصویر پایین تر می توانید آن را ببینید)

بعد از ان چهار بیت وجود دارد،که معمولا باید به دیتاشیت هر ایسی مراجعه کنید،تا ببینید چه چیزی می باشد! (ولی معمولا و اکثر همین می باشد ! یعنی 1010)
بعد از ان چهار بیت،سه بیت دیگر وجود دارد،که بستگی دارد شما پایه ها A0 , A1 , A2 ایسی را در چه وضعیتی قرار داده باشید! (که ما در این پروژه همه را GND یا صفر کرده ه ایم، پس وضعیت انها همگی صفر می باشد 000)
بیت آخر نیز خواندن و نوشتن بر روی ایسی می باشد،اگر قصد داشته باشیم، اطلاعاتی بر روی ایسی ذخیره کنیم،آن را در وضعیت صفر قرار میدهیم، و اگر قصد داشته باشیم،اطلاعاتی از ایسی بخوانیم باید آن را 1 کنیم .

اما بطوری کلی برای اینکه،بخواهیم اطلاعاتی بر روی ایسی ذخیره کنیم،باید اطلاعات را اینطوری برای ایسی بفرستیم (طبق دیتاشیت ایسی)
تصویر
  که در توضیحات عکس نیز دیده میشود، ابتدا بیت شروع،سپس بایت آدرس،سپس *دو بایت آدرس خانه ذخیری سازی حافظه EEPROM ،سپس دیتا(بایت) ما،و در پایان نیز بیت توقف و پایان ارتباط.  *آدرس خانه ذخیر سازی،محلی از حافظه Eeprom است که دیتا در انجا به صورت بایت،ذخیر میشود.هر بایت،از حافظه Eeprom با یک شماره مشخص شده،و می توانیم به انها دسترسی داشته باشیم.حافظه مورد استفاده ما یعنی AT24C32 مجموعا 8192 بایت خانه حافظه دارد،که ما می توانیم به کمک دوبایت آدرس این 8192 بصورت بایت بابیت دسترسی داشته باشیم.  اما برای خواند اطلاعات،باید به مانند شکل زیر عمل کنیم (طبق دیتا شیت) 
تصویر
 ،بیت شروع 1 باید    باید بایت وضعیت آدرس سخت افزاری نوشته شود (که تفاوتی با وضعیت بایت نوشتن قبلی ندارد!)   باید دو بایت آدر خانه سخت افزاری ایسی نوشته    یک بار دیگر بیت start یک شود!   بیت آدرس از دوباره ذکر شود (با این تفاوت که بیت اخر که مربوط به خواندن و نوشتن می باشد،در وضعیت خواند یعنی 1 قرار بگیرید!)   دیتا خوانده    بیت Stop ارسال شود.  در پست بعدی نحویه ارسال اطلاعات به کمک کدیژن بیان میشود..  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی

پست توسط sinaset » دو شنبه 19 مهر 1395, 4:04 pm

بنام خدا
باسلام


اما نحویه برنامه نویسی و پرتئوس!

همانجور که در پست قبل گفتیم ما از ایسی at24C32 استفاده کرده ایم .
تصویر
اکنون می خواهیم،در برنامه شبیه ساز ، حرف "A" رو بر روی خانه 0 ایسی eeprom ذخیره کنیم،سپس بعد از ذخیر سازی،ان را بر روی LCD لود کنیم !

قبل از هر چیز،در برنامه کدویژن باید در قسمت configure، تنظیمات مربوط به I2c را مشخص کنیم،

آدرس در کدویژن ==> project/configure/c compiler/Libraries/I2C
تصویر
در این قسمت باید پایه کلاک SCL و پایه دیتا DATA که به میکرو اتصال پیدا کرده اند را مشخص کنید. (به مانند تصویر بالا)

در ادامه،بعد از مشخص کردن پایه ها، باید همراه به کتابخانه لازم،کتابخانه، i2C را معرفی کنیم

کد: انتخاب همه

#include <i2c.h> //i2c فرخواني کتابخانه

سپس در مرحله بعد،برای راحتی کارهای ما در برنامه،دو شناسه ،مربوط به آدرس سخت افزاری ایسی و آدرس سخت افزاری برای زمان که قصد خواندن از حافظه EEPROM را تعریف می کنیم

کد: انتخاب همه

#define EEPROM_BUS_ADDRESS 160 //ادرس سخت افزاري ايسي
#define EEPROM_REED_ADDRESS 161 //آدرس شناسايي براي زماني که قصد خواندن اطلاعات را داريم

همانجور که می ببینید مقدار EEPROM_BUS_ADDRESS (آدرس سخت افزاری برای شناسایی ایسی و برای نوشتن بر روی آیسی نیز استفاده میشود)برابر با 160 دسیمال می باشد! که به باینری میشود 10100000 ، همان مقداری که در پست بالا بطور مفصل تر توضیح دادیم
و در یک شناسه دیگر EEPROM_REED_ADDRESS برابر با 161 دسیمال می باشد که به باینری 10100001 می باشد، همان مقداری که در اخر پست قبل ان را توضیح دادیم، مقداری که زمانی که برای ایسی فرستاده شود،می توان مقداری را از ایسی خواند!

اما در ادامه کارهای مهم ، وارد تابع main می شویم ، در انجا ابتدا باید، i2c را مقدار دهی اولیه کنیم.

کد: انتخاب همه

i2c_init(); //i2c مقدار دهي اوليه

اکنون میکروکنترولر خود را اماده کرده است تا به ایسی ارتباط برقرار کند.
برای شروع ابتدا به کمک دستور زیر (که مربوط به تابع i2c می باشد ) بیت شروع را برای ایسی ارسال می کنیم( بیت شروع را در پست قبل توضیح دادیم)

کد: انتخاب همه

i2c_start(); //پالس ابتدايي براي شروعي کار

بعد از فرستادن دستور شروع، آدرس سخت افزاری ایسی را به کمک دستور ()i2c_write برای ایسی ارسال می کنیم:

کد: انتخاب همه

i2c_write(EEPROM_BUS_ADDRESS); //ادرس سخت افزاري ايسي
همانجور که می ببینید، بین دستور i2c_write ، شناسه آدرس سخت افزاری (که 160 یا 10100000 می باشد) برای ایسی ارسال می شود،تا بعد از صحیح بودن ادرس، ایسی خود را برای دستور بعدی ما،خود را اماده کند!

اما در ادامه،باید، آدرس خانه حافظه،برای ذخیر شدن اطلاعات در ایسی را ارسال کنیم، (همانجور که در پست گذشته گفتیم،آدرس خانه ها ،مجموعه دو بایت می باشد!) چون ما قصد داریم،در آدرس 0،دیتا را ذخیر کنیم،هر دو بایت را برابر با 0 قرار میدهیم:

کد: انتخاب همه

i2c_write(0); //بايت اول آدرس شناسايي حافظه
i2c_write(0); //بايت دوم آدرس شناسايي حافظه

اکنون که ادرس را برای ایسی فرستاده ایم،باید دیتا را بفرستیم،که ما قصد داریم حرف A را ذخیر کنیم برای این منظور،کد زیر را ارسال می کنیم:

کد: انتخاب همه

i2c_write('A'); // حال بايد ديتا (که نهايت بايد يک بايت باشد)را مي نويسيم

خوب کار تمام است و اطلاعات بر روی ایسی ذخیر شده است! ولی هنوز ارتباط i2c برقرار است!برای همین باید دستور stop (که همان بیت stop می باشد) را برای ایسی ارسال کنیم

کد: انتخاب همه

i2c_stop(); // را نگه داريمi2c و در نهايت بعد از اتمام رايت بايد،واحد

و در پایان باید 5 میلی ثانیه تاخیر نیز لحاظ شود (حافظه eeprom سرعت پایین در ذخیر سازی دارد،که در حدود چند میلی ثانیه می باشد، برای همین بعد از ذخیره سازی هر دیتا،یک تاخیر 5 میلی ثانیه باید لحاظ باید بشود)

-----
[HIGHLIGHT=#76923c]اما برای خواندن دیتا از ایسی: 
ابتدا بیت start ارسال می کنیم

کد: انتخاب همه

i2c_start(); //ايجاد پالس استارت

سپس آدرس سخت افزاری ایسی را ارسال می کنیم

کد: انتخاب همه

i2c_write(EEPROM_BUS_ADDRESS); //ادرس سخت افزاري

سپس آدرس خانه حافظه را از ارسال می کنیم (چون دیتا در ادرس 0 صفر می باشد، آدرس هردو بایت 0 قرار میدهیم)

کد: انتخاب همه

i2c_write(0); //بايت اول آدرس شناسايي حافظه
i2c_write(0); //بايت دوم آدرس شناسايي حافظه

اما در ادامه،باید یک بار دیگر بیت شروع را از دوباره بفرستیم!

کد: انتخاب همه

i2c_start(); //ارسال دوباره بيت ارسال

در ادامه،باید آدرس سخت افزاری،برای خواندن اطلاعات را ارسال کنیم (که در واقع همان آدرس سخت افزاری ایسی می باشد! با این تفاوت که فقط بیت اخر،که مربوط به نوشتن و خواندن می باشد، 1 میشود)

کد: انتخاب همه

i2c_write(EEPROM_REED_ADDRESS); // ارسال ادرس براي خواندن اطلاعات از حافظه

حال به کمک دستور زیر،دیتا را می خوانیم و د متغیر مدنظرمان میریزیم

کد: انتخاب همه

data=i2c_read(0); //خواندن بايت ،و ريختن ان در متغير

دیتا به درون متغیر data ریخته میشود!
اکنون دیگر همه چیز اماده است و می توانیم دیتا را بر روی LCD نمایش بدهیم !

کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project :LOAD AND Save Byte in memory EEPROM 32KIb
Version :1.0
Date :1395.7.14
edit :sinaset
site : centralclubs.com

Chip type : ATmega8
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
#include <i2c.h> //i2c فرخواني کتابخانه
#define EEPROM_BUS_ADDRESS 160 //ادرس سخت افزاري ايسي
#define EEPROM_REED_ADDRESS 161 //آدرس شناسايي براي زماني که قصد خواندن اطلاعات را داريم
unsigned char data,str[16];

void main(void)
{

i2c_init(); //i2c مقدار دهي اوليه
lcd_init(16);

lcd_gotoxy(0,0);
lcd_puts("End name Of god");
delay_ms(500);
lcd_gotoxy(0,1);
lcd_puts("Save Load Eeprom");
delay_ms(500);

/*عمليات ذخير سازي يک بايت اطلاعات بر روي حافظه */
i2c_start(); //پالس ابتدايي براي شروعي کار
i2c_write(EEPROM_BUS_ADDRESS); //ادرس سخت افزاري ايسي
//به کمک اين دو بايت،آدرس محل ذخيره شدن اطلاعات مشخص ميشود
i2c_write(0); //بايت اول آدرس شناسايي حافظه
i2c_write(0); //بايت دوم آدرس شناسايي حافظه
//
// که در بالا آدرس صفر که همان بايت اول مي باشد انتخاب مي شود
i2c_write('A'); // حال بايد ديتا (که نهايت بايد يک بايت باشد)را مي نويسيم
i2c_stop(); // را نگه داريمi2c و در نهايت بعد از اتمام رايت بايد،واحد
delay_ms(5); // 5ميلي ثانيه تاخير براي
///
////******///////

/*عمليات خواندن بايت ذخيره شده از حافظه*/
i2c_start(); //ايجاد پالس استارت
i2c_write(EEPROM_BUS_ADDRESS); //ادرس سخت افزاري

//به کمک اين دو بايت،آدرس محل ذخيره شدن اطلاعات مشخص ميشود
i2c_write(0); //بايت اول آدرس شناسايي حافظه
i2c_write(0); //بايت دوم آدرس شناسايي حافظه
//
i2c_start(); //ارسال دوباره بيت ارسال

i2c_write(EEPROM_REED_ADDRESS); // ارسال ادرس براي خواندن اطلاعات از حافظه
data=i2c_read(0); //خواندن بايت ،و ريختن ان در متغير
i2c_stop(); //پايان ارتباط
delay_ms(5); //تاخير 5 ميلي ثانيه ي

if(data=='A') //در صورتي که عمليات با موفقيت انجام شد
{
lcd_clear();
sprintf(str,"EEPROM:%c",data); //ريختن بايت بدست امده در يک رشته
lcd_gotoxy(0,0);
lcd_puts(str); //چاپ بايت بر روي ال سي دي
lcd_gotoxy(0,1);
lcd_puts("Save Load OK!");
}
else lcd_clear(),lcd_puts("ERROR !!!!"); // در غير اين صورت اخطار داده شود

while (1){ }
}
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]برنامه و شبیه ساز.

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی(ارتباط چندگانه،بزودی..)

پست توسط sinaset » یک شنبه 12 شهریور 1396, 3:37 pm

بنام خدا
باسلام


ارتباط با 4 ایسی EEPROM !
 تصویر 
در این طرح جالب،ما با 4 ایسی EEPROM با حجم 32 کیلوبیت ،بر روی دو سیم،ارتباط برقرار می کنیم و بر روی هر کدام یکی از ایسی حافظه یک حروف الفبا را ابتدا ذخیره سازی می کنیم،سپس ان را بارگزاری می کنیم و به روی LCD نمایش میدهیم.

مراحل سخت افزاری !

برای اینکه،هر ایسی را به صورت جداگانه فراخوانی کنیم،باید به صورت سخت افزار برای هرکدام،کدی را مشخص کنیم.!

 تصویر
همانجور که در تصویر بالا می ببینید،
ایسی اول U1 را برابر با 000 (هر سه پایه زمین)
ایسی دوم U2 را برابر با 001 (پایه اول Vcc باقی پایه ها زمین)
ایسی سوم U3 را برابر با 010 (پایه اول زمین ، پایه دوم VCC پایه سوم زمین)
ایسی چهارم U4 را برابر با 100 (پایه سوم VCC و باقی پایه ها زمین)    هر ایسی یک کد مشخص دارد و برای فراخوانی هر ایسی کافیست،کد مربوط به ان را ارسال کنید،تا ارتباط I2C بین میکرو و ایسی حافظه برقرار شود.  کدنویسی و باقی مراحل.   راحتی کار،در ابتدا برنامه،به کمک چند متغیر شناسه ی(Define) ، کدهای شناسه ای هر ایسی را تعریف می کنیم. 

کد: انتخاب همه

#define EEPROM_BUS_ADDRESS_IC1 0b10100000    //ادرس ايسي اول
#define EEPROM_BUS_ADDRESS_IC2 0b10100010    //ادرس ايسي دوم
#define EEPROM_BUS_ADDRESS_IC3 0b10100100    //ادرس ايسي سوم
#define EEPROM_BUS_ADDRESS_IC4 0b10101000    //ادرس ايسي چهارم


*سه بیت اول، مروبوط به کد شناسه ی سخت افزاری هر ایسی می باشد!

برای نوشتن و خواندن بر روی ایسی ها، از دو تابع استفاده می کنیم.!

تابع نوشتن :


کد: انتخاب همه

void eeprom_write(char address ,char data,unsigned char IC){
unsigned char Address_Ic,KJJ;
if(IC==1)Address_Ic=EEPROM_BUS_ADDRESS_IC1;
if(IC==2)Address_Ic=EEPROM_BUS_ADDRESS_IC2;
if(IC==3)Address_Ic=EEPROM_BUS_ADDRESS_IC3;
if(IC==4)Address_Ic=EEPROM_BUS_ADDRESS_IC4;
i2c_start();
i2c_write(Address_Ic);
i2c_write(0x00);
i2c_write(address);
i2c_write(data);
i2c_stop();
delay_ms(5);
}


باید به این تابع علاوه بر بایت برای نوشتن شدن، ایسی(اول یا دوم یا سوم یا چهارم) برای ذخیره سازی نیز داده شود.(این تابع برای راحتی کار نوشته شده است)

تابع خواندن:


کد: انتخاب همه

unsigned char eeprom_read(char address,unsigned char IC){
unsigned char data,Address_Ic;
if(IC==1)Address_Ic=EEPROM_BUS_ADDRESS_IC1;
if(IC==2)Address_Ic=EEPROM_BUS_ADDRESS_IC2;
if(IC==3)Address_Ic=EEPROM_BUS_ADDRESS_IC3;
if(IC==4)Address_Ic=EEPROM_BUS_ADDRESS_IC4;
i2c_start();             //ايجاد پالس استارت
i2c_write(Address_Ic); //ادرس سخت افزاري
i2c_write(0x00);          //هشت بيت اول ادرس خت افزاري ذخير
i2c_write(address);         //هشت بيت دوم ادرس ذخير سازي ذخيره
i2c_start();
i2c_write(Address_Ic+1);
data=i2c_read(0);
i2c_stop();
delay_ms(5);
return data;
}


در این تابع ،باید ایسی و ادرس خانه بایت (حافظه برای خواندن)، مشخص شود.

برنامه و تابع اصلی

در حلقه اصلی برنامه، ابتدا،ایسی به نوبت فراخوانی میشود و بر روی هر کدام به ترتیب A و B و C و D (کد اسکی) ذخیره سازی میشود!

کد: انتخاب همه

      lcd_gotoxy(0,0);
      lcd_putsf("Save ABCD IN 4IC");
      delay_ms(2000);
      lcd_clear(); 
      
      lcd_gotoxy(0,0);
      lcd_putsf("IC1 SAVE..");      
      eeprom_write(0,'A',1),delay_ms(1000);

      lcd_gotoxy(0,0);
      lcd_putsf("IC2 SAVE..");      
      eeprom_write(0,'B',2),delay_ms(1000);

      lcd_gotoxy(0,0);
      lcd_putsf("IC3 SAVE..");
      eeprom_write(0,'C',3),delay_ms(1000);

      lcd_gotoxy(0,0);
      lcd_putsf("IC4 SAVE.."); 
      eeprom_write(0,'D',4),delay_ms(1000);

      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_putsf("COMPLETE SAVE");
      delay_ms(2000);


در پایان نیز، ایسی ها تک تک فراخوانی میشوند و اطلاعات ذخیره شده بر انها، خوانده و نمایش داده میشود.

کد: انتخاب همه

      for(x=1;x<5;x++){
      if(x==1)k=eeprom_read(9,x),sprintf(str,"IC1:%c   ",k),lcd_puts(str);
      if(x==2)k=eeprom_read(9,x),sprintf(str,"IC2:%c   ",k),lcd_puts(str);
      if(x==3)k=eeprom_read(9,x),sprintf(str,"IC3:%c   ",k),lcd_puts(str);
      if(x==4)k=eeprom_read(9,x),sprintf(str,"IC4:%c",k),lcd_puts(str);
      delay_ms(600);
      };


کل کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project :save data in 4 ic EEprom
Version :1.0
Date    :1395.6.10
Author  : sinaset


Chip type         : ATmega8
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
#include <i2c.h>         //کتابخانه

#define EEPROM_BUS_ADDRESS_IC1 0b10100000    //ادرس ايسي اول
#define EEPROM_BUS_ADDRESS_IC2 0b10100010    //ادرس ايسي دوم
#define EEPROM_BUS_ADDRESS_IC3 0b10100100    //ادرس ايسي سوم
#define EEPROM_BUS_ADDRESS_IC4 0b10101000    //ادرس ايسي چهارم


unsigned char eeprom_read(char address,unsigned char IC){   //تابع خواندن
unsigned char data,Address_Ic;
if(IC==1)Address_Ic=EEPROM_BUS_ADDRESS_IC1;
if(IC==2)Address_Ic=EEPROM_BUS_ADDRESS_IC2;
if(IC==3)Address_Ic=EEPROM_BUS_ADDRESS_IC3;
if(IC==4)Address_Ic=EEPROM_BUS_ADDRESS_IC4;
i2c_start();             //ايجاد پالس استارت
i2c_write(Address_Ic); //ادرس سخت افزاري
i2c_write(0x00);          //هشت بيت اول ادرس خت افزاري ذخير
i2c_write(address);         //هشت بيت دوم ادرس ذخير سازي ذخيره
i2c_start();
i2c_write(Address_Ic+1);
data=i2c_read(0);
i2c_stop();
delay_ms(5);
return data;
}
void eeprom_write(char address ,char data,unsigned char IC){      //تابع نوشتن
unsigned char Address_Ic;
if(IC==1)Address_Ic=EEPROM_BUS_ADDRESS_IC1;
if(IC==2)Address_Ic=EEPROM_BUS_ADDRESS_IC2;
if(IC==3)Address_Ic=EEPROM_BUS_ADDRESS_IC3;
if(IC==4)Address_Ic=EEPROM_BUS_ADDRESS_IC4;
i2c_start();
i2c_write(Address_Ic);
i2c_write(0x00);
i2c_write(address);
i2c_write(data);
i2c_stop();
delay_ms(5);
}

void main(void)
{
unsigned char str[16],x,k;

i2c_init();
lcd_init(16);

      lcd_gotoxy(0,0);
      lcd_putsf("Save ABCD IN 4IC");
      delay_ms(2000);
      lcd_clear(); 
      
      lcd_gotoxy(0,0);
      lcd_putsf("IC1 SAVE..");      
      eeprom_write(0,'A',1),delay_ms(1000);      //ذخيره اطلاعات برروي ايسي اول

      lcd_gotoxy(0,0);
      lcd_putsf("IC2 SAVE..");      
      eeprom_write(0,'B',2),delay_ms(1000);        //ذخيره اطلاعات برروي ايسي دوم

      lcd_gotoxy(0,0);
      lcd_putsf("IC3 SAVE..");
      eeprom_write(0,'C',3),delay_ms(1000);       //ذخيره اطلاعات برروي ايسي سوم

      lcd_gotoxy(0,0);
      lcd_putsf("IC4 SAVE..");                //ذخيره اطلاعات بر روي ايسي چهارم
      eeprom_write(0,'D',4),delay_ms(1000);

      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_putsf("COMPLETE SAVE");
      delay_ms(2000);
      
      lcd_clear();
      lcd_gotoxy(0,0);   
      lcd_putsf("LOAD DATA 4IC..");
      delay_ms(2000);   
      lcd_clear();
      lcd_gotoxy(0,0);   
      
      for(x=1;x<5;x++){        //خواندن اطلاعات 4 ايسي
      if(x==1)k=eeprom_read(9,x),sprintf(str,"IC1:%c   ",k),lcd_puts(str);
      if(x==2)k=eeprom_read(9,x),sprintf(str,"IC2:%c   ",k),lcd_puts(str);
      if(x==3)k=eeprom_read(9,x),sprintf(str,"IC3:%c   ",k),lcd_puts(str);
      if(x==4)k=eeprom_read(9,x),sprintf(str,"IC4:%c",k),lcd_puts(str);
      delay_ms(600);
      };

while (1)
    {      
    }
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]برنامه و پرتئوس

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی(ارتباط چندگانه با 4 ایسی

پست توسط sinaset » جمعه 31 شهریور 1396, 9:37 am

بنام خداوند بخشنده و مهربان
باسلام


خواندن عکس از حافظه EEPROM و نمایش به روی ال سی دی گرافیکی(nokia5110)
تصویر
برای اینکه بتوانیم،عکسی را از حافظه EEPROM بخوانیم،نیاز به سرعت بالایی داریم! برای همین نمی توانیم از طریق کتابخانه I2C که به صورت مجازی واحد I2C را میسازد استفاده کنیم!چون سرعت ان بسیار پایین می باشد.!برای همین باید از خود واحد I2C میکرو (که به TWI معرفی میشود)،کار کنیم و اطلاعات را بخوانیم.

در این طرح،ما از LCD nokia5110 و حافظه 512Kb EEPROM استفاده کرده ایم .(32 کیلوبایت).

در این طرح،دو عکس در سایز 84 و 48 برای ایسی eeprom اماده شده است،این عکس ها حدود 1014 بایت از حافظه ایسی را اشغال می کنند(که البته بسیار خوب و کم حجم شده است) (بطور کلی شاید با این روش بتوان حدود 90 خورده ای عکس(برای LCDnokia 812) را در یک حافظه 512 کیلوبیتی جایی داد.)

این برنامه بیشتر یک تابع اصلی دارد،که به کمک ان اطلاعات خواند و سپس بروی ال سی دی نمایش داده میشود.

کد: انتخاب همه

unsigned char PIC_LOAD_twi(unsigned int address){ //تابع براي خواند اطلاعات بايت هاي عکس از حافظه
unsigned char data,address1,address2,X=0,Y=0,fx;
unsigned int ix;
bit data_pic;

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS);

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS);


for(ix = 0; ix <510; ix++) //به کمک اين حلقه تک تک بايت خوانده و براي ال سي دي فرستاده ميشود
{
data=twi_read(0);
for(fx = 0; fx <8; fx++)
{
if(data & 0x01)data_pic=1;
else data_pic=0;
glcd_putpixel(X,fx+Y,data_pic);
data >>= 1;
}
X++;
if(X==84)X=0,Y=Y+8;
}

//data=twi_read(0);
twi_stop();
//return data;
}

وظیفه این تابع نوشته شده(که کمی دشوار نیز بود)،خواندن اطلاعات و بلافاصله نمایش بایت دریافتی بر روی LCD می باشد. این تابع،تقریبا تمام کارها را راحت کرده است! چراکه در برنامه فقط باید شماره ادرس شروع عکس (در حافظه eeprom) را به تابع داد،تا تابع خودش عکس را به روی LCD نمایش بدهد!

به عنوان مثال ،ما دو عکس در فایل BIN برنامه داریم که از ادرس 0 و 509 شروع میشود! پس انها را اینطور وارد می کنیم.

کد: انتخاب همه

PIC_LOAD_twi(1); //خواندن عکس از ادرس 510 در حافظه
PIC_LOAD_twi(510); //خواندن عکس از ادرس 510 در حافظه
*برای خواندن از حافظه یک عدد بیشتر باید اعمال شود


کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project :READ PIC EEPROM
Version : 1.0
Date : 1396.6.31
Author : sinaset
centralclubs.com

Chip type : ATmega8
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <glcd.h> //کتابخانه ال سي دي گرافيکي
#include <font5x7.h> //کتابخانه فونت
#include "twi_master.h" //کتابخانه خواندن کار با واحد تي وي اي

#define EEPROM_BUS_ADDRESS 160 //ادرس هايي شناسايي حافظه اي اي پي رام
#define EEPROM_REED_ADDRESS 161

unsigned char PIC_LOAD_twi(unsigned int address){ //تابع براي خواند اطلاعات بايت هاي عکس از حافظه
unsigned char data,address1,address2,X=0,Y=0,fx;
unsigned int ix;
bit data_pic;

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS);

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS);


for(ix = 0; ix <510; ix++) //به کمک اين حلقه تک تک بايت خوانده و براي ال سي دي فرستاده ميشود
{
data=twi_read(0);
for(fx = 0; fx <8; fx++)
{
if(data & 0x01)data_pic=1;
else data_pic=0;
glcd_putpixel(X,fx+Y,data_pic);
data >>= 1;
}
X++;
if(X==84)X=0,Y=Y+8;
}

//data=twi_read(0);
twi_stop();
//return data;
}



void main(void)
{

GLCDINIT_t glcd_init_data;
delay_ms(200);
glcd_init_data.font=font5x7;
glcd_init_data.readxmem=NULL;
glcd_init_data.writexmem=NULL;
glcd_init_data.temp_coef=PCD8544_DEFAULT_TEMP_COEF;
glcd_init_data.bias=PCD8544_DEFAULT_BIAS;
glcd_init_data.vlcd=PCD8544_DEFAULT_VLCD;
glcd_init(&glcd_init_data);


twi_init(); // مقداري دهي اوليه به واحد TWI

PIC_LOAD_twi(1); //خواندن عکس اول از ادرس 1 در حافظه
delay_ms(2500);
glcd_clear();

PIC_LOAD_twi(510); //خواندن عکس از ادرس 510 در حافظه
delay_ms(2500);
glcd_clear();



while (1)
{
}
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] سورس،شبیه ساز،فایل Bin.برای ایسی حافظه
*فایل Bin به نام Edit.bin می باشد،برای پروگرام کردن اطلاعات از یک پروگرام استفاده کنید(بعضی مدل ها پروگرام ها مثل پروگرام ها ECA داری جایگاه پروگرام اطلاعات برروی حافظه EEPROM از انها نیز استفاده کنید)

**استفاده و فروش و .. کدها حرام می باشد! اینها کدها،جنبه اموزشی و .. دارد
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 1
تاریخ عضویت: چهار شنبه 30 دی 1388, 1:26 pm
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 2 بار

Re: آموزش کار با حافظه EEPROM خارجی(ارتباط چندگانه با 4 ایسی

پست توسط Ehsan_ne0 » چهار شنبه 5 اردیبهشت 1397, 9:30 pm

sinaset نوشته شده:بنام خداوند بخشنده و مهربان
باسلام


خواندن عکس از حافظه EEPROM و نمایش به روی ال سی دی گرافیکی(nokia5110) تصویر برای اینکه بتوانیم،عکسی را از حافظه EEPROM بخوانیم،نیاز به سرعت بالایی داریم! برای همین نمی توانیم از طریق کتابخانه I2C که به صورت مجازی واحد I2C را میسازد استفاده کنیم!چون سرعت ان بسیار پایین می باشد.!برای همین باید از خود واحد I2C میکرو (که به TWI معرفی میشود)،کار کنیم و اطلاعات را بخوانیم.

در این طرح،ما از LCD nokia5110 و حافظه 512Kb EEPROM استفاده کرده ایم .(32 کیلوبایت).

در این طرح،دو عکس در سایز 84 و 48 برای ایسی eeprom اماده شده است،این عکس ها حدود 1014 بایت از حافظه ایسی را اشغال می کنند(که البته بسیار خوب و کم حجم شده است) (بطور کلی شاید با این روش بتوان حدود 90 خورده ای عکس(برای LCDnokia 812) را در یک حافظه 512 کیلوبیتی جایی داد.)

این برنامه بیشتر یک تابع اصلی دارد،که به کمک ان اطلاعات خواند و سپس بروی ال سی دی نمایش داده میشود.

کد: انتخاب همه

unsigned char PIC_LOAD_twi(unsigned int address){      //تابع براي خواند اطلاعات  بايت هاي عکس از حافظه
unsigned char data,address1,address2,X=0,Y=0,fx;
unsigned  int ix;
bit data_pic;

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS); 

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS);    


  for(ix = 0; ix <510; ix++)       //به کمک اين حلقه تک تک بايت خوانده و براي ال سي دي فرستاده ميشود
    {
    data=twi_read(0);
    for(fx = 0; fx <8; fx++)      
    {
     if(data & 0x01)data_pic=1; 
     else data_pic=0;
     glcd_putpixel(X,fx+Y,data_pic);   
     data >>= 1;         
    }
    X++;
    if(X==84)X=0,Y=Y+8;
    }
   
//data=twi_read(0);
twi_stop();
//return data;
}


وظیفه این تابع نوشته شده(که کمی دشوار نیز بود)،خواندن اطلاعات و بلافاصله نمایش بایت دریافتی بر روی LCD می باشد. این تابع،تقریبا تمام کارها را راحت کرده است! چراکه در برنامه فقط باید شماره ادرس شروع عکس (در حافظه eeprom) را به تابع داد،تا تابع خودش عکس را به روی LCD نمایش بدهد!

به عنوان مثال ،ما دو عکس در فایل BIN برنامه داریم که از ادرس 0 و 509 شروع میشود! پس انها را اینطور وارد می کنیم.

کد: انتخاب همه

      PIC_LOAD_twi(1);   //خواندن عکس از ادرس 510 در حافظه
      PIC_LOAD_twi(510);   //خواندن عکس از ادرس 510 در حافظه

*برای خواندن از حافظه یک عدد بیشتر باید اعمال شود


کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project :READ PIC EEPROM
Version : 1.0
Date    : 1396.6.31
Author  : sinaset
centralclubs.com

Chip type         : ATmega8
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <glcd.h>                  //کتابخانه ال سي دي گرافيکي
#include <font5x7.h>               //کتابخانه فونت
#include "twi_master.h"              //کتابخانه خواندن کار با واحد تي وي اي

#define EEPROM_BUS_ADDRESS 160           //ادرس هايي شناسايي حافظه اي اي پي رام
#define EEPROM_REED_ADDRESS 161

unsigned char PIC_LOAD_twi(unsigned int address){      //تابع براي خواند اطلاعات  بايت هاي عکس از حافظه
unsigned char data,address1,address2,X=0,Y=0,fx;
unsigned  int ix;
bit data_pic;

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS); 

address1=(address>>8);
address2=address;
twi_start();
twi_write(EEPROM_BUS_ADDRESS);
twi_write(address1);
twi_write(address2);
twi_start();
twi_write(EEPROM_REED_ADDRESS);    


  for(ix = 0; ix <510; ix++)       //به کمک اين حلقه تک تک بايت خوانده و براي ال سي دي فرستاده ميشود
    {
    data=twi_read(0);
    for(fx = 0; fx <8; fx++)      
    {
     if(data & 0x01)data_pic=1; 
     else data_pic=0;
     glcd_putpixel(X,fx+Y,data_pic);   
     data >>= 1;         
    }
    X++;
    if(X==84)X=0,Y=Y+8;
    }
   
//data=twi_read(0);
twi_stop();
//return data;
}



void main(void)
{

GLCDINIT_t glcd_init_data;
delay_ms(200);
glcd_init_data.font=font5x7;
glcd_init_data.readxmem=NULL;
glcd_init_data.writexmem=NULL;
glcd_init_data.temp_coef=PCD8544_DEFAULT_TEMP_COEF;
glcd_init_data.bias=PCD8544_DEFAULT_BIAS;
glcd_init_data.vlcd=PCD8544_DEFAULT_VLCD;
glcd_init(&glcd_init_data);

    
      twi_init();   //    مقداري دهي اوليه به واحد TWI
      
      PIC_LOAD_twi(1);    //خواندن عکس اول از ادرس 1 در حافظه
      delay_ms(2500);
      glcd_clear(); 
      
      PIC_LOAD_twi(510);   //خواندن عکس از ادرس 510 در حافظه
      delay_ms(2500);
      glcd_clear();
   
      

while (1)
    {            
    }
}



[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] سورس،شبیه ساز،فایل Bin.برای ایسی حافظه
*فایل Bin به نام Edit.bin می باشد،برای پروگرام کردن اطلاعات از یک پروگرام استفاده کنید(بعضی مدل ها پروگرام ها مثل پروگرام ها ECA داری جایگاه پروگرام اطلاعات برروی حافظه EEPROM از انها نیز استفاده کنید)

**استفاده و فروش و .. کدها حرام می باشد! اینها کدها،جنبه اموزشی و .. دارد
باتشکر.


خیلی خیلی خوب بود مرسی فقط یه سوال با چه برنامه یا روشی عکس رو به فایل bin تبدیل کردی
با تشکر

Colonel II
Colonel II
نمایه کاربر
پست: 6975
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9179 بار
سپاس‌های دریافتی: 20979 بار
تماس:

Re: آموزش کار با حافظه EEPROM خارجی(خواندن و نمایش عکس!برروی

پست توسط sinaset » چهار شنبه 5 اردیبهشت 1397, 9:44 pm

سلام بر شما
خواهش میکنم،تشکر از نظرتون ..

از نرم افزار bmp2h_conv (در اینترنت همین را جستجو کنید،تا فایل ها دانلود را ببینید)

نیاز به تنظیمات نیز دارد! باید مقداری روی ان کار کنید!

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”