آموزش کامل وقفه در میکروکنترلر AVR

محتویات
سلام. وقفه چیست ؟ آموزش کامل Interrupt در میکروکنترلر AVR ( آموزش AVR #10) را آماده کردیم. در این قسمت آموزش ای وی آر به صورت کامل با مبحث وقفه در Microcontroller AVR آشنا میشویم.
در قسمت قبلی به صورت کامل با تایمر / کانتر آشنا شدیم.
قسمت قبلی : تایمر / کانتر در میکروکنترلر AVR
در این قسمت موضوع وقفه ها را مورد بررسی قرار میدهیم. برویم سراغ اصل مطلب.
پردازنده ها برای اینکه از رویدادهای داخلی و خارجی مطلع شوند از دو روش استفاده می کنند :
روش اول، روش polling :
در این روش با استفاده از برنامه نویسی، فواصل زمانی دلخواه را معین میکنیم و بصورت متناوب دائم رویداد مورد نظرمان چک میشود که آیا اتفاق افتاده است یا خیر! فرض میکنیم میخواهیم چک کنیم که آیا فلان کلید را که به Microcontroller متصل کردید 0 است یا 1. حتما یک شرط تعریف میکردیم که هر چند میکروثانیه یک بار میکروکنترلر چک کند که آیا وضعیت 0 است یا 1. این کار برای یک برنامه ساده مناسب است.
اما اگر برنامه پیشرفته و طولانی باشد باید چکار کنیم ؟ اگر از همین روش اول برای برنامه های حرفه ای استفاده کنیم ، پردازنده ما دائما در حال تکاپو است و خیلی در فشار قرار میگیرد و ممکن است سرعت اجرای دستورات کم شود.
روش دوم، روش وقفه یا interrupt :
در این روش برای میکروکنترلر تعریف میکنیم که مشغول به کار خود باشد ! و هر وقت که لازم شد به آن میگوییم که چکار کند.
وقفه چیست ؟
اگر کلمه interrupt را در ترجمه گوگل وارد کنید معادل فارسی آن گسیختن ، قطع کردن و … میشود. اما در میکروکنترلر های AVR ، معنی interrupt چیست ؟
interrupt یا همان وقفه مکانیزمی است که میکروکنترلر را برای پاسخگویی به وقایع لحظه ای آماده میکند.
این مکانیزم چیست ؟
هنگام رخداد وقفه،ب رنامه ای که در حال اجراست قطع میشود و برنامه وقفه انجام میشود و پس از آن،برنامه از همانجا که قطع شده است از سر گرفته میشود و ادامه پیدا میکند.
مراحل اجرای interrupt :
پس از آنکه میکروکنترلر درخواست وقفه را دریافت کرد مراحل زیر انجام میشود :
- به دستوری که در حال اجرای آن است پایان میدهد و آدرس دستور بعدی را در Stack ذخیره میکند.
- به جدول بردار interrupt مراجعه میکند و آدرس سرویس وقفه را پیدا کرده و به آن آدرس میرود.
- زیر برنامه interrupt را اجرا میکند.
- آدرسی که در Stack ذخیره شده بود را برداشته و اجرای ادامه برنامه را از سر میگیرد.
بردار وقفه چیست؟ هنگام رخ دادن وقفه، آدرسی که در شمارنده برنامه قرار میگیرد را بردار interrupt مینامند.
Stack چیست؟ قسمتی از حافظه داده SRAM است که برای اجرای برنامه وقفه مورد نیاز است.
در واقع این بخش یک جزئی از SRAM هست که بعضی دستورات جهت فراخوانی Microcontroller و علی الخصوص interrupt را در خودش ذخیره میکند.
یک مثال برای فهمیدن وقفه ها :
فرض کنید نشستید پای کامپیوتر و مشغول تایپ کردن متنی از روی کتاب هستید.مثلا یک تحقیق را میخواهید تحویل استادتان بدهید و میخواهید 5 صفحه شو از کتاب کپی کنید. کتاب را میذارید جلوتان و شروع میکنید به تایپ کردن. در حالیکه 2 صفحه و 3 خط از کتاب را تایپ کردید، ناگهان مادر گرامیتان صدایتان میزند که پسرم (یا دخترم ) بفرما که شام حاضر است ! شما هم از نوشتن ادامه تحقیق را بی خیال میشوید و تا آنجایی که تایپ کردید را علامت میزنید و میروید و پس از صرف شام برمیگردید سراغ کامپیوتر و شروع میکنید از ادامه آن شروع به تایپ کردن.
حالا مثال بالا را تحلیل میکنیم.
- *شما در حال تایپ کردن هستید. ==> در حال انجام کار عادی خود
- *مادر گرامی شما را صدا میزنند. ==> درخواست وقفه (صدا زدن)
- *توقف عملیات تایپ کردن. ==> متوقف شدن کار و ذخیره دستورالعمل بعدی (1)
- *به سمت محل صرف غدا میروید. ==> رجوع به آدرس وقفه (2)
- *شروع به غذا خوردن میکنید. ==> انجام برنامه وقفه (غذا خوردن) (3)
- *بر میگردید و ادامه تایپتون را انجام میدید. ==> بازگشت به محل قبلی و ادامه فعالیت (4)
برنامه در حال اجرا است، ناگهان وقفه درخواست میشود، میکروکنترلر به جدول بردار وقفه مراجعه میکند(1)،آدرس زیرروال وقفه را پیدا میکند و پرش میکند به آن آدرس(2)، پس از اینکه برنامه وقفه اجرا شد مجددا به برنامه اصلی برمیگردد (3).
رجیستر و فلگ مربوط به وقفه در میکروکنترلر AVR
واحد وقفه در میکروکنترلر AVR مانند بقیه بخش ها ، تنظیمات ، رجیستر ها و… دردسر های خاص خودش را دارد. قبلا رجیستر های مهم را معرفی کردیم و مهم ترین آن ها نیز رجیستر SREG بود. فلگ “I” یا همان “Interupt Flag” مسئول فعال کردن وقفه سراسری است.
این فلگ مجوز صدور وقفه را صادر میکند. هرگاه قرار باشد وقفه ای رخ بدهد، بعد از اینکه دستور اجرای وقفه صادر شد Microcontroller چک میکند که آیا اجازه دارد آن وقفه را عملیاتی کند یا خیر. با “یک” شدن این پرچم، مجوز صادر میشود و پس از اجرای وقفه مجددا “صفر” میشود.
در قسمت بعدی با پورت های ورودی و خروجی کار میکنیم.
قسمت بعدی : آموزش جامع کار با پورت های ورودی و خروجی در میکروکنترلر AVR (آموزش AVR #11)
سلام خسته نباشید
چجوری میشه وقتی وقفه اتفاق میوفته و تموم میشه نره از جایی که وقفه اتفاق افتاده ادامه بده و ما خودمون آدرس محل جدید را بهش بدیم؟
سلام خیلی عالی بود توضیحاتتون.
ببخشید یک سوال داشتم. این ساید بار موضوعاتتون که حالت تو در تو داره با چه چیزی ساختید؟
سلام جناب ممنونم. ابزارک موضوعات خود وردپرس هست با CSS شخصی سازیش کردم.