راهنمای جامع میکروکنترلر (اجزا، کاربرد و روش کار میکروکنترلر)

روش کار میکرو کنترلر چگونه است؟ آیا فکر می‌کنید می‌توانید بدون استفاده از میکروکنترلرها با نوآوری‌های حوزه فناوری همراه شوید؟ اگر پاسخ شما یک بله بزرگ است، مطمئناً در مسیر اشتباهی قرار دارید. چرا؟
 امروزه چند ده میلیارد دستگاه در سرتاسر جهان از میکروکنترلرها استفاده می‌کنند.یک خانه معمولی در یک کشور توسعه یافته احتمالاً دارای چند دوجین میکروکنترلر است. علاوه بر این، یک خودروی میان رده دارای حدود 30 میکروکنترلر است.
 
از دستگاه‌های مینیاتوری (دما سنج دیجیتال، ساعت‌های هوشمند، ماشین‌حساب، تلفن‌های همراه، دوربین‌ها) گرفته تا لوازم الکترونیکی مصرفی پیشرفته (اجاق‌های مایکروویو، ماشین لباس‌شویی، تلویزیون، یخچال، ماشین‌های خودکار)، تقریباً همیشه یک میکروکنترلر کوچک را خواهید یافت.
 
در این مقاله سعی خواهیم کرد به هر سوالی که ممکن است در مورد روش کار میکرو کنترلرها داشته باشید پاسخ دهیم، از قبیل:
• میکروکنترلر چیست؟
• اجزای میکروکنترلر
• میکروکنترلر چگونه کار می‌کند؟
• معماری میکروکنترلر
• پریفرالهای میکروکنترلر 
• تفاوت بین میکروکنترلر و ریزپردازنده
• کاربردهای میکروکنترلر
 

میکروکنترلر چیست؟

یک "واحد میکروکنترلر" یا "MCU" یک مدار مجتمع (IC) است که به طور موثر دستگاه‌های الکترونیکی را در یک سیستم تعبیه شده یا امبدد بزرگ کنترل می‌کند. در اصطلاح ساده، یک میکروکنترلر ورودی را از کاربر می‌گیرد، سیگنال‌های ورودی را پردازش می‌کند و سپس خروجی را بر اساس تقاضای کاربر نمایش می‌دهد.
 
میکروکنترلر ترکیبی از دو کلمه است: "میکرو" به معنای کوچک و "کنترلر" به معنای توانایی انجام عملکردهای کنترلی است.میکروکنترلر یک دستگاه کنترلی است که تعامل دوستانه بین انسان و دستگاه‌های الکترونیکی را امکان پذیر می‌کند.
 
شما مواد قهوه را در قهوه ساز می‌ریزید و این به تهیه یک قهوه آرامبخش برای شما کمک می‌کند. یا با گلوکزمتر، یک میکروکنترلر به تجزیه و تحلیل سطح گلوکز خون شما کمک می‌کند و آن‌ها را روی صفحه نمایش LCD نمایش می‌دهد. میکروکنترلر به ترموستات  یخچال شما کمک می‌کند تا دمای انجماد را حفظ کند. شما همچنین می‌توانید تایمر روی ماشین لباسشویی خود در هنگام شستن لباس‌های خود تنظیم کنید. میکروکنترلر همچنین به شما کمک می‌کند تا عکس‌های زیبایی از سفرهای خود را از طریق دوربین‌های دیجیتال ضبط، ویرایش و ذخیره کنید.
 
با میکروکنترلرها، امکانات بی پایان است. بیشتر اوقات، شما از یک دستگاه مبتنی بر میکروکنترلر استفاده می‌کنید اما کاملاً از آن آگاه نیستید.
 

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

ممکن است برخی از شما فکر کنید، "چرا میکروکنترلرها ایجاد شدند درحالی‌که رایانه‌های شخصی می‌توانستند چنین وظایفی را با سرعت و دقت بسیار بهتری انجام دهند؟" دیدگاه شما تا آنجا که به جنبه سرعت و دقت مربوط می‌شود صحیح است. اما، موضوع اینجاست…
 
شما نمی‌توانید رایانه‌های شخصی را در همه جا برای کارهای مینیاتوری مستقر کنید، زیرا این کار بسیار پرهزینه است و فضای بسیار بیشتری نسبت به یک میکروکنترلر نیاز دارد. رایانه شخصی شما می‌تواند ویرایشگر Word، یک برنامه گرافیکی  و تعداد زیادی نرم‌افزار سنگین دیگر را هم‌زمان اجرا کند.
 
 اما، چرا می‌خواهید از چنین کامپیوتر قدرتمندی فقط برای ردیابی ماشین خود استفاده کنید و سپس یک درب گاراژ ساده را باز کنید؟ این کار باعث اتلاف عظیم منابع کامپیوتری و پولی که به سختی به دست آورده‌اید و نیروی الکتریسیته خواهد شد. پس راه حل چیست؟ خب، اینجاست که میکروکنترلرها به شما سلام می‌کنند!
 
میکروکنترلرها بسیار کاربردی هستند. شما به راحتی می‌توانید یک میکروکنترلر را برای انجام یک کار اختصاصی و برای یک برنامه خاص برنامه ریزی کنید، آن هم با کاهش بسیار زیاد هزینه و توان الکتریکی مورد نیاز.
 
برای یک برنامه معمولی، یک کامپیوتر شخصی به 50 وات توان نیاز دارد. اما یک میکروکنترلر می‌تواند همان کار را با استفاده از 50 میلی وات انجام دهد. علاوه بر این، یک میکروکنترلر می‌تواند در شرایط سخت مانند داخل محفظه موتور داغ ماشین، در ماهواره‌های فضایی و هوای سرد قطب جنوب کار کند. بااین‌حال، رایانه‌های شخصی برای چنین محیط‌های خشن باید مقاوم باشند.
 
 
 
تا به حال، شما باید اهمیت استفاده از میکروکنترلر در پروژه بعدی خود را درک کرده باشید. اما همه ما باید جنبه‌های فنی هر چیزی را که قصد استفاده از آن را داریم درک کنیم؛ پس حالا کمربندهای  خود را ببندید. قصد داریم به جزئیات دقیق میکروکنترلر بپردازم.
 

اجزای میکروکنترلر

امیدوارم که شما به وضوح درک کرده باشید که "میکروکنترلر چیست" و چرا ما در وهله اول به میکروکنترلر نیاز داریم.اکنون زمان مناسبی است که در مورد اجزایی که با هم ترکیب می‌شوند و یک میکروکنترلر را تشکیل می‌دهند، صحبت کنیم  و مهم‌تر از آن، میکروکنترلرها چگونه دستورالعمل‌های ارسال شده توسط یک کاربر انسانی را پردازش می‌کنند؟
 
شما نمی‌توانید سر میکروکنترلرها فریاد بزنید و بگویید: "یک لیوان آب برای من بیاور". حتی حیوان خانگی شما این را به معنای واقعی درک نمی‌کند. شما باید با میکروکنترلرها به زبانی که آن‌ها می‌فهمند صحبت کنید، زبان باینری. یا ساده‌تر، زبان صفر و یک.
 
در زبان باینری، یک بیت می‌تواند دو مقدار (0 یا 1) داشته باشد. دو بیت می‌تواند به شما چهار مقدار (0 تا 3) بدهد. به طور مشابه، سه بیت می‌توانند هشت مقدار (0 تا 7) داشته باشند. الگوی ایجاد شده در اینجا را مشاهده کنید:
 
 
درحالی‌که دستورالعمل‌های باینری می‌توانند به میکروکنترلرها کمک کنند تا اهداف کاربر را درک کنند، آن‌ها هنوز به مقداری داده (به شکل باینری) برای انجام عملیات مورد نظر نیاز دارند.
 
اجزای یک میکروکنترلر به‌صورت هماهنگ برای انجام عملیات حسابی (جمع، تفریق، ضرب)، منطقی (OR، AND، XOR)، جابجایی (شیفت به چپ، شیفت به راست، چرخش) و حرکت بر روی داده‌های باینری کار می‌کنند. بیایید هر یک از اجزای میکروکنترلر جداگانه را با جزئیات بررسی کنیم.
 

حافظه

زمانی که دستورالعمل‌ها و داده‌ها را دارید، باید آن‌ها را در جایی ذخیره کنید. دستورالعمل‌ها و داده‌ها هر دو در قالب باینری هستند، بنابراین شما به یک دستگاه ذخیره سازی باینری نیاز دارید. در اصطلاح فنی، چنین وسیله‌ای MEMORY نامیده می‌شود.
 
سوال بعدی این است، "یک حافظه چقدر داده/دستورالعمل می‌تواند در خود ذخیره کند؟". حافظه به سلول‌ها تقسیم می‌شود و هر سلول می‌تواند یک بایت (8 بیت) داده را ذخیره کند. علاوه بر این، تعداد خط‌های آدرس نشان می‌دهد که یک حافظه چقدر سلول می‌تواند داشته باشد.
 
 
به‌عنوان‌مثال، یک حافظه تنها با یک خط آدرس می‌تواند به دو سلول (0،1) آدرس‌دهی کند یا 2 بایت را ذخیره کند. به طور مشابه، برای دو خط آدرس، 4 سلول (0، 1، 2، 3) و ذخیره سازی 4 بایتی وجود دارد. برای سه خط حافظه، 8 سلول (0، 1، 2، 3، 4، 5، 6، 7) را هدف قرار می‌دهید یا 8 بایت را ذخیره کنید
 
 
انواع حافظه
 
ما قصد نداریم در این نوشته در مورد روش کار میکرو کنترلرهای قدیمی بحث کنیم اما در میکروکنترلرهای معمولی از سه نوع حافظه استفاده می‌شود. 
 
• حافظه با دسترسی تصادفی (RAM)
• حافظه فقط خواندنی قابل برنامه ریزی با قابلیت پاکسازی الکتریکی (EEPROM)
• فلش مموری
 
حافظه با دسترسی تصادفی (RAM)
 
این یک حافظه فرار است، به این معنی که تنها زمانی می‌توان به آن دسترسی داشت که سیستم روشن باشد. با قطع برق سیستم، محتویات داخل رم نیز پاک می‌شود.این حافظه در مقایسه با دیگر انواع، زمان دسترسی سریع‌تری دارد، اما در مقایسه با سایر موارد گران‌تر است. از این حافظه برای ذخیره داده‌های موقت، در طول اجرای دستورالعمل‌های کاربر استفاده می‌شود.
 
با توجه به توضیح بالا و استفاده محدود، ظرفیت ذخیره سازی رم در اکثر میکروکنترلرهای امروزی کمتر از EEPROM و Flash است.
 
حافظه فقط خواندنی قابل برنامه ریزی با قابلیت پاکسازی الکتریکی (EEPROM)
 
این یک حافظه غیر فرار است، به این معنی که محتویات موجود در حافظه در صورت قطع برق دست نخورده باقی می‌ماند. در این حافظه شما می‌توانید تنها یک بایت را در هر لحظه برنامه ریزی کنید.
 
کاربرد اصلی EEPROM در میکروکنترلر داده‌های ذخیره شده و داده‌های کاربر است. سپس میکروکنترلر یک به یک به دستورالعمل‌ها دسترسی پیدا کرده و آن‌ها را به صورت متوالی اجرا می‌کند. هر بار که کاربر کدهای اجرایی را تغییر می‌دهد، EEPROM باید دوباره برنامه ریزی شود.
 
اکثر سازندگان میکروکنترلر مدارهای اضافی را برای برنامه ریزی EEPROM بعلاوه دستورالعمل‌های کاربری را به مصرف کنندگان ارائه می‌دهند، به‌عنوان‌مثال، برنامه  PICKIT3 برای میکروکنترلرهای PIC.
 
فلش مموری
 
فلش مموری نیز یک حافظه غیر فرار است. درست مانند EEPROM، وقتی برق قطع می‌شود محتوا را از دست نمی‌دهد. بااین‌حال، بر خلاف EEPROM، فقط می‌توان یک بخش کامل یا یک بلوک از بایت‌ها را برنامه ریزی کرد. اگر می‌خواهید یک بایت را ویرایش کنید، باید کل بلوک را مجدد برنامه ریزی کنید. به دلیل نوشتن/پاک کردن عقب و جلو، حافظه فلش سریع‌تر از EEPROM فرسوده می‌شود. به همین دلیل است که حافظه فلش در مقایسه با EEPROM ارزان است.
 
برخی از تولیدکنندگان میکروکنترلر از Flash یا EEPROM در محصولات خود استفاده می‌کنند، درحالی‌که برخی دیگر  هر دو نوع حافظه را برای راحتی کاربر به صورت همزمان در محصولات خود استفاده می‌کنند.
 
 

واحد پردازش مرکزی (CPU)

CPU مهم‌ترین جزء میکروکنترلر است که دستورالعمل‌ها را از حافظه واکشی می‌کند، آن‌ها را رمزگشایی می‌کند و سپس آن‌ها را اجرا می‌کند. این همان کاری است که یک CPU دقیقاً انجام می‌دهد. تفسیر فیزیکی هر اصطلاح را توضیح خواهیم داد. اما ابتدا اجازه دهید اجزای اصلی تشکیل دهنده یک CPU را توضیح دهیم.
 
 
واحد کنترل (CU)
 
وظیفه اصلی یک واحد کنترل واکشی و رمزگشایی دستورالعمل‌های کاربر است. دستورالعمل‌ها به شکل یک جریان 'n-Bit' در حافظه ذخیره می‌شوند. برای یک جریان 8 بیتی، 8 بیت در هر سلول حافظه ذخیره می‌شود و برای دستورالعمل‌های 16 بیتی، دو جریان 8 بیتی در سلول‌های متوالی حافظه ذخیره می‌شود.
 
 
 
چند بیت اول، عملیاتی را که باید انجام شود را مشخص می‌کند، یعنی جمع، تفریق، ضرب، جابجایی، چرخش و حرکت و غیره.
بیت‌های باقی مانده ثابت‌ها یا آدرس‌های حافظه داده‌ها یا آدرس ذخیره حافظه را نشان می‌دهند. برای روشن شدن موضوع در روش کار میکرو کنترلر یک مثال را با هم مرور می‌کنیم:
ما از اندازه دستورالعمل 8 بیتی استفاده خواهیم کرد. شما باید مفهوم را درک کنید، زیرا بقیه موارد برای دستورالعمل‌های 16 بیتی یا حتی 32 بیتی یکسان باقی می‌ماند.  فرض کنید می‌خواهید یک میکروکنترلر طراحی کنید که بتواند چهار عمل یعنی جمع، تفریق، شیفت به چپ و حرکت را انجام دهد.
اکنون برای تعریف چهار دستورالعمل به یک کد عملیاتی 2 بیتی نیاز دارید. به علاوه، هر دستورالعمل برای انجام عملیات مورد نظر به دو عملوند نیاز دارد. عملوندها ثابت‌ها یا آدرس‌های حافظه هستند که داده‌ها باید از آنجا واکشی شوند. اندازه هر عملوند در مثال ما 3 بیت خواهد بود.
 
اکنون می‌توانید معماری دستورالعمل 8 بیتی خود را به صورت زیر تعمیم دهید:
 
مجموعه دستورالعمل‌ها: b7 b6 b5 b4 b3 b2 b1 b0
عملوند منبع: b2-b0
عملوند مقصد: b5-b3
کد عملیات: b7-b6
 
پس از تعریف معماری دستورالعمل، می‌توانید دستورالعمل‌های سفارشی را به صورت زیر تعریف کنید:
 
دستورالعمل 00 - جمع ($a = $a + $b): مقدار حافظه "a" و "b" را جمع کنید. ذخیره نتیجه در آدرس حافظه "a"
 
دستورالعمل 01 - تفریق ($a = $a – $b): مقدار آدرس حافظه ‘b’ را از مقدار آدرس حافظه ‘a’ کم کنید. نتیجه را در آدرس حافظه "a" بنویسید
 
دستورالعمل 10 – شیفت به چپ shl $a n ($a << n): مقدار آدرس حافظه ‘a’ را با n بیت به چپ تغییر دهید. نتیجه را در آدرس حافظه "a" بنویسید
 
دستورالعمل 11 –   mov $a $b ($a = $b): مقدار موجود در آدرس حافظه ‘b’ را در آدرس حافظه ‘a’ کپی کنید.
 
اکنون چند نمونه را با استفاده از کد ماشین برای معماری مجموعه دستورالعمل‌هایمان توضیح می‌دهم. 
 
سوال 1: کد ماشین "00011100" به چه معناست؟
پاسخ 1: به این معنی است که اعدادی را که در آدرس‌های حافظه 011 و 100 قرار دارند اضافه کنید و در انتها نتیجه باید در آدرس حافظه "011" ذخیره شود
 
سوال 2: کد ماشین "01101001" به چه معناست؟
پاسخ 2: به این معنی است که عددی را که در آدرس‌های حافظه 001 قرار دارد از عددی که در آدرس 101 قرار دارد کم کنید. و در انتها، نتیجه باید در آدرس حافظه "101" ذخیره شود
 
سوال 3: کد ماشین "10111011" به چه معناست؟
پاسخ 3: به معنای جابجایی به چپ عدد واقع در آدرس‌های حافظه '111' را 3 بیت به چپ شیفت ('011') کنید. و در انتها، نتیجه باید در آدرس حافظه "111" ذخیره شود.
 
کارهایی که در سه مثال آخر انجام دادیم رمزگشایی دستورالعمل‌ها نامیده می‌شود.
 
 
اکنون، تلاش و زمان مورد نیاز برای رمزگشایی 100000 دستورالعمل را تصور کنید؟ 5 ساعت؟ 10 ساعت؟ خوب، نگران آن نباشید شما نیازی به انجام این کار ندارید، زیرا CPU یک واحد کنترل اختصاصی برای این کار دارد. اما، صبر کنید اگر واحد کنترل فقط بتواند دستورالعمل‌ها را واکشی و رمزگشایی کند، چه کسی قرار است عملیات ریاضی را انجام دهد؟ آیا دوباره این شما هستید که باید درگیر شوید؟
 
واحد منطق حسابی (ALU)
 
جزء بعدی در خط عملیات CPU واحد منطق حسابی (ALU) است. همانطور که از نام آن پیداست، وظیفه اصلی یک ALU انجام عملیات حسابی، منطقی، شیفت یا سایر عملیات ریاضی است که توسط معماری مجموعه دستورالعمل هر میکروکنترلر مشخص شده است.
 
ALU دقیقاً "اجرای دستورالعمل" را مدیریت می‌کند. واحد کنترل دستورالعمل را واکشی کرده، آن را رمزگشایی  و سپس دستورات مناسب را در مورد عملیات مورد نظر به ALU ارسال می‌کند. سپس ALU دستورالعمل را اجرا می‌کند و نتیجه را در حافظه ذخیره می‌نماید.
 
 
تا اینجای کار ما در مورد عملکرد CPU برای یک دستورالعمل بحث کرده‌ایم. اما چه اتفاقی می‌افتد، زمانی که CPU باید با تعداد زیادی دستورالعمل سروکار داشته باشد؟
 
 
خط لوله دستورالعمل
 
Instruction Pipelining یک جزء فیزیکی در CPU نیست. در عوض، این مفهومی برای بهینه‌سازی استفاده از زمان و منابع در حین واکشی، رمزگشایی و اجرا است. هنگامی‌که واحد کنترل در حال واکشی و رمزگشایی دستورالعمل است، ALU در آن دوره چه کاری انجام می‌دهد؟ همچنین، هنگامی‌که ALU در حال اجرای دستورالعمل است، واحد کنترل مشغول چه کاری است؟
 
پاسخ به هر دو سوال "هیچ چیز" است. بنابراین، اکنون مقصرانی را پیدا کرده‌اید که از زمان و قدرت شما استفاده می‌کنند، اما تقریباً نیمی از زمان‌ها هیچ کار مفیدی انجام نمی‌دهند. اکنون باید چه کنیم؟ ایجاد خط لوله بین اجزای CPU، این بدان معناست که واحد کنترل باید دستور بعدی را واکشی و شروع به رمزگشایی کند، درحالی‌که ALU مشغول اجرای دستورالعمل قبلی است.
 
تا زمانی که ALU دستور قبلی را اجرا می‌کند، واحد کنترل باید دستور بعدی را رمزگشایی کرده باشد. اکنون واحد کنترل باید این دستورالعمل را به ALU منتقل کند و دستورالعمل موجود بعدی را واکشی کند. این چرخه برای همیشه ادامه می‌یابد و زمان اجرای دستورالعمل‌ها را کاهش می‌دهد، این ویژگی بسیار مورد نیاز برنامه‌های حساس به  زمان است.
 
 
 
 
 

پشته

MCU Stack یک فضای تعیین شده در حافظه است که برای ذخیره وضعیت برنامه و همچنین آدرس‌های برگشتی برای عملیات‌های وقفه و زیر روال  Subroutine/Interrupt استفاده می‌شود. زیر روال یا Subroutine چیست؟ این یک قطعه کد است که قرار است توسط یک برنامه برای تعداد دفعات زیادی اجرا شود.
 
پس به جای نوشتن چنین کدی، بارها و بارها، برای یک بار نوشته شده و در یک مکان خاص در حافظه ذخیره می‌شود. هر زمان که برنامه بخواهد از آن کد استفاده کند، می‌تواند به آن مکان خاص برود. پس از اجرای زیربرنامه، برنامه به دستورالعملی برمی‌گردد که به ترتیب در کنار دستوری است که زیر روال را فراخوانی می‌کند.
 
 
وقفه یا Interrupt چیست؟ این یک انحراف برنامه از جریان اجرای عادی به دلیل اتفاقات خارجی یا داخلی است. هر وقفه با استفاده از یک هندل کننده وقفه خاص انجام می‌شود، که دوباره، یک قطعه کد در جایی در حافظه است.هر زمان که یک وقفه ایجاد می‌شود، CPU اجرای برنامه عادی را متوقف می‌کند و برای برآوردن نیازهای وقفه شروع به اجرای روتین وقفه می‌کند.
 
هنگامی‌که کنترل کننده وقفه پایان می‌یابد، CPU شروع به اجرای همان دستورالعملی می‌کند که در آن از خط برنامه خارج شده است.
هم برای کنترل کننده وقفه و هم برای زیربرنامه، CPU باید از آدرس حافظه به یک دستورالعمل به آدرس حافظه زیربرنامه / کنترل کننده وقفه برود. اما، چگونه یک CPU می‌داند که پس از وارد شدن به زیربرنامه / کنترل کننده وقفه به کجا برگردد؟ شما باید "آدرس بازگشت" را در جایی در حافظه ذخیره کنید. اینجاست که پشته  وارد می‌شود!
 
 
Stack بر روی یک طرح رجیستر Last-In-First-Out (LIFO) کار می‌کند، به این معنی که آخرین عدد وارد شده اولین عددی خواهد بود که خارج می‌شود. قبل از شروع اجرای هر زیر روال / کنترل کننده وقفه، CPU آدرس برگشتی را به پشته وارد می‌کند. علاوه بر این، آخرین دستورالعمل در هر زیربرنامه / کنترل کننده وقفه آدرس برگشتی را از پشته بیرون می‌آورد. این به CPU اجازه می‌دهد تا به جریان اجرای عادی برنامه را از سر بگیرد.
 
 
یک نکته مهم این است که CPU باید آدرس برگشت به دستور بعدی را به جای دستوری که در حال قطع شدن یا فراخوانی روال فرعی است، درج کند. این از یک حلقه اجرای دستورات بی نهایت جلوگیری می‌کند.
 
 
ثبات ها مناطق ذخیره سازی موقت در یک CPU هستند. آنها برای ذخیره اطلاعات مربوط به جریان برنامه، وضعیت برنامه، نتایج دستورالعمل ها و پیکربندی سخت افزار استفاده می شوند. در بیشتر معماری‌ها، رجیسترها فقط 14-15 عدد هستند. با این حال، دسترسی به آنها بسیار سریعتر از حافظه است. این تنها دلیل اصلی است که چرا CPU رجیسترها را به حافظه برای عملیاتی که شامل دسترسی فوری به داده است ترجیح می دهد.
 
 
 
شمارنده برنامه (PC)
 
این ثبات آدرس دستور بعدی را که قرار است توسط CPU اجرا شود را ذخیره می‌کند. PC مهم‌ترین قانون را در طول اجرای برنامه ایفا می‌کند و جریان اجرای برنامه را هدایت می‌کند. در طول اجرای عادی برنامه ، PC به صورت متوالی به آدرس دستور بعدی افزایش می‌یابد.
 
 
برای هر  زیر روال/وقفه، شمارنده برنامه با آدرس شروع کنترل کننده زیرروال/وقفه بارگذاری می‌شود و آدرس بازگشتی برای دستورالعمل بعدی روی پشته قرار می‌گیرد. در حین خروج از کنترل کننده زیرروال/وقفه، آخرین دستورالعمل آدرس برگشتی را از پشته به شمارنده برنامه می‌فرستد. سپس CPU شروع به اجرای دستورالعملی می‌کند که آدرس آن در شمارنده برنامه بارگذاری می‌شود.
 
 

لینک رجیستر (LR)

این رجیستر در همه میکروکنترلرها موجود نیست. بااین‌حال، عملکرد آن ذخیره آدرس برگشتی روتین‌های زیر روال/وقفه است.  یک یادآوری مهم! پیش‌ازاین، CPU آدرس بازگشت را روی یک پشته ذخیره می‌کرد. اما اکنون یک لینک رجیستر برای آن وجود دارد.
 
اما چه اتفاقی می‌افتد وقتی‌که یک زیربرنامه در زیربرنامه دیگری فراخوانی شود یا همان سناریو برای یک وقفه رخ دهد؟ اکنون همچنین باید  لینک ثبت (LR) خود را در پشته ذخیره کنید، زیرا LR با آدرس بازگشتی جدید برای کنترل کننده زیرروال/وقفه تودرتو به روز می‌شود. هنگامی‌که از زیر روال تو در تو خارج شدید، باید مقدار را از پشته به LR منتقل کنید. این شما را به نقطه شروع می‌رساند، آدرس بازگشت اولین برنامه فرعی/وقفه.
 
 

رجیسترهای عملکرد ویژه

این ثبات‌ها برای پیکربندی خاصی از سخت افزار استفاده می‌شوند. به طور خاص، Status Flag Registers اطلاعاتی در مورد وضعیت سخت افزار می‌دهد. به‌عنوان‌مثال، یک Status Flag Registers، هر زمان که وقفه‌ای رخ دهد، یک فلک ایجاد می‌کند. این فلگ باید پاک شود تا میکروکنترلر بتواند دوباره یک وقفه را از همان منبع تشخیص دهد. هر زمان که یک عملیات ریاضی به 0 منجر شود، یک صفر ایجاد می‌شود.
 
 
Carry-bit flag زمانی ایجاد می‌شود که نتیجه یک عملیات بزرگ‌تر از اندازه مجاز ذخیره سازی باشد. به‌عنوان‌مثال، اگر بخواهید عددی بزرگ‌تر از 255 را در یک فضای ذخیره سازی 8 بیتی ذخیره کنید، Carry-bit flag ایجاد می‌شود که نشان می‌دهد عدد خارج از محدوده است.
 
 
 

رجیستر Pushing onto Stack

پس از آموختن در مورد رجیسترها، اکنون برای درک این مفهوم در شرایط خوبی هستید. Stack فقط آدرس برگشت را ذخیره نمی‌کند. همچنین گاهی اوقات برای ذخیره رجیسترهای عملکرد ویژه، لینک رجیستر و رجیسترهای ژنرال لازم است.
 
 
هر کنترل کننده زیر روال/وقفه می‌تواند رجیسترهای عملکرد ویژه یا فلگ وضعیت را تغییر دهد. بنابراین، لازم است که وضعیت این ثبات‌ها را قبل از ورود به کنترل‌کننده زیر روال/وقفه در پشته ذخیره کنید. در مورد زیر روال‌های تو در تو، هر زمان که یک زیر روال جدید فراخوانی شود، Link Register با مقدار جدید به روز می‌شود. شما باید LR را در پشته ذخیره کنید، در غیر این صورت نمی‌توانید به دستورالعملی که اولین جای شروع روال فرعی بازگردید.
 
 
برای معماری‌های میکروکنترلرهای بدون لینک رجیستر (LR)، مقدار شمارنده برنامه (PC) باید در پشته ذخیره شود، هر زمان که یک زیر روال یا یک کنترل کننده وقفه فراخوانی می‌شود. رجیسترهای ژنرال وضعیت  یک برنامه را در هر زمان نشان می‌دهند. برای حفظ وضعیت برنامه قبل از هر گونه وقفه یا زیربرنامه، رجیسترهای ژنرال به پشته وارد می‌شوند و قبل از خاتمه کنترل کننده وقفه یا زیربرنامه با ترتیب معکوس از پشته خارج می‌شوند.
 
 
فرض کنید شما مجموعه‌ای از دستورالعمل‌ها را برای اجرا به CPU ارائه کرده‌اید. CPU دستورات را از حافظه دریافت کرده و شروع به اجرای آن می‌کند. بااین‌حال، بدون اجرای دستورالعمل کامل، CPU تصمیم می‌گیرد دستورالعمل بعدی را واکشی کند. این رفتار غیرعادی CPU چه چیزی را برای شما به همراه خواهد داشت؟ یک نتیجه معیوب یا زباله برای اولین دستورالعمل، که تمایل دارد کل برنامه و درنهایت سیستم امبد شده را  خراب کند.
 
 
چگونه می‌توانید از این امر جلوگیری کنید؟ شما به یک سیگنال ساعت نیاز دارید که بتواند هر فعالیت CPU را با لبه بالا رونده یا پایین رونده همگام کند. علاوه بر این، فرکانس سیگنال ساعت، دوره اجرا را برای هر دستورالعمل مشخص می‌کند. با فرکانس بالاتر، زمان اجرا کاهش می‌یابد.
 
 

پورت‌های ورودی/خروجی

اگر از قبل اطلاعات مربوط به دستورالعمل خود را می‌دانید، می‌توانید مستقیماً آن را به حافظه وارد کنید و می‌توانید ادامه دهید. بااین‌حال، اگر در طول اجرای برنامه نیاز به ارائه برخی اطلاعات در مورد محیط داشته باشید، چه اتفاقی می‌افتد؟ علاوه بر این، اگر نیاز به کنترل برخی از متغیرهای محیط یا یک دستگاه خارجی داشته باشید، چه؟
 
راه حل ساده است. برای خواندن ورودی‌های پویای کاربر یا کنترل دستگاه‌های خارجی به پورت‌های ورودی-خروجی در میکروکنترلر نیاز دارید. به‌عنوان‌مثال، پورت‌های ورودی/خروجی داده‌های ورودی کاربر را از سوییچ‌ها و صفحه‌کلیدها به CPU ارائه می‌کنند. علاوه بر این، پورت‌های ورودی/خروجی اطلاعات مورد نظر را از طریق رابط با نمایشگر LCD یا LED به کاربر ارسال می‌کنند. هر پورت در یک میکروکنترلر قابل برنامه ریزی به صورت ورودی/خروجی است. این انعطاف پذیری را برای کاربر فراهم می‌کند تا پورت‌های I/O را مطابق با نیاز، برنامه ریزی کند.
 

باس پردازنده

اکنون شما تمام اجزاء را برای اجرای دستورالعمل‌های خود دارید. تنها کاری که اکنون باید انجام دهید این است که همه اجزا را با استفاده از یک Bus به هم وصل کنید. این گذرگاه یک پیوند ارتباطی بین اجزای مختلف برقرار خواهد کرد. سه نوع باس وجود دارد که بیشتر در میکروکنترلرها استفاده می‌شود:
 
• Instruction/Data Bus: این گذرگاه به انتقال دستورالعمل‌ها/داده‌ها به CPU و حافظه کمک می‌کند.
• Address Bus: این گذرگاه آدرسی را که دستور/داده مورد نظر در داخل حافظه قرار دارد را مشخص می‌کند.
• Control Bus: این گذرگاه مشخص می‌کند که آیا دستورالعمل‌ها/داده‌ها باید نوشته شوند یا از حافظه واکشی شوند.
 
 

میکروکنترلر چگونه کار می‌کند؟

اکنون شما از تمام اجزای تشکیل دهنده یک میکروکنترلر و عملکرد آن‌ها آگاه هستید. اما چگونه همه مؤلفه‌ها به صورت هماهنگ برای اجرای دستورالعمل‌ها کار می‌کنند؟ یا به بیان ساده‌تر، وقتی کد خود را در EEPROM قرار می‌دهید و میکروکنترلر خود را ریست کرده‌اید چه اتفاقی می‌افتد؟
یک سری مراحل در روش کار میکرو کنترولر وجود دارد که حتی قبل از اینکه CPU شروع به اجرای اولین دستورالعمل برنامه کاربر کند، اتفاق می‌افتد.
 
اولاً، میکروکنترلر به آدرسی که دستورالعمل‌های کاربر در EEPROM ذخیره می‌شود، نیاز دارد. خوشبختانه یک راه حل ساده برای این مسئله وجود دارد. در هنگام ریست یا تنظیم مجدد، میکروکنترلر به یک مکان حافظه ثابت می‌رود. این مکان حافظه، آدرس واقعی ابتدای کد برنامه را در خود نگه می‌دارد. سپس کامپایلر رجیستر شمارنده برنامه (PC) را با آدرس شروع کد برنامه بارگیری می‌کند.
 
واحد کنترل (CU) دستورالعمل‌های اشاره شده توسط PC را واکشی و رمزگشایی می‌کند. ALU دستورالعمل را اجرا می‌کند و نتیجه را در حافظه ذخیره می‌کند. در همین حال، PC با آدرس دستورالعمل بعدی به روز می‌شود. سپس واحد کنترل دستور بعدی را واکشی می‌کند و چرخه ادامه می‌یابد. به طور مکرر، تمام دستورالعمل‌های برنامه بر اساس معماری خط لوله واکشی، رمزگشایی و اجرا می‌شوند.
 
 

معماری میکروکنترلر

میکروکنترلرها بر اساس نوع معماری آن‌ها بسیار متفاوت هستند که در ادامه به آن می‌پردازیم:
 

حافظه خارجی در مقابل حافظه امبد شده

در مورد میکروکنترلرهای با حافظه خارجی، حافظه در درون ساختار تراشه میکروکنترلر موجود نیست. و کاربر نیاز به اتصال یک حافظه خارجی برای ذخیره دستورالعمل‌ها/داده‌ها دارد. برای میکروکنترلرهای با حافظه داخلی ، حافظه در داخل میکروکنترلر تعبیه شده است.
 

معماری مجموعه دستورالعمل RISC در مقابل CISC

RISC (معماری با مجموعه دستورات کاهش یافته) دستورالعمل‌های ساده شده‌ای دارد که اجرای هر یک از آن‌ها یک چرخه ساعت طول می‌کشد. شما در این معماری باید برنامه‌ای کارآمد بنویسید، زیرا سخت افزار در RISC فقط می‌تواند دستورالعمل‌های ساده را مدیریت کند.
 
CISC (معماری با مجموعه دستورالعمل‌های پیچیده) این معماری دستورالعمل‌های پیچیده‌ای دارد. برخی از آن‌ها ممکن است نیاز به یک چرخه ساعت داشته باشند، اگرچه بسیاری از آن‌ها به چندین چرخه ساعت نیاز دارند. سخت افزار در CISC به‌اندازه کافی پیچیده است که بتواند دستورالعمل‌های پیچیده را مدیریت کند، بنابراین نیازی به تلاش اضافی برای بهینه سازی کد خود نخواهید داشت.
به بیان ساده، یک دستورالعمل CISC اگر بر روی یک معماری RISC اجرا شود، ممکن است به چرخه‌های ساعت متعددی برای اجرا نیاز داشته باشد. علاوه بر این، معماری RISC بر نرم افزار تأکید دارد درحالی‌که CISC بر سخت افزار تأکید دارد.
با توجه به اجرای یک دستورالعمل در هر سیکل ساعت، میکروکنترلر مبتنی بر RISC نیز در مقایسه با CISC به RAM بیشتری نیاز دارند.
 

معماری هاروارد در مقابل معماری فون نویمان

در معماری هاروارد، میکروکنترلر دارای باس‌های جداگانه برای دسترسی به دستورالعمل‌ها و داده‌ها است. درحالی‌که معماری فون نویمان یک باس مشترک برای هر دو در نظر گرفته شده است. به زبان ساده، میکروکنترلرهایی با معماری هاروارد می‌توانند داده‌ها و دستورالعمل‌ها را همزمان دریافت کنند. بااین‌حال، در معماری فون نویمان، میکروکنترلر ابتدا دستورالعمل‌ها و سپس داده‌ها را دریافت می‌کند.
 
 
این تنگنا در معماری فون نویمان زمان اجرای دستورالعمل را افزایش می‌دهد و بر عملکرد کلی سیستم تأثیر منفی می‌گذارد. در معماری هاروارد، فضای آدرس حافظه هم برای دستورالعمل‌ها و هم برای داده‌ها تعریف می‌شود. بنابراین حتی اگر مقداری فضای موجود در ناحیه دستورالعمل دارید، نمی‌توانید از آن برای داده‌ها استفاده کنید و بالعکس.
 
 
 
 
اکنون، اجازه دهید زمان اجرای یک «عملیات افزودن» را برای هر دو معماری ارزیابی کنیم. در معماری هاروارد، یک چرخه ساعت برای واکشی دستورات و داده‌ها مورد نیاز است. چرخه ساعت بعدی عملیات جمع را انجام می‌دهد. در سیکل ساعت سوم، گذرگاه داده نتیجه را در حافظه ذخیره می‌کند درحالی‌که گذرگاه دستورالعمل دستور بعدی را در همان زمان واکشی می‌کند.
 
در معماری فون نویمان، از دو چرخه ساعت برای واکشی دستورات و داده‌ها استفاده می‌شود. چرخه ساعت سوم از طریق عملیات جمع مشاهده می‌شود. چرخه ساعت چهارم برای ذخیره داده‌ها استفاده خواهد شد. در نهایت، دستورالعمل بعدی در چرخه ساعت پنجم واکشی خواهد شد.
 
اکنون می‌توانید خودتان ببینید، تنها سه چرخه در معماری هاروارد طول کشید تا یک دستورالعمل اجرا شود و دستورالعمل بعدی واکشی شود. درحالی‌که معماری فون نویمان پنج چرخه ساعت را برای همان کار انجام داد. اکنون سناریویی برای ده‌ها هزار دستورالعمل و تاخیر تجمعی ناشی از معماری فون نویمان را تصور کنید. این برای متقاعد کردن شما برای پذیرش معماری هاروارد کافی است، همانطور که اکثر تولیدکنندگان میکروکنترلرهای مدرن هم این دلیل را پذیرفته و محصولات خود را بر روی معماری هاروارد گسترش داده‌اند.
 
 

پیکربندی بیت

میکروکنترلرها در پیکربندی متفاوتی از نظر تعداد بیت وجود دارند، مانند 8 بیت، 16 بیت، 32 بیت. ممکن است تعجب کنید که چرا این همه تنوع وجود دارد؟ و چرا نمی‌توانیم از یک میکروکنترلر 32 بیتی برای همه برنامه‌ها استفاده کنیم؟ اجازه دهید این را با استفاده از یک قیاس ساده توضیح دهم. فرض کنید شما تیمی متشکل از 4 دوست هستید و همه شما تصمیم گرفته‌اید در تعطیلات تابستانی از باغ وحش دیدن کنید. شما دو انتخاب برای رفتن دارید: اسنپ یا مترو. شما کدام یک را انتخاب کنید؟
 
احتمالا شما اسنپ را انتخاب می‌کنید اما، هنگامی‌که از تفاوت بین کرایه آگاه می‌شوید، مطمئناً مترو را به اسنپ ترجیح می‌دهید. ما دو نوع انسان را در حدس و گمان خود حذف کرده‌ایم: اولاً میلیاردرها و دوم آن‌هایی که تازه حقوق دریافت کرده‌اند!
 
همین مفهوم در مورد میکروکنترلرها نیز صدق می‌کند. اگر یک میکروکنترلر 8 بیتی می‌تواند الزامات یک برنامه کاربردی را برآورده کند، چرا می‌خواهید از یک میکروکنترلر 32 بیتی پرهزینه‌تر و پرمصرف‌تر استفاده کنید؟ شما باور نمی‌کنید، 90 درصد از برنامه‌ها را می‌توان با یک میکروکنترلر 8 بیتی پیاده سازی کرد. شما نیازی به میکروکنترلرهای 16 بیتی یا 32 بیتی نخواهید داشت مگر اینکه بخواهید پردازش سیگنال دیجیتال، محاسبات با ممیز شناور یا سایر کارهایی که نیاز به منابع زیادی دارند را انجام دهید.
 
تفسیر فیزیکی یا فنی یک میکروکنترلر n بیتی چیست؟
یک میکروکنترلر n بیتی به سادگی به این معنی است که دارای گذرگاه داده «n-bit» است. این به این معنی است که ما می‌توانیم n بیت‌ها را در یک زمان در حافظه ذخیره کنیم. یا می‌توانیم داده‌ها را تا حداکثر n بیت در طول یک چرخه ساعت دستکاری کنیم. دستکاری داده‌های 32 بیتی در یک میکروکنترلر 8 بیتی 4 سیکل ساعت طول می‌کشد، درحالی‌که در میکروکنترلر 32 بیتی فقط 1 سیکل ساعت.
 
در مقابل، دستکاری داده‌های 8 بیتی یک چرخه ساعت در هر دو MCU 8 بیتی یا 32 بیتی طول می‌کشد. بااین‌حال، میکروکنترلرهای 32 بیتی نسبت به همتای 8 بیتی هزینه بیشتری دارد و انرژی بیشتری مصرف می‌کند. اگر کمی برایتان گیج‌کننده شد، بگذارید با یک مثال عملی توضیح بدهم…
 
فرض کنید باید عددهای 100 و 150 را روی یک میکروکنترلر 8 بیتی جمع کنید. چند سیکل ساعت مورد نیاز خواهد بود؟ فقط یک سیکل ساعت، زیرا 100+150=250  و در محدوده 8 بیتی (0…255) قرار دارد.
 
بااین‌حال، اگر می‌خواهید 200 و 250 را با استفاده از یک میکروکنترلر 8 بیتی اضافه کنید، به 2 سیکل ساعت نیاز دارید. دلیل، 200 + 250 = 450 خارج از محدوده برای داده‌های 8 بیتی (0-255) است اما در محدوده داده‌های 16 بیتی (0-65535) قرار دارد. حالا تعداد چرخه‌های ساعت مورد نیاز برای اضافه کردن «60000» و «10000» را برای خود محاسبه کنید
 

لوازم جانبی یا پریفرال‌های میکروکنترلر

میکروکنترلرها معمولا دارای تجهیزات جانبی فراوانی هستند که به  توسعه یک رابطه با محیط خارجی و همچنین پاسخگویی به نیازهای برنامه‌های کاربردی پیچیده کمک می‌کنند. این لوازم جانبی ویژگی‌های اضافی برای یک میکروکنترلر هستند. برخی از میکروکنترلرها ممکن است دارای پریفرال‌های بیشتری باشند، درحالی‌که برخی دیگر ممکن است تنها دو یا سه پریفرال اضافی داشته باشند.
 
این شما هستید که تصمیم می‌گیرید با توجه به نیازهای برنامه که در یک میکروکنترلر به چه ویژگی‌هایی نیاز دارید. توضیح هر بخش جانبی یک میکروکنترلر به اندازه کافی پیچیده است که شایسته است در یک مقاله جدا توضیح داده شود. بنابراین، ما فقط قصد داریم هر یک از دستگاه‌های جانبی را به همراه برخی از برنامه‌های کاربردی ممکن معرفی کنم.
 

تایمر / شمارنده

همانطور که از نام آن پیداست، این ابزار جانبی مفهوم زمان را به سیستم شما القا می‌کند. یک سیگنال ساعت از یک نوسان ساز کریستالی خارجی/داخلی برای عملکرد صحیح تایمرها/ شمارنده‌ها استفاده می‌کند. تایمرها برای معرفی تاخیرها در برنامه استفاده می‌شوند. به‌عنوان‌مثال، می‌توانید بعد از هر 1.5 ثانیه یک بوق تنظیم کنید، یا می‌توانید مقدار سنسور دما را بعد از هر 5 دقیقه یا بیشتر بخوانید.
 
شمارنده‌ها برای شمارش رویدادهای خارجی استفاده می‌شوند. برای مثال، ممکن است بخواهید نظارت کنید که کاربر چند بار در 5 ثانیه گذشته یک دکمه را فشار داده است. همچنین می‌توانید تعداد بازدیدکنندگان دو طرفه را که از یک دروازه امنیتی طی یک بازه 24 ساعته عبور می‌کنند، بشمارید. مهم‌ترین ویژگی تایمرها تولید سیگنال‌های مدولاسیون عرض پالس (PWM) است. سیگنال‌های PWM به طور گسترده برای کنترل موتور در کاربردهای روباتیک استفاده می‌شود.
 
PWM یک سیگنال موج مربعی با چرخه کاری و فرکانس مشخص است. چرخه وظیفه یا Duty Cycle به معنای نسبت سیگنال ON-Time به OFF-Time است.
 
چرخه وظیفه = (زمان روشن/زمان خاموش) * 100
 
فرض کنید یک سیگنال PWM دارید که بین ۰ تا ۵ ولت متغیر است. با سیکل کاری 20 درصد، 1 ولت دریافت خواهید کرد. با 80% Duty Cycle، 4 ولت دریافت خواهید کرد. بنابراین، تنها با تغییر Duty Cycle سیگنال PWM، می‌توانید ولتاژ متفاوتی را در خروجی دریافت کنید. 
 

رابط‌های ارتباطی

آیا تا به حال اطلاعاتی را از تلفن همراه خود به رایانه رومیزی انتقال داده‌اید؟ خوب، پس از کدام رابط ارتباطی استفاده کردید؟
همه می‌دانند! USB یا گذرگاه سریال جهانی. اما آیا می‌دانید که USB تنها پروتکل ارتباطی نیست؟ رایانه رومیزی شما فقط دارای پورت‌های USB است زیرا فقط می‌تواند با میزبان‌های USB ارتباط برقرار کند. بااین‌حال، این مورد در مورد میکروکنترلر صادق نیست.
 
میکروکنترلر نیاز به ارتباط با انواع دستگاه‌هایی دارد که از دوران قدیم‌تر به وجود آمده‌اند. همانطور که دستگاه‌های الکترونیکی با ظهور تکنولوژی پیچیده می‌شوند، رابط‌های ارتباطی آن‌ها نیز پیچیده می‌شود. مهم‌ترین ویژگی یک پروتکل ارتباطی سرعت و قابلیت اطمینان بالای آن در هنگام انتقال داده است. هیچ‌کس نمی‌خواهد داده‌های خود را از دست بدهد. 
 
در طول سالیان گذشته بسیاری از پروتکل‌های ارتباطی با قابلیت اعتماد و سرعت ‌بالا به وجود آمدند. بااین‌حال، پس از آزمایش‌ها و آزمایش‌های مکرر، تنها تعدادی باقی‌مانده‌اند که اعتماد توسعه‌دهندگان را جلب کرده‌اند. برجسته‌ترین آن‌ها پروتکل‌های ارتباطی سریال مانند:
 
• فرستنده گیرنده غیرسنکرون جهانی (UART)
• فرستنده گیرنده ناهمزمان سنکرون جهانی (USART)
• رابط جانبی سریال (SPI)
• رابط (I2C)
• گذرگاه سریال جهانی (USB)
 
به دلیل تقاضای بی پایان برای ارتباط با سرعت بالا و قابل اعتماد، در الکترونیک به سمت ارتباطات روی باس حرکت شده است. دو پروتکل غالب در این گونه وجود دارد:
شبکه کنترل منطقه‌ای (CAN)
اترنت برای فناوری کنترل و اتوماسیون (EtherCAT)
 

مبدل آنالوگ به دیجیتال (ADC)

تمام حسگرهایی که دارای رابط ارتباطی سریال هستند خروجی خود را به صورت دیجیتال تولید می‌کنند. این بدان معناست که ولتاژ خروجی آن‌ها یا در سطح منطقی "پایین" یا سطح منطقی "بالا" است. خروجی به این شکل به راحتی توسط رابط‌های ارتباطی تعبیه شده در میکروکنترلر پذیرفته می‌شود. بااین‌حال، سانسورهایی وجود دارند که خروجی آن‌ها از یک فرمت آنالوگ پیروی می‌کند. به‌عبارت‌دیگر ولتاژ خروجی آن‌ها بین دو سطح متفاوت در حال تغییر است.
 
هر سنسوری از این دست می‌تواند ولتاژ خروجی 1.3 ولت یا 2.98 ولت یا 4.78 ولت تولید کند. چنین ولتاژ خروجی نامنظمی توسط رابط‌های ارتباطی دیجیتال درک نمی‌شود. بنابراین، باید یک رابط ارتباطی آنالوگ برای داده‌های آنالوگ وجود داشته باشد؟ ولی این کار هیچ فایده‌ای نخواهد داشت زیرا CPU نمی‌تواند سیگنال‌های ولتاژ آنالوگ را درک کند. پس راه حل چیست؟
 
یک مبدل آنالوگ به دیجیتال بهترین دوست شما برای این کار است. ADC ورودی‌های آنالوگ را می‌گیرد و آن‌ها را به مقادیر دیجیتال تبدیل می‌کند. سپس این مقادیر دیجیتال برای پردازش بیشتر به CPU وارد می‌شوند. اگر یک ADC 10بیتی دارید، می‌توانید ولتاژ آنالوگ (0-5 ولت) را به مقدار دیجیتال در محدوده 0-1023 تبدیل کنید.
مقدار 0 ولت برابر با "0" و مقدار 5 ولت برابر با "1023" در فرمت دیجیتال خواهد بود. تمام مقادیر میانی دارای همتایان دیجیتالی نسبی خواهند بود که با فرمول نشان داده شده است:
مقدار دیجیتال = (ولتاژ آنالوگ/5) * 1023
در یک ADC 16 بیتی، شما قادر خواهید بود ولتاژ آنالوگ را به محدوده دیجیتال 0-65535 تبدیل کنید. بنابراین، دقت و کنترل بیشتری دارید. در این حالت، فرمول‌های تبدیل دیجیتال به صورت زیر خواهد بود:
مقدار دیجیتال = (ولتاژ آنالوگ/5) * 65535
 

مبدل دیجیتال به آنالوگ (DAC)

مبدل دیجیتال به آنالوگ (DAC) شکل مقابل ADC است. DAC پالس‌های دیجیتال را به سیگنال‌های آنالوگ تبدیل می‌کند. برنامه‌های کاربردی نیاز به کنترل دستگاه‌هایی دارند که با استفاده از ولتاژ آنالوگ کنترل می‌شوند. ازآنجایی‌که میکروکنترلر فقط می‌تواند مقادیر دیجیتال را به خروجی تحویل دهد، برای تبدیل مقادیر دیجیتال به سیگنال‌های با ولتاژ آنالوگ به DAC نیاز دارید.
 
برای یک DAC 10 بیتی، می‌توانید یک مقدار دیجیتال در محدوده 0-1023 را به سیگنال ولتاژ آنالوگ از 0 تا 5 ولت تبدیل کنید. مقدار دیجیتال "0" مطابق با 0 ولت است و "1023" مطابق فرمول‌ها با 5 ولت مطابقت دارد:
ولتاژ آنالوگ = (مقدار دیجیتال/1023) * 5
 
برای یک DAC 16 بیتی، می‌توانید محدوده بالایی از مقادیر دیجیتال (0-65535) را به یک ولتاژ آنالوگ در محدوده 0-5 ولت تبدیل کنید:
ولتاژ آنالوگ = (مقدار دیجیتال/65535) * 5

کنترل‌کننده‌های وقفه

شاید به خاطر داشته باشید که قبلاً در مورد کنترل‌کننده‌های وقفه در زمینه MCU Stack صحبت کرده‌ایم. اما کنترل کننده وقفه چیست؟ ابتدا باید در مورد کنترل کننده وقفه کاملا شفاف باشید. به زبان ساده، یک هندل کننده وقفه قطعه‌ای از یک برنامه است که هر زمان که وقفه‌ای بیاید اجرا می‌شود.
 
وقفه‌های ناشی از هر سخت افزار خارجی را وقفه سخت‌افزاری می‌نامند. درحالی‌که وقفه‌هایی که در داخل نرم افزار اتفاق می‌افتد را وقفه نرم‌افزاری می‌نامند. نمونه‌ای از وقفه سخت‌افزاری، وقفه‌ای است که به دلیل تغییر وضعیت دکمه فشار داده می‌شود، یعنی زمانی که کاربر یک دکمه فشاری را فشار داده یا آن را رها می‌کند. وقفه نرم افزار می‌تواند توسط یک تایمر داخلی ایجاد شود، یعنی به طور مثال پس از هر 1 ثانیه، تایمر یک وقفه ایجاد کند.
 
همچنین نوع دیگری از وقفه به نام Exception وجود دارد. استثناها وقفه‌های نرم‌افزاری هستند که توسط برنامه‌های سطح سیستم به جای برنامه‌های سطح کاربر ایجاد می‌شوند.
 
هر وسیله جانبی در یک میکروکنترلر دارای کنترل کننده وقفه مختص به خود است. به‌عنوان‌مثال، پورت A کنترل کننده وقفه خود را خواهد داشت. Timer0 کنترل کننده وقفه خود را دارد. Timer1 همچنین دارای یک کنترل کننده وقفه منحصربه‌فرد خواهد بود. هر زمان که یک وقفه نرم‌افزاری یا سخت‌افزاری توسط یک دستگاه جانبی ایجاد شود، کنترل کننده وقفه مربوطه اجرا می‌شود. شما می‌توانید دستورالعمل‌ها را در یک کنترل کننده وقفه بنویسید، و هر زمان که همان کنترل کننده وقفه فراخوانی شود، دستورالعمل‌های شما اجرا می‌شوند.
 
فرض کنید می‌خواهید وضعیت خروجی پورت A را بعد از هر ثانیه تغییر دهید. چه خواهید کرد؟ شما یک Timer0 تنظیم می‌کنید تا بعد از هر ثانیه یک وقفه ایجاد کند. سپس، به کنترل کننده وقفه Timer0 رفته و دستورالعمل‌های خاص برنامه خود را در آن کنترل کننده وارد می‌کنید، یعنی وضعیت پورت A را تغییر دهید.
 
تا اینجای کار خیلی ساده است. اما کنترلر وقفه چه نقشی در همه این‌ها دارد؟ آیا کنترل کننده وقفه فقط یک نام فانتزی برای «کنترل وقفه» است؟ نه! ازآنجایی‌که تعداد زیادی کنترل کننده وقفه وجود دارد، آن‌ها در NVIC (کنترل کننده وقفه برداری تودرتو) ذخیره می‌شوند. حالا این NVIC چیست؟ NVIC آدرس شروع هر کنترل کننده وقفه را در قالبی بردار در حافظه ذخیره می‌کند.
 
هر زمان که وقفه‌ای رخ می‌دهد، "کنترل کننده وقفه" ابتدا دستگاه جانبی را که باعث وقفه شده است را تشخیص می‌دهد. در مرحله دوم، کنترل کننده وقفه آدرس شروع کنترل کننده وقفه مربوطه را از NVIC واکشی می‌کند. در مرحله سوم، کنترل کننده وقفه، شمارنده برنامه (PC) را با آدرس کنترل کننده وقفه بارگذاری می‌کند. سپس CPU شروع به اجرای کنترل کننده وقفه می‌کند، درحالی‌که کنترل کننده وقفه برای بررسی به وقوع وقفه‌های بیشتر به کار خود باز می‌گردد.
 

تفاوت بین میکروکنترلر و ریزپردازنده

این موضوعی است که تقریباً 3/4 مردم را گیج می‌کند، کسانی که سعی می‌کنند اصول اولیه خود را در مورد میکروکنترلرها به‌درستی بیان کنند. اکثر آن‌ها گیج می‌شوند زیرا میکروکنترلر و اصل کار آن را درک نمی‌کنند. اکنون تقریباً 7000 کلمه در مورد اصول میکروکنترلر خوانده‌اید و روش کار میکرو کنترلرها را از هر زاویه‌ای درک کرده‌اید. درک تفاوت بین میکروکنترلرها و ریزپردازنده‌ها برای شما بسیار آسان خواهد بود!
 
آیا تمام اجزای یک میکروکنترلر یعنی CPU، پورت‌های I/O، حافظه، باس و کلاک را به خاطر دارید؟ همچنین، آیا لوازم جانبی اضافی که در میکروکنترلر تعبیه شده است را به خاطر دارید؟ اگر تمام قطعات و لوازم جانبی را از یک میکروکنترلر به جز CPU حذف کنم چه می‌شود؟ آن‌وقت چه چیزی به دست خواهید آورد؟ یک ریزپردازنده!
 
به بیان ساده، یک ریزپردازنده اساساً یک CPU است که هیچ حافظه یا لوازم جانبی داخلی ندارد. و شما باید حافظه و همچنین سایر اجزا و لوازم جانبی را به صورت خارجی به آن متصل کنید. در یک ریزپردازنده، قبل از اینکه بتوانید ساده‌ترین برنامه‌ها را راه‌اندازی کنید، باید برخی از کارها را انجام دهید. در مقابل، میکروکنترلر یک واحد آماده برای استفاده است. تمام حافظه‌ها، اجزا و تجهیزات جانبی در داخل یک تراشه جاسازی شده است. شما فقط باید EEPROM را با دستورالعمل‌ها رایت کنید و شما آماده هستید!
 
اما چرا ریزپردازنده‌ها وجود دارند؟
اگرچه میکروکنترلرها با یک حافظه تعبیه شده در داخل عرضه می‌شوند، حافظه میکروکنترلرها فقط برای اجرای برنامه‌های کاربردی با نیازهای حافظه محدود کافی است. اما اگر بخواهید برنامه‌های کاربردی با منابع زیاد مانند گرافیک، مدل سازی سه بعدی، توسعه برنامه اندروید/IOS را اجرا کنید چه؟ یک مورد شدیدتر این است که همه این برنامه‌ها را در یک زمان واحد اجرا کنید.
آیا یک میکروکنترلر می‌تواند چنین کار فشرده‌ای را انجام دهد؟ شاید بله. بااین‌حال، به دلیل محدودیت حافظه و قدرت محاسباتی CPU، زمان زیادی طول خواهد کشید. اما ما این را نمی‌خواهیم؟ پس راه حل چیست؟  یک ریزپردازنده، از نو!
 
یک ریزپردازنده اساساً دارای قدرت محاسباتی بالایی است. علاوه بر این، ریزپردازنده‌ها می‌توانند با حافظه‌های بزرگ ارتباط برقرار کنند، و این خصیصه ریزپردازنده‌ها را به گزینه‌ای ایده‌آل برای برنامه‌های کاربردی با منابع فشرده تبدیل می‌کند.
 
یکی دیگر از نکات مربوط به ریزپردازنده توانایی آن در اجرای هزاران برنامه کاربردی با منابع فشرده به طور همزمان است. این دلیل اصلی این است که چرا کامپیوترهای رومیزی/لپ‌تاپ شما به جای میکروکنترلر، پردازنده دارند.
 

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

در حال حاضر، شما باید تصور درستی از برنامه‌هایی داشته باشید که می‌توان با کمک یک میکروکنترلر پیاده سازی کرد. ما همچنین در کل مقاله به بسیاری از این برنامه‌ها اشاره‌ کرده‌ایم. بااین‌حال، برای تقویت بیشتر دانش شما، موارد دیگری را به اشتراک می‌گذارم:
 
• مانیتورهای کودک
• سیستم تشخیص حریق
• اینترنت اشیا
• اتوماسیون خانگی
• حسگر نور
• کنترل LED
• گجت های پوشیدنی ارزان‌قیمت
• تجهیزات پزشکی
• زیردریایی‌ها
• کشتی‌ها
• سیستم هوافضا
• و خیلی موارد دیگر…
این لیست هرگز تمام نمی‌شود، حتی اگر تا سه روز آینده به نوشتن ادامه دهیم.
 
نظرات کاربران

هیچ نظری برای این مطلب ثبت نشده است.