معرفی وقفه در میکروکنترلرهای AVR ؟ [15] (نویسنده: احسان نوری)
این بار با مطلبی تحت عنوان "معرفی وقفه در میکروکنترلرهای AVR" در خدمتتون هستم.
پس با ما در ادامه مطلب همراه باشید ...
به نام خدا
سلامی دوباره به همراهان همیشه ناهمراه !
چطورید دوستان ؟!
قسمت شد یه بار دیگه پست آموزش بزارم براتون،ایشالا که خوشتون بیاد و بتونید از این مطالب استفاده کافی رو ببرید !
امروز میخوام راجع به وقفه یا Interrupt صحبت کنم !
دقت کنید که تنها در حد آشنایی و معرفی با وقفه آشنا میشید و در این قسمت از آموزش از بیان جزئیات خودداری میکنم و تنها هدفم از نوشتن این بخش از آموزش اینه که اگه یه جا گفتم "وقفه" نگرخید !!!
اگه کلمه interrupt رو داخل دیکشنری معادل فارسیشو ببینید با عباراتی نظیر :
قطع کردن،گسیختن،کلام کسی را قطع کردن،منقطع کردن و ... روبرو خواهید شد.
اما اینجا منظور از interrupt دقیقا چیه ؟
وقفه مکانیزمی است که میکروکنترلر را برای پاسخگویی به برخی وقایع لحظه ای فعال میکند.(این تعریف کتابیش بود !)
مکانیزم :
هنگام رخداد وقفه،برنامه ای که در حال اجراست قطع میشود و برنامه وقفه انجام میشود و پس از آن،برنامه از همانجا که قطع شده است از سر گرفته میشود و ادامه پیدا میکند.
مراحل اجرای یک وقفه ؛
پس از آنکه میکروکنترلر درخواست وقفه را دریافت کرد مراحل زیر انجام میشود :
1.به دستوری که در حال اجرای آن باشد پایان میدهد و آدرس دستورالعمل بعدی را در فضایی به نام پُشته (Stack) ذخیره میکند.
2.به جدول بردار وقفه مراجعه میکند،آدرس سرویس وقفه (ISR) را پیدا میکند،به آدرس بدست آمده پرش میکند.
3.زیربرنامه وقفه رو اجرا میکند.
4.آدرسی را که در پشته ذخیره کرده بود را برداشته و اجرای ادامه برنامه را از سر میگیرد.
بردار وقفه : هنگام رخدادن وقفه،آدرسی که در شمارنده برنامه قرار میگیرد رو بردار وقفه مینامند.
پُشته (Stack) چیست ؟
قسمتی از حافظه داده SRAM است که برای اجرای برنامه وقفه مورد نیاز است.
در واقع این بخش یک جزئی از SRAM هست که یه سری دستورات جهت فراخوانی میکرو و علی الخصوص وقفه رو در خودش ذخیره میکنه ! اینو دیگه همه در جریانش هستید که RAM چکنویس (چرکنویس!) میکرو است.(اینو گفتم که فقط گفته باشم ! )
اما تعریف خودمونیش (یجور بگم کَف بُر بشید !!!) :
مثال :
فرض کنید نشستید پای کامپیوتر و مشغول تایپ کردن متنی از روی کتاب هستید.مثلا یه تحقیق میخواین تحویل استادتون بدید و میخواین 5 صفحه شو از کتاب کُپ بزنید.میاین و کتاب رو میزارید جلوتون و شروع میکنید به تایپ کردن !
در حالیکه 2 صفحه و 3 خط از کتاب رو تایپ کردید،ناگهان مادر گرامیتون صداتون میزنه که پسرم (یا دخترم) بفرما که ناهار حاضره !
شما هم از فرط گشنگی ! نوشتن ادامه تحقیق رو بی خیال میشید و تا اونجایی که تایپ کردید رو علامت میزنید و مثل موشک خودتون رو به غذا میرسونید و پس از صرف نهار میاین سراغ کامپیوتر و شروع میکنید از خط 4 صفحه 3 (ادامش !) تایپ کردن !!!
این ساده ترین و کاملترین مثالی هست که میشه در مورد وقفه زد !
تحلیل مثال بالا با مراحل انجام وقفه که براتون بالاتر گفتم ! :
*شما در حال تایپ کردن هستید. ==> در حال انجام کار عادی خود
*مادر گرامی شما رو صدا میزنند. ==> درخواست وقفه (صدا زدن)
*توقف عملیات تایپ کردن. ==> متوقف شدن کار و ذخیره دستورالعمل بعدی (1)
*به سمت محل صرف غدا میروید. ==> رجوع به آدرس وقفه (2)
*شروع به غذا خوردن میکنید. ==> انجام برنامه وقفه (غذا خوردن) (3)
*بر میگردید و ادامه تایپتون رو انجام میدید. ==> بازگشت به محل قبلی و ادامه فعالیت (4)
تصویر بالا دقیقا همون حرفهایی که زدم رو داره بیان میکنه.
برنامه در حال اجراست،ناگهان وقفه درخواست میشه،میکروکنترلر به جدول بردار وقفه مراجعه میکنه(1)،آدرس زیرروال وقفه رو پیدا میکنه و پرش میکنه به اون آدرس(2)،پس از اینکه برنامه وقفه اجرا شد مجددا به برنامه اصلی برمیگرده (3).
دیاگرام پایین هم همین مسئله رو با یه چشم دیگه نگاه میکنه !
حالا یه عده میان میگن :" آقا قبول،توضیحاتم جامع بود و با مثال برامون جا انداختی وقفه رو.اما ما آخرش نفهمیدیم این وقفه به چه درد میخوره و اصلا کجا باید ازش استفاده کرد.اصلا استفاده نکنیم ازش چی میشه ؟! "
اما پاسخ من چیه ؟!
من هم بهشون میگم : " یکم گردو و ماهی بخورید ! (فسفر داره برای مغزتون خوبه !!!) خخخخخخخخخخخخ "
اما جدا از شوخی و بی مزه بازی و مسخره کردن دیگران،این سوال،سوال بجاییه !
بهتره که یه مطلبی رو حاشیه وار توضیح بدم ؛
پردازنده ها برای اینکه از رویدادهای داخلی و خارجی مطلع بشند از دو روش میتونند استفاده کنند :
روش اول ؛ روش سرکشی یا polling :
در این روش با استفاده از برنامه نویسی،یه فواصل زمانی دلخواه رو معین میکنیم و بصورت متناوب دائم رویداد مورد نظرمون چک میشه که آیا اتفاق افتاده یا نه ! (اونایی که برنامه نویسی کردند،بهتر متوجه شدند من چی میگم !)
فرض کنید میخواین چک کنید ببینید فلان کلیدی(سوئیچ) که به میکرو وصل کردید آیا در وضعیت باز(0) است یا بسته(1) ؟
چیکار میکردید ؟ میومدین یه شرط میذاشتن که هر چند میکروثانیه یه بار (بعضی وقت ها هم کاری به تعریف مدت زمان نداشتیم !) چک کن ببین وضعیت 0 هست یا 1 ؟!
خب اینکار اگرچه برای یه برنامه 10 خطی جوابگو هست و کار راه بنداز.
اما اگه برنامه 2000 خطی شد با 10 تا حلقه تو در تو،اون موقع آیا میشه دائم یه شرط رو بررسی کرد ؟
بر فرض هم که بشه (که نمیشه معمولا !)،اینجوری که پدر پردازنده در میاد !!!!!!
تو این حالت CPU دائم در حال تکاپو و چک کردن شروط شما میشه و در بعضی مواقع سرعت اجرای دستورات کم میشه و خلاصه اشک خودتون و پردازنده رو با این ندونم کاری در میارید !
مثل این میمونه که برق خونتون قطع باشه ، بعد منتظر یه نفر باشید،هی 30 ثانیه یه بار برید از پنجره تو کوچه رو نگاه کنید که نکنه یه وقت اون شخص بیاد و زنگ رو بزنه من متوجه نشم و عصبانی برگرده و اصلا بهم بزنه و ... ! ==> آیا روانی نخواهید شد ؟!
روش دوم ؛ روش وقفه یا interrupt :
در این یکی روش،برای میکروکنترلر تعریف میکنیم که مشغول کار خودش باشه،هر وقت زمانش رسید بهش گفته میشه !
یا تو اون مثال میشه اینجوری گفت که هر وقت اون شخص مورد نظر اومد زنگ رو میزنه،دیگه نیاز دائم جلو پنجره تو کوچه رو دید بزنیم !
(نکته اخلاقی : تو کوچه رو دید نزنید،زشته !!! وگرنه میان تو کوچتونو دید میزننا ! ههه )
حالا خودتون بگید،وقفه بدرد میخوره یا نمیخوره !؟
واحد وقفه هم مثل بقیه بخش های میکروکنترلر،تنظیمات و پیکربندی ها و رجیستر های خاص خودشو داره که انشاالله در آینده و در پستی جداگانه و مفصل راجع به نحوه پیکربندی و رجیسترهای وقفه توضیح خواهم داد.
اما مهمترین رجیستری که قبلا هم معرفی شد و یکی از فلگ هاش مسئول فعال کردن وقفه سراسری بود رو یه بار دیگه میگم خدمتتون :
7.فلگ "I" یا همون "Interupt Flag" از رجیستر SREG:
این فلگ مجوز صدور وقفه را صادر میکند.
هرگاه قرار باشه وقفه ای رخ بده،بعد از اینکه دستور اجرای وقفه صادر شد میکرو چک میکنه که آیا اصلا اجازه داره اون وقفه رو عملیاتی کنه یا نه ؟!
با "یک" شدن این پرچم،مجوز صادر میشود و پس از اجرای وقفه مجددا "صفر" میشود.
خب ...
فکر کنم که دیگه همه به خوبی با وقفه آشنایی پیدا کردند.
اگر عمری بود مطالب رو ادامه خواهیم داد.
پس فعلا ...
خیلی خوب، حالا ما وقفه کردیم برا نظر نوشتیم، بعد بر میگردیم سر کارمون، پس بعدی رو بخونیم