فهرست مطالب:

خواندن و نوشتن داده ها در EEPROM خارجی با استفاده از آردوینو: 5 مرحله
خواندن و نوشتن داده ها در EEPROM خارجی با استفاده از آردوینو: 5 مرحله

تصویری: خواندن و نوشتن داده ها در EEPROM خارجی با استفاده از آردوینو: 5 مرحله

تصویری: خواندن و نوشتن داده ها در EEPROM خارجی با استفاده از آردوینو: 5 مرحله
تصویری: Marlin Firmware 2.0.x Explained 2024, جولای
Anonim
خواندن و نوشتن داده ها در EEPROM خارجی با استفاده از آردوینو
خواندن و نوشتن داده ها در EEPROM خارجی با استفاده از آردوینو

EEPROM مخفف عبارت Electrically Erasable Programmable Read-Only Memory (حافظه فقط قابل خواندن با قابلیت برنامه ریزی الکتریکی) است.

EEPROM بسیار مهم و مفید است زیرا یک شکل غیر فرار از حافظه است. این بدان معناست که حتی هنگامی که برد خاموش است ، تراشه EEPROM هنوز برنامه ای را که برای آن نوشته شده است حفظ می کند. بنابراین وقتی صفحه را خاموش و سپس دوباره روشن می کنید ، برنامه ای که در EEPROM نوشته شده است قابل اجرا است. بنابراین اساساً EEPROM برنامه ای را ذخیره می کند و اجرا می کند. این بدان معناست که می توانید یک دستگاه را خاموش کنید ، آن را به مدت 3 روز خاموش نگه دارید و برگردید و آن را روشن کنید و همچنان می تواند برنامه ای را که در آن برنامه ریزی شده بود اجرا کند. بیشتر دستگاه های الکترونیکی مصرفی اینگونه کار می کنند.

این پروژه توسط LCSC حمایت می شود. من از قطعات الکترونیکی LCSC.com استفاده می کنم. LCSC متعهد است که مجموعه گسترده ای از قطعات الکترونیکی اصلی و با کیفیت را با بهترین قیمت با یک شبکه حمل و نقل جهانی به بیش از 200 کشور ارائه دهد. همین امروز ثبت نام کنید و در اولین سفارش 8 دلار تخفیف بگیرید.

EEPROM همچنین بسیار کارآمد است زیرا بایت های فردی در EEPROM سنتی می توانند به طور مستقل خوانده ، پاک و بازنویسی شوند. در بیشتر انواع دیگر حافظه های غیر فرار ، این کار امکان پذیر نیست. دستگاه های سری EEPROM مانند Microchip سری 24 EEPROM به شما امکان می دهد حافظه بیشتری به هر دستگاهی که می تواند I²C صحبت کند اضافه کنید.

تدارکات

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. کریستال 16 مگاهرتز
  4. تخته نان
  5. مقاومت 4.7k اهم x 2
  6. خازن 22 pF x 2

مرحله 1: اصول اولیه EEPROM

اصول EEPROM
اصول EEPROM

تراشه Microchip 24LC2512 را می توان در بسته DIP 8 پین خریداری کرد. پین های 24LC512 بسیار مستقیم هستند و شامل قدرت (8) ، GND (4) ، حفاظت از نوشتن (7) ، SCL/SDA (6 ، 5) و سه پین آدرس (1 ، 2 ، 3) است.

مختصری از تاریخچه ROM

رایانه های اولیه "Stored -Program" - مانند ماشین حساب های میز و مترجمان صفحه کلید - شروع به استفاده از ROM در قالب ROM ماتریس دیود کردند. این یک حافظه متشکل از دیودهای نیمه هادی مجزا بود که روی یک PCB مخصوص سازماندهی شده قرار گرفته بود. این امر با ظهور مدارهای مجتمع جای خود را به Mask ROM داد. Mask ROM شباهت زیادی به Diode Matrix ROM داشت فقط در مقیاس بسیار کوچکتر اجرا شد. با این حال ، این بدان معناست که شما نمی توانید فقط دو دیود را با آهن لحیم کاری جابجا کرده و دوباره برنامه ریزی کنید. Mask ROM باید توسط سازنده برنامه ریزی شود و پس از آن قابل تغییر نیست.

متأسفانه Mask ROM گران بود و زمان زیادی طول می کشید تا تولید شود زیرا هر برنامه جدید نیاز به یک دستگاه کاملاً جدید داشت که توسط یک ریخته گری تولید می شد. اما در سال 1956 ، این مشکل با اختراع PROM (برنامه ریزی ROM) حل شد که به توسعه دهندگان اجازه می داد تراشه ها را خود برنامه ریزی کنند. این بدان معناست که تولیدکنندگان می توانند میلیون ها دستگاه بدون برنامه را تولید کنند که ارزان تر و کاربردی تر است. با این حال ، PROM فقط می تواند یکبار با استفاده از یک دستگاه برنامه نویسی ولتاژ بالا نوشته شود. پس از برنامه ریزی یک دستگاه PROM ، راهی برای بازگشت دستگاه به حالت برنامه ریزی نشده وجود نداشت.

این امر در سال 1971 با اختراع EPROM (ROM قابل برنامه ریزی قابل پاک شدن) تغییر کرد که علاوه بر افزودن یک حرف دیگر به مخفف ، قابلیت پاک کردن دستگاه و بازگشت آن به حالت "خالی" را با استفاده از یک منبع نور قوی UV به ارمغان آورد. درست است ، شما باید یک نور روشن به IC بدهید تا دوباره برنامه ریزی شود ، چقدر خوب است؟ خوب ، به نظر می رسد بسیار عالی است مگر اینکه شما توسعه دهنده ای باشید که روی سیستم عامل کار می کند ، در این صورت واقعاً دوست دارید بتوانید دستگاه را با استفاده از سیگنال های الکتریکی برنامه ریزی مجدد کنید. این امر سرانجام در سال 1983 با توسعه EEPROM (ROM قابل برنامه ریزی قابل پاک شدن با الکتریسیته) به واقعیت پیوست و با آن ، ما به مخفف نامساعد روز جاری می رسیم.

مرحله 2: ویژگی های EEPROM

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

اول از همه ، فناوری ای که باعث می شود EEPROM کار کند ، تعداد دفعات قابل نوشتن مجدد را نیز محدود می کند. این امر با گیر افتادن الکترون ها در ترانزیستورهای تشکیل دهنده ROM و افزایش انباشته تا زمانی که تفاوت بار بین "1" و "0" قابل تشخیص نباشد ، ارتباط دارد. اما نگران نباشید ، اکثر EEPROM ها حداکثر تعداد بازنویسی 1 میلیون یا بیشتر را دارند. تا زمانی که به طور مداوم برای EEPROM نامه ننویسید بعید است که به این حداکثر برسید. ثانیاً ، EEPROM در صورت قطع برق از آن پاک نمی شود ، اما اطلاعات شما را به طور نامحدود حفظ نمی کند. الکترونها می توانند از ترانزیستورها خارج شده و از طریق عایق حرکت کرده و EEPROM را به مرور زمان پاک کنند. گفته می شود ، این معمولاً در طول سالها اتفاق می افتد (اگرچه می تواند با حرارت تسریع شود). اکثر سازندگان می گویند که اطلاعات شما در EEPROM به مدت 10 سال یا بیشتر در دمای اتاق ایمن است. و هنگام انتخاب یک دستگاه EEPROM برای پروژه خود ، یک نکته دیگر را نیز باید در نظر داشته باشید. ظرفیت EEPROM بر حسب بیت اندازه گیری می شود و نه بایت. یک EEPROM 512K 512 کیلوبیت داده ، به عبارت دیگر ، فقط 64 کیلوبایت را در خود ذخیره می کند.

مرحله 3: اتصال سخت افزاری Arduino

اتصال سخت افزاری آردوینو
اتصال سخت افزاری آردوینو
اتصال سخت افزاری آردوینو
اتصال سخت افزاری آردوینو

خوب ، اکنون که می دانیم EEPROM چیست ، بیایید یکی را وصل کنیم و ببینیم چه کاری می تواند انجام دهد! به منظور صحبت کردن دستگاه ما ، ما باید برق و همچنین خطوط سریال I²C را متصل کنیم. این دستگاه به ویژه در 5VDC کار می کند بنابراین ما آن را به خروجی 5 ولت Arduino UNO متصل می کنیم. همچنین خطوط I²C برای ایجاد ارتباط صحیح به مقاومت های کششی احتیاج دارند. ارزش این مقاومت ها بستگی به ظرفیت خطوط و فرکانسی دارد که می خواهید با آن ارتباط برقرار کنید ، اما یک قاعده خوب برای کاربردهای غیر بحرانی فقط حفظ آن در محدوده kΩ است. در این مثال ، ما از مقاومت های کشش 4.7kΩ استفاده می کنیم.

سه پین در این دستگاه برای انتخاب آدرس I²C وجود دارد ، به این ترتیب شما می توانید بیش از یک EEPROM را در گذرگاه داشته باشید و هر کدام را به صورت متفاوتی آدرس دهید. شما فقط می توانید همه آنها را زمین کنید ، اما ما آنها را سیم کشی می کنیم تا بعداً در آموزش ، دستگاهی با ظرفیت بالاتر را رها کنیم.

ما از یک تخته نان برای اتصال همه چیز به یکدیگر استفاده می کنیم. نمودار زیر اتصال صحیح اکثر دستگاههای I²C EEPROM ، از جمله Microchip سری 24 EEPROM را که ما می فروشیم ، نشان می دهد.

مرحله چهارم: خواندن و نوشتن

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

چیزی بنویسید

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

نوشتن یک بایت حافظه به EEPROM به طور کلی در سه مرحله انجام می شود:

  1. مهمترین بایت آدرس حافظه ای را که می خواهید برای آن بنویسید ارسال کنید.
  2. کمترین بایت قابل توجه آدرس حافظه ای را که می خواهید برای آن بنویسید ارسال کنید.
  3. بایت داده ای را که می خواهید در این مکان ذخیره شود ارسال کنید.

احتمالاً چند کلمه کلیدی وجود دارد که توضیح نمی دهد:

آدرس های حافظه

اگر تصور می کنید که همه بایت ها در یک EEPROM 512 Kbit در یک خط از 0 تا 64000 ایستاده اند - زیرا 8 بیت در یک بایت وجود دارد و بنابراین می توانید 64000 بایت را در 512 Kbit EEPROM جا دهید - پس آدرس حافظه محل خطی که در آن یک بایت خاص پیدا می کنید. ما باید آن آدرس را به EEPROM ارسال کنیم تا بداند بایت ارسال شده را در کجا قرار دهیم.

مهمترین و کم اهمیت ترین بایت

از آنجا که 32000 مکان ممکن در 256 Kbit EEPROM وجود دارد - و چون 255 بزرگترین عددی است که می توانید در یک بایت کدگذاری کنید - ما باید این آدرس را در دو بایت ارسال کنیم. اول ، ما مهمترین بایت (MSB) را ارسال می کنیم - 8 بیت اول در این مورد. سپس کمترین بایت (LSB) را ارسال می کنیم - 8 بیت دوم. چرا؟ از آنجا که دستگاه انتظار دارد آنها را دریافت کند ، این تمام است.

صفحه نویسی

نوشتن یک بایت در یک زمان خوب است ، اما اکثر دستگاه های EEPROM دارای چیزی به نام "صفحه نوشتن بافر" هستند که به شما امکان می دهد چندین بایت را همزمان با یک بایت بنویسید. ما در طرح نمونه خود از این مزیت استفاده خواهیم کرد. EEPROM از شمارنده داخلی استفاده می کند که به طور خودکار با هر بایت داده ای که دریافت می کند ، محل حافظه را افزایش می دهد. پس از ارسال آدرس حافظه ، می توانیم آن را تا 64 بایت داده دنبال کنیم. EEPROM (به درستی) فرض می کند که آدرس 312 و 10 بایت بایت 0 را در آدرس 312 ، بایت 1 را در آدرس 313 ، بایت 2 را در آدرس 314 و غیره ثبت می کند.

چیزی بخوانید

خواندن از EEPROM اساساً همان فرآیند سه مرحله ای است که برای نوشتن به EEPROM ارسال می شود:

  1. مهمترین بایت آدرس حافظه ای را که می خواهید برای آن بنویسید ارسال کنید.
  2. کمترین بایت قابل توجه آدرس حافظه ای را که می خواهید برای آن بنویسید ارسال کنید.
  3. بایت داده را در آن مکان درخواست کنید.

مرحله 5: شماتیک و کد

شماتیک و کد
شماتیک و کد

کد:

#عبارتند از

#deepine eeprom 0x50 // آدرس اصلی EEPROM را تعریف می کند

void setup () {

Wire.begin ()؛ // یک شی Wire ایجاد می کند

Serial.begin (9600)؛

آدرس int بدون علامت = 0؛ // اولین آدرس EEPROM

Serial.println ("ما کد پستی 22222 ، کد پستی را می نویسیم") ؛ برای (آدرس = 0 ؛ آدرس <5 ؛ آدرس ++) نوشتن EEPROM (eeprom ، آدرس ، '2') ؛ // 22222 به EEPROM می نویسد

برای (آدرس = 0 ؛ آدرس <5 ؛ آدرس ++) {Serial.print (بخوانید EEPROM (eeprom ، آدرس) ، HEX) ؛ }}

حلقه خالی () {

/*هیچ چیزی در تابع حلقه () وجود ندارد زیرا ما نمی خواهیم آردوینو بارها و بارها یک چیز را به EEPROM بنویسد. ما فقط یک بار نوشتن می خواهیم ، بنابراین تابع حلقه () با EEPROM ها اجتناب می شود.*/}

// تابع writeEEPROM را تعریف می کند

void writeEEPROM (int deviceaddress، int unsigned int eeaddress، byte data) {Wire.beginTransmission (deviceaddress)؛ Wire.write ((int) (eeaddress >> 8))؛ // می نویسد MSB Wire.write ((int) (eeaddress & 0xFF))؛ // LSB Wire.write (داده) را می نویسد. Wire.endTransmission ()؛ }

// تابع readEEPROM را تعریف می کند

بایت readEEPROM (آدرس دستگاه int ، نشانی اینترنتی بدون امضا) {byte rdata = 0xFF؛ Wire.beginTransmission (deviceaddress)؛ Wire.write ((int) (eeaddress >> 8))؛ // می نویسد MSB Wire.write ((int) (eeaddress & 0xFF))؛ // LSB Wire.endTransmission () را می نویسد ؛ سیم. درخواست از (آدرس دستگاه ، 1) ؛ if (Wire.available ()) rdata = Wire.read ()؛ بازگشت داده ها ؛ }

توصیه شده: