وقفه در کنترلر AVR در Atmel AVR Studio. وقفه ها - مطالعه AVR - کاتالوگ مقالات - میکروکنترلرها - آسان است! در چه محیطی برای برنامه ریزی وقفه های میکروکنترلر

سیستم های وقفه بخش مهمی از هر سیستم کنترلی هستند.

اینکه سیستم ریزپردازنده تا چه حد کارایی خود را انجام می دهد تا حد زیادی به عملکرد آن بستگی دارد. ساختار کلی سیستم وقفه MK-51 در شکل نشان داده شده است. 14.3.

میکروکنترلرهای خانواده MK-51 از پنج منبع وقفه پشتیبانی می کنند:

* دو وقفه خارجی که از طریق ورودی‌های INT0 و INT1 می‌رسند (به ترتیب خطوط پورت P3: P3.2 و P3.3).

* دو وقفه از تایمر / شمارنده T/C0 و T/C1.

* وقفه درگاه سریال

درخواست‌های وقفه در رجیسترهای عملکرد ویژه میکروکنترلر ثبت می‌شوند: پرچم‌های IE0، IE1، TF0، درخواست‌های وقفه TF1 از INT0، INT1، T/C0 و T/C1 در رجیستر کنترل TCON (جدول 14.4) وجود دارند و پرچم‌ها RI هستند. و TI درخواست وقفه از پورت سریال - در ثبت SCON برای کنترل پورت سریال.

جدول 14.4. فرمت ثبت TCON

0 IT0 تنظیم نوع وقفه INT0

1 IE0 پرچم درخواست وقفه INT0

2 IT1 تنظیم نوع وقفه INT1

3 IE1 پرچم درخواست وقفه INT1

4 TR0 تایمر/ شمارنده 0 را فعال کنید

5 پرچم سرریز TF0 (درخواست وقفه) تایمر/ شمارنده 0

6 TR1 فعال کردن تایمر/ شمارنده 1

7 پرچم سرریز TF1 (درخواست وقفه) تایمر/ شمارنده 1

پرچم‌های TF0 و TF1 توسط سخت‌افزار تنظیم می‌شوند که تایمر/شمارگر مربوطه سرریز می‌شود (به طور دقیق‌تر، زمانی که T/Cx از حالت «همه یک‌ها» به حالت «همه صفرها» تغییر می‌کند).

پرچم های IE0 و IE1 به ترتیب توسط سخت افزار از وقفه های خارجی IT0 و IT1 تنظیم می شوند. یک درخواست خارجی می تواند باعث تنظیم پرچم شود یا زمانی که سطح سیگنال در ورودی مربوطه پایین است، یا زمانی که این سیگنال از سطح بالا به سطح پایین تغییر می کند (با فرکانسی که از نصف فرکانس ساعت خارجی MK تجاوز نمی کند).

نوع درخواست توسط نرم افزاری که بیت های IT0 و IT1 را در ثبات کنترل TCON تنظیم می کند، پیکربندی می شود. تنظیم ITx = 0 سیستم وقفه را برای درخواست سطح سیگنال پایین پیکربندی می کند، ITx = 1 - وقفه را برای درخواست سطح سیگنال پایین تنظیم می کند.

پرچم های TI و RI به ترتیب پس از پایان انتقال یا پس از پایان دریافت توسط سخت افزار رابط سریال تنظیم می شوند.

همه پرچم‌های درخواست وقفه مشخص شده به صورت برنامه‌ریزی برای تنظیم و بازنشانی در دسترس هستند. تنظیم پرچم درخواست وقفه در نرم افزار منجر به همان پاسخی از میکروکنترلر با تنظیم همان پرچم در سخت افزار می شود.

هنگامی که کنترل به روال وقفه مربوطه منتقل می شود، پرچم های TF0 و TF1 توسط سخت افزار بازنشانی می شوند.

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

پرچم‌های TI و RI فقط توسط نرم‌افزار قابل تنظیم مجدد هستند.

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

جدول 14.5. تخصیص بیت های ثبت IE

ثبت موقعیت

یادگاری بیت

تابع

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

استفاده نشده

استفاده نشده

وقفه از را غیرفعال کنید درگاه سریال

وقفه تایمر/ شمارنده T/C1 را غیرفعال کنید

وقفه از را غیرفعال کنید منبع خارجی INT1

وقفه تایمر/ شمارنده T/C0 را غیرفعال کنید

وقفه از منبع خارجی INT0 را غیرفعال کنید

به هر نوع وقفه می توان یکی از دو اولویت ممکن را به صورت برنامه ای اختصاص داد: 0 - کمترین یا 1 - بالاترین.

اولویت ها با تنظیم یا پاک کردن بیت مربوطه در ثبت اولویت قطع IP پیکربندی می شوند. فرمت این ثبت در جدول آورده شده است. 14.6.

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

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

IT0 -> TF0 -> IT1 -> TF1 -> (RI، TI)

جدول 14.6. تخصیص بیت های ثبت IP

موقعیت ثبت تابع یادگاری بیت

7 - استفاده نشده

6 - استفاده نشده

5- استفاده نشده

اولویت قطع پورت سریال 4 PS

3 PT1 تایمر / شمارنده اولویت وقفه T/C1

2 PX1 اولویت وقفه از منبع خارجی INT1

1 PT0 تایمر / شمارنده اولویت وقفه T/C0

0 PX0 اولویت قطع از منبع خارجی INT0

فراخوانی کنترل کننده وقفه پیاده سازی شده توسط سخت افزار شامل اقدامات زیر است:

* ذخیره مقدار شمارنده برنامه در پشته.

نقاط ورود کنترل کننده وقفه برای هر منبع وقفه در سخت افزار ثابت است. مقادیر آنها در جدول آورده شده است. 14.7.

جدول 14.7. آدرس نقاط ورودی برای وقفه در کنترل کننده ها

منبع وقفه

آدرس نقاط ورودی برای وقفه در کنترل کننده ها

وقفه خارجی( ITO)

تایمر شمار (TFO)

وقفه خارجی (IT1)

تایمر شمار (TF1)

پورت سریال (R1 یا T1)

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

هنگام تغییر به روال مدیریت وقفه، به طور خودکار، بدون توجه به وضعیت رجیستر اینترنت اکسپلورر، تمام وقفه هایی که دارای سطح اولویت برابر با سطح اولویت وقفه سرویس شده هستند غیرفعال می شوند - یعنی وقفه های تو در تو با سطح اولویت برابر غیرفعال می شوند. . بنابراین، یک وقفه با اولویت پایین (دارای "0" در بیت مربوطه از ثبات IP) می تواند توسط یک وقفه با اولویت بالا (دارای "1" در بیت مربوطه از ثبات IP) قطع شود، اما نه یکی با اولویت پایین سرویس وقفه با اولویت بالا نمی تواند توسط منبع دیگری قطع شود.

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


بیایید در مورد وقفه ها صحبت کنیم.کلمه وقفه برای خود صحبت می کند؛ یک فرآیند برای مدتی متوقف می شود تا اقدامات اضافی انجام شود. وقفه ها می توانند خارجی یا داخلی باشند. بگذارید یک مثال ساده را که از دوستم شنیدم برای شما بگویم ...

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

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

چندین رجیستر مسئول مدیریت وقفه ها هستند
SREG - ثبت وضعیت(ایالت ها). ما به جدول دستگاه های ورودی/خروجی نگاه می کنیم. بیت هفتم از ثبات SREG است پرچم I (وقفه) که به آن پرچم فعال وقفه جهانی می گویند.اگر پرچم حذف شود (بیت هفتم صفر است)، تمام وقفه ها غیرفعال می شوند. اگر پرچم بلند شد (I را روی 1 قرار دهید)، وقفه ها را فعال می کنیم.

پرچم I با دستورات زیر تنظیم و بازنشانی می شود:
SEI - وقفه ها را فعال کنید
CLI - وقفه ها را غیرفعال کنید
کدام وقفه ها کار می کنند با استفاده از ثبات هایی به نام - تنظیم می شوند. ماسک های قطع.
ماسک های وقفه به شرح زیر تعیین می شوند:
TIMSK،..،..،.. – مدیریت وقفه های تایمر و سایر دستگاه های داخلی.
GIMSK (GIKR در خانواده مگا) - مدیریت تمام وقفه های خارجی.
ماسک های وقفه به نوبه خود به پرچم های وقفه بستگی دارند:
TIFR و GIFR به ترتیب(با پرچم فعال کردن وقفه جهانی اشتباه گرفته نشود).

ترتیب اجرای وقفه:
هنگامی که میکروکنترلر روشن می شود، همه پرچم های وقفه به 0 بازنشانی می شوند. برای فعال کردن وقفه ها، برنامه باید پرچم I رجیستر SREG را روی 1 تنظیم کند. پس از این، رجیسترهای ماسک را با مجموعه وقفه های محلی (وقفه هایی که نیاز داریم) ثبت کنید. .
هنگامی که یک درخواست وقفه (سیگنال) می رسد، پرچم وقفه را بلند می کند (حتی اگر وقفه غیرفعال باشد، برای سازماندهی وقفه های تودرتو و اولویت بین وقفه های مختلف). اگر وقفه ها غیرفعال نباشند، کنترلر با مسئول مربوطه تماس خواهد گرفت (بردارهای وقفه) - بردار وقفه، برنامه فعلی را متوقف می کند.
بردار وقفهیک خط ثابت در ناحیه برنامه است که در صورت بروز وقفه برنامه در آنجا می رود.
کل لیست بردارهای وقفه نامیده می شود جدول برداری وقفه، که واقع شده است در ابتدای کد برنامه.
بنابراین، در لحظه ای که بردار وقفه دسترسی پیدا می کند، پرچم I از ثبات SREG و پرچمی که باعث وقفه شده است به 0 بازنشانی می شود و سایر وقفه ها را غیرفعال می کند. اگر درخواست‌های وقفه دیگری در حین اجرای وقفه رخ دهد، پرچم‌های آن وقفه‌ها بالا می‌مانند. پس از اتمام وقفه فعلی، پرچم I از رجیستر SREG برافراشته می شود و به بعدی اجازه می دهد تا اجرا شود. اگر چندین درخواست وارد شود و پرچم آنها بلند شود، ابتدا وقفه ای که بردار آن در آدرس جدول، نزدیکتر به ابتدای حافظه کوچکتر است، اجرا می شود. دومی دنبال می شود و غیره. علاوه بر این، برنامه نویس می تواند یک وقفه به اصطلاح تودرتو سازماندهی کند، زمانی که وقفه دیگری در طول اجرای برنامه وقفه رخ می دهد. سپس اجرای وقفه فعلی متوقف شده و وقفه جدید اجرا می شود و پس از آن اجرای وقفه متوقف شده از سر گرفته می شود.

به عنوان مثال، جدول بردارهای وقفه برای ATtiny2313 آورده شده است

جدول برداری وقفه برای Atmega16 به شرح زیر است:

در مقایسه، جداول به هیچ وجه مطابقت ندارند.
در خانواده ATtiny، خط بردار وقفه 16 بیت و در خانواده مگا 32 بیت (به آدرس بردارهای وقفه توجه کنید؛ بگذارید یادآوری کنم که خط آدرس در ناحیه برنامه با 16 نمایش داده می شود. کلمه بیت).

کد برنامه ATtiny2313 ممکن است به شکل زیر باشد:
.cseg .org 0 rjmp بازنشانی rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_NATjmpT زمان rjmp rjmp_ANAPJPJPRJMPJPJPrj r0_compA rj mp Timer0_compB rjmp USI_START rjmp USI_OVERFLOW rjmp EE_READY rjmp WDT_ OVERFLOW

همانطور که می بینید، بردار وقفه یک پرش نسبی به برچسب های برنامه وقفه ایجاد می کند. جدول زیر گزینه ها را نشان می دهد. 1. زمانی که هیچ وقفه ای وجود ندارد. 2، 3. با وقفه خارجی در ورودی INT_1.
اگر برچسب ها "خالی" باشند (هیچ برنامه ای در زیر برچسب وجود ندارد)، هیچ اتفاقی نمی افتد و برنامه به طور متوالی از برچسب های باقی مانده عبور می کند و با خیال راحت به فرمان می رسد. RETI- بازگشت وقفه - خروج از کنترل کننده وقفههمانطور که در ستون اول جدول نشان داده شده است.

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

کنترلرهای AVR بسته به مدل می توانند از 1 تا 8 ورودی داشته باشند وقفه های خارجی.
بیایید سیستم مدیریت وقفه خارجی را در نظر بگیریم. برای این منظور، بسته به مدل، ترکیب‌های زیر از ثبات‌های ورودی/خروجی ارائه می‌شود (به DataSheet مربوطه مراجعه کنید):
- GIMSK، EIFR، PCMSK، MCUCR؛
- GIKR، GIFR، MCUCR؛
- EIMSK، EICR، EIFR؛
GIMSK، GIKR، EIMSK - ماسک های وقفه،
EIFR، PCMSK، GIFR، EIFR - پرچم های وقفه
برای جواز یا ممنوعیت وقفه های خارجیرجیسترهای کنترلی در نظر گرفته شده‌اند: GIMSK-(General Interrupt Mask Register) (Tiny)، GICR- (General Interrupt Control Register) (Mega)، MCUCR – (MCU Control Register)




EIFR- ثبت پرچم وقفه خارجی: 1 - فعال، 0 - غیرفعال. هر بیت (پرچم) به پین ​​مربوطه اجازه می دهد تا به عنوان منبع وقفه عمل کند.

بیت های کنترل رجیستر GIMSK:
بیت 7 - INT1: درخواست وقفه خارجی 1 فعال – INT1 بیت فعال وقفه: 1 – فعال، 0 – غیرفعال. حتی اگر پین INT1 به عنوان یک خروجی پیکربندی شده باشد، وقفه ایجاد خواهد شد. بیت INT1 در ثبت پرچم EIFR قطع می شود. پین INT1 با ژنراتور ساعت همگام شده است.

بیت 6 - INT0: درخواست وقفه خارجی 0 فعال - بیت فعال وقفه INT0: 1 – فعال، 0 – غیرفعال. حتی اگر پین INT0 به عنوان یک خروجی پیکربندی شده باشد، وقفه ایجاد خواهد شد. بیت INT0 در ثبت پرچم EIFR قطع می شود. پین INT10 با ژنراتور ساعت همگام شده است.

بیت 5 - PCIE: Pin Change Interrupt Enable – بیت فعال کننده وقفه در PCINT0...7 پین: 1 – فعال، 0 – غیرفعال. هر تغییری در هر یک از پین های PCINT0...7 باعث ایجاد وقفه می شود. پین‌های PCINT0...7 برای وقفه به‌صورت جداگانه، توسط بیت‌های موجود در ثبت پرچم PCMSK پیکربندی شده‌اند.

PCMSK- پین تغییر ماسک ثبت کننده - ثبت پرچم PCMSK: 1 - مجاز، 0 - غیرفعال است. هر بیت (پرچم) به پین ​​مربوطه اجازه می دهد تا به عنوان منبع وقفه عمل کند. پین های PCINT0...7 با ژنراتور ساعت همگام نیستند، یعنی. وقفه زمانی رخ می دهد که تغییری در هر یک از پین ها رخ دهد.

مگا8

و ثبت پرچم مربوطه


بیت 7

بیت 6 - INT0: درخواست وقفه خارجی 0 فعال - بیت فعال وقفه INT0: 1 – فعال، 0 – غیرفعال. حتی اگر پین INT0 به عنوان یک خروجی پیکربندی شده باشد، وقفه ایجاد خواهد شد. بیت INT0 برای وقفه در ثبت پرچم های GIFR تنظیم شده است



GIFR - ثبت پرچم وقفه عمومی: 1 - فعال، 0 - غیرفعال. هر بیت (پرچم) به پین ​​مربوطه اجازه می دهد تا به عنوان منبع وقفه عمل کند.

بیت های کنترل رجیستر GICR:
بیت 7– : درخواست وقفه خارجی 1 فعال – وقفه فعال کردن بیت INT1: 1 – مجاز، 0 – ممنوع. حتی اگر پین INT1 به عنوان یک خروجی پیکربندی شده باشد، وقفه ایجاد خواهد شد. بیت INT1 در ثبت پرچم‌های GIFR قطع می‌شود

بیت 6 - INT0: درخواست وقفه خارجی 0 فعال - وقفه فعال کردن بیت INT0: 1 – مجاز، 0 – ممنوع. حتی اگر پین INT0 به عنوان یک خروجی پیکربندی شده باشد، وقفه ایجاد خواهد شد. بیت INT0 برای وقفه در ثبت پرچم های GIFR تنظیم شده است

بیت 5 - INT2: درخواست وقفه خارجی 2 فعال - وقفه فعال کردن بیت INT2: 1 – مجاز، 0 – ممنوع. حتی اگر پین INT2 به عنوان یک خروجی پیکربندی شده باشد، وقفه ایجاد خواهد شد. بیت INT2 برای وقفه در ثبت پرچم های GIFR تنظیم شده است

عملکرد ورودی‌های INT0 و INT1 در همه کنترل‌کننده‌ها توسط بیت‌های مرتبه پایین رجیستر MCUCR کنترل می‌شوند.

MCUCR– ثبت کنترل MCU
بیت های کنترل:
بیت‌های 1، 0 - ISC01، ISC00 (کنترل حس وقفه 0 بیت 1 و بیت 0) - وضعیت این بیت‌ها رویداد روی پین INT0 را تعیین می‌کند که یک وقفه INT0 ایجاد می‌کند:
ISC01=0، ISC00=0 – سطح صفر منطقی.
ISC01=0، ISC00=1 – هرگونه تغییر حالت منطقی.
ISC01=1، ISC00=0 – در لبه سقوط.
ISC01=1، ISC00=1 – در لبه افزایشی.

بیت های 3، 2 - ISC11، ISC10 (کنترل حس وقفه 1 بیت 1 و بیت 0) - وضعیت این بیت ها سطح سیگنال را در پین INT1 تعیین می کند که وقفه INT1 را ایجاد می کند:
ISC11=0، ISC10=0 – سطح صفر منطقی.
ISC11=0، ISC10=1 – هرگونه تغییر حالت منطقی.
ISC11=1، ISC10=0 – در لبه سقوط.
ISC11=1، ISC10=1 – در لبه افزایشی.

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

Ldi r16.0x80 ; در r16 عدد 0b10000000 ldi r17.0x0C را بنویسید. در r17 عدد 0b00001100 را از MCUCR,r17 بنویسید. وقفه در لبه افزایشی ISC11=1، ISC10=1 از GIMSK,r16 ایجاد می شود. ماسک INT0 sei را تنظیم کنید
به هر حال، شما می توانید یک وقفه در tiny2313 ایجاد کنید روی هر پین PCINT0…7، در مگا تا سری 48 این ویژگی ها موجود نیست ...
عملیاتی وجود دارد که در طی آنها ممکن است وقفه هایی رخ دهد که باعث از کار افتادن برنامه شود. در چنین مواردی قبل از شروع عملیات CLI و بعد از SEI می نویسیم. چنین عملیاتی نامیده می شود - اتمی.
مطلوب است که برنامه های وقفه فشرده و با حداکثر سرعت اجرا شوند، زیرا هدف از هر وقفه ثبت یک رویداد است. اگر با توجه به دلایل مختلفبرنامه به کندی اجرا می شود، کافی است رویداد را ضبط کنید و کمی بعد آن را پردازش کنید.

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

یکی از مزیت های میکروکنترلر ATmega8 محدوده وسیع وقفه های مختلف آن است.

قطع کنیدرویدادی است که با وقوع آن اجرای برنامه اصلی به حالت تعلیق در می آید و تابعی فراخوانی می شود که وقفه ای از نوع خاصی را مدیریت می کند.

وقفه ها به داخلی و خارجی تقسیم می شوند. منابع وقفه های داخلی شامل ماژول های میکروکنترلر داخلی (تایمر، فرستنده USART و غیره) است. وقفه های خارجی زمانی اتفاق می افتد که سیگنال های خارجی به پایه های میکروکنترلر می رسند (به عنوان مثال سیگنال هایی در پایه های RESET و INT). ماهیت سیگنال هایی که منجر به وقوع وقفه می شود در رجیستر کنترل تنظیم می شود MCUCR، به ویژه در بیت ها - ISC00 (بیت 0) و ISC01 (بیت 1) برای ورودی INT 0. ISC10 (bit2) و ISC11 (bit3) برای ورودی INT1.

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

بردارهای وقفه در Atmega8

نشانی منبع وقفه شرح
0x0000 تنظیم مجدد سیگنال تنظیم مجدد
0x0001 INT0 درخواست وقفه خارجی در ورودی INT0
0x0002 INT1 درخواست وقفه خارجی در ورودی INT1
0x0003 T/C1 ضبط تایمر T/C1
0x0004 T/C1 مطابقت T/C1 تایمر مقایسه ثبت A
0x0005 T/C1 با رجیستر B تایمر T/C1 مقایسه کنید
0x0006 T/C1 سرریز شمارنده T/C1
0x0007 T/C0 سرریز شمارنده T/C0
0x0008 SPI انتقال داده SPI تکمیل شد
0x0009 UART گیرنده UART دریافت داده را تکمیل کرده است.
0x000A UART ثبت داده UART خالی است
0x000B UART انتقال داده ها توسط فرستنده گیرنده UART تکمیل شده است
0x000C ANA_COMP وقفه از مقایسه کننده آنالوگ

مدیریت را قطع کنید

4 رجیستر مسئول مدیریت وقفه ها در ATmega8 هستند:

GIMSK(با نام مستعار GICR) - وقفه ها را بر اساس سیگنال ها در ورودی های INT0، INT1 ممنوع یا فعال کنید

GIFR- مدیریت تمام وقفه های خارجی

TIMSK, TIFR- مدیریت وقفه ها از تایمر / شمارنده

ثبت نام GIMSK (GICR)

INTFx=1: یک وقفه در ورودی INTx رخ داده است. هنگام ورود به روال مدیریت وقفه، INTFx به طور خودکار به حالت گزارش بازنشانی می شود. 0

ثبت نام TIMSK

7 6 5 4 3 2 1 0
TOIE1
OCIE1A
OCIE1B
-
TICIE
-
TOIE0
-

TOIE1=1: وقفه سرریز T/C1 فعال است

OCIE1A=1: وقفه زمانی که رجیستر مقایسه A با محتویات شمارنده T/C1 فعال شده مطابقت دارد

OCIE1B=1: وقفه زمانی که رجیستر مقایسه B با محتویات شمارنده T/C1 فعال شده مطابقت دارد

TICIE=1: وقفه زمانی فعال می شود که شرایط ضبط وجود داشته باشد

TOIE0=1: وقفه سرریز T/C0 فعال است

ثبت نام TIFR

7 6 5 4 3 2 1 0
TOV1
OCF1A
OCF1B
-
ICF1
-
TOV0
-

TOV1=1: سرریز T/C1 رخ داده است

OCF1A=1: ثبت مقایسه A با محتویات شمارنده T/C1 مجاز مطابقت دارد

OCF1B=1: ثبت مقایسه B با محتویات شمارنده T/C1 مجاز مطابقت دارد

ICF=1: شرایط گرفتن برآورده شده است

TOV0=1: سرریز T/C0 رخ داده است

هنگام ورود به زیربرنامه مدیریت وقفه، پرچم ثبت TIFR مربوط به وقفه به طور خودکار به حالت گزارش بازنشانی می شود. 0

وقفه ها فقط زمانی کار می کنند که وقفه های عمومی در رجیستر وضعیت SREG فعال باشند (بیت 7 = 1). هنگامی که یک وقفه رخ می دهد، این بیت به طور خودکار به 0 بازنشانی می شود و وقفه های بعدی غیرفعال می شود.

در این مثال، پین INT0 در حالت ورودی pull-up فعال است. هنگامی که پایه با استفاده از یک دکمه به زمین متصل می شود، منطق 0 روی آن تنظیم می شود (لبه سیگنال از ولتاژ تغذیه به 0 می رسد) و کنترل کننده وقفه فعال می شود و لامپ متصل به پین ​​صفر پورت را روشن می کند. ب

void lampON()
{
PORTB.0=1;
DDRB.0=1;
}

وقفه void ext_int0_isr(void)
{
lampON();
}

DDRD.2=0;
PORTD.2=1;

SREG|= (1 while(1) (

مثال بالا همچنین نشان می دهد که چگونه بردارهای وقفه در Code Vision AVR تنظیم می شوند (interrupt void ext_int0_isr(void)). بردارهای وقفه برای موارد دیگر به طور مشابه تنظیم می شوند:

EXT_INT0 2
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC 11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
TWI 18
SPM_READY 19

قسمت میکروکنترلرهای AVRشامل تعداد زیادی دستگاه جانبی (ADC، تایمر/ شمارنده، EXTI، مقایسه کننده آنالوگ، EEPROM، USART، SPI، I2C و غیره) است که هر کدام می توانند اقدامات خاصی را روی داده ها/سیگنال ها و سایر اطلاعات انجام دهند. این دستگاه ها برای بهبود کارایی برنامه و کاهش هزینه ها در هنگام توسعه انواع دستگاه های مبتنی بر میکروکنترلرهای AVR در میکروکنترلر ادغام می شوند.

پردازنده با دستگاه های جانبی از طریق رجیسترهای ورودی/خروجی که در حافظه داده قرار دارند ارتباط/کنترل می کند و به آنها اجازه می دهد مانند متغیرهای معمولی استفاده شوند. هر دستگاه دارای رجیستر I/O مخصوص به خود است.

همه رجیسترهای ورودی/خروجی را می توان به سه گروه تقسیم کرد: رجیسترهای داده، رجیسترهای کنترل و ثبت وضعیت.

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

همانطور که احتمالاً قبلاً حدس زده اید، برای برقراری ارتباط و همگام سازی بین دستگاه و پردازنده، از "Status Registers" استفاده می شود که وضعیت فعلی یک دستگاه خاص را ذخیره می کند. هر حالتی که ممکن است دستگاه در آن باشد مربوط به یک "بیت" است. در حالت ثبت" (پرچم)، که مقدار فعلی آن در مورد وضعیت فعلی این دستگاه یا عملکرد فردی آن (کار انجام شده/تکمیل نشده، خطا در پردازش داده ها، ثبت خالی و غیره) صحبت می کند.

مکانیسم ارتباطی بین پردازنده و یک دستگاه جانبی توسط نظرسنجی پرچم اجرا می شود که وظیفه خاصی از این دستگاه را بر عهده دارند. بسته به مقدار یک پرچم خاص (وضعیت دستگاه)، می توانید جریان اجرای برنامه (انشعاب) را تغییر دهید. به عنوان مثال:

بررسی اینکه آیا پرچم خاصی تنظیم شده است (یک رویداد رخ داده است):

اگر (RegX & (1<< Flag) ) // اگر پرچم در ثبات RegX تنظیم شده باشد
{
// کاری بکنید
}

انتظار برای تکمیل برخی از اقدامات (رویداد):

while(!(RegX & (1<

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

به منظور افزایش کارایی برنامه ها برای میکروکنترلرهای AVR و همچنین تسهیل فرآیند ایجاد و اشکال زدایی این برنامه ها، توسعه دهندگان تمام دستگاه های جانبی را به "منابع وقفه" مجهز کرده اند. منابع قطع شودبرخی از دستگاه ها ممکن است چندین منبع وقفه داشته باشند.

با استفاده از منابع وقفه اجرا می شود مکانیسم هماهنگ سازی، بین پردازنده و دستگاه جانبی، یعنی پردازنده فقط زمانی شروع به دریافت داده ها، پرچم های نظرسنجی و سایر اقدامات روی دستگاه جانبی می کند که دستگاه برای این کار آماده باشد (تکمیل پردازش داده ها را گزارش می دهد، یک خطا در طول پردازش داده ها، رجیستر خالی است، و غیره) و غیره)، با ایجاد یک "درخواست وقفه" ( درخواست وقفهبسته به مقدار برخی از پرچم ها (دستگاه/عملکرد/وضعیت رویداد).

در ادبیات، اغلب، کل زنجیره رویدادها، از "درخواست وقفه" (IRQ) تا "رویه خدمات وقفه" (ISR)، به اختصار به عنوان یک وقفه ( قطع کنید).

وقفه چیست؟


وقفه سیگنالی است که پردازنده را از وقوع یک رویداد مطلع می کند. در این حالت اجرای دستورات فعلی به حالت تعلیق در می آید و کنترل به رویه مدیریت وقفه مربوط به این رویداد منتقل می شود و پس از آن اجرای کد دقیقاً از نقطه ای که قطع شده است (بازگشت کنترل) ادامه می یابد. (ویکی)

روال را قطع کنید(Interrupt Service Routine) چیزی نیست جز یک تابع/زیر روال که باید در هنگام وقوع یک رویداد خاص اجرا شود. ما از کلمه "رویه" استفاده خواهیم کرد تا بر تفاوت آن با سایر عملکردها تأکید کنیم.

تفاوت اصلی بین روال و توابع ساده این است که به جای معمول "بازگشت از تابع" (فرمان اسمبلی RET)، باید از "بازگشت از وقفه" (فرمان اسمبلر RETI) استفاده کنید - " بازگشت از وقفه".

ویژگی های وقفه AVR:

  • هر دستگاه جانبی که بخشی از میکروکنترلرهای AVR است حداقل یک منبع وقفه دارد. در بین تمام این وقفه ها باید وقفه ریست را نیز گنجاند که هدف آن با بقیه وقفه ها متفاوت است.
  • هر وقفه دارای یک بردار (پیوند) است که به روال سرویس وقفه اشاره دارد. همه بردارهای وقفه در همان ابتدای حافظه برنامه قرار دارند و با هم "جدول بردارهای وقفه" را تشکیل می دهند.
  • هر وقفه با یک "بیت فعال کننده وقفه" خاص مرتبط است، بنابراین، برای استفاده از یک وقفه خاص، باید در "بیت فعال کردن وقفه" - گزارش آن بنویسید. واحد. علاوه بر این، صرف نظر از اینکه وقفه‌های خاصی را فعال کرده‌اید یا نه، میکروکنترلر پردازش این وقفه‌ها را شروع نمی‌کند تا زمانی که یک وقفه منطقی در «بیت فعال کردن وقفه جهانی» در ثبت وضعیت SREG نوشته شود. همچنین، برای غیرفعال کردن همه وقفه‌ها (برای یک زمان نامحدود)، یک صفر منطقی باید در بیت فعال کننده وقفه کلی نوشته شود.

وقفه Reset را بر خلاف سایرین نمی توان غیرفعال کرد. به چنین وقفه هایی وقفه های غیر قابل ماسک نیز می گویند.

  • هر وقفه دارای یک اولویت کاملاً تعریف شده است. اولویت یک وقفه بستگی به موقعیت آن در جدول بردار وقفه دارد. جدول، و بر این اساس در برنامه های حافظه، وقفه خارجی INT0، به دنبال وقفه Reset در "جدول بردار وقفه"، اولویت کمتری نسبت به Reset دارد، اما بالاتر از سایر وقفه ها و غیره است.

جدول بردار وقفه به جز بردار Reset را می توان با تنظیم بیت IVSEL در ثبات GICR به ابتدای بخش Boot حافظه فلش منتقل کرد. بردار تنظیم مجدد را نیز می توان با برنامه ریزی فیوز بیت - BOOTRST به ابتدای بخش Boot حافظه فلش منتقل کرد.



شکل 1 جدول برداری وقفه ATmega16

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


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

اول، روال سرویس وقفه نمی تواند چیزی را به عنوان آرگومان بپذیرد (void)، و همچنین نمی تواند چیزی را برگرداند (void). این به این دلیل است که تمام وقفه ها در AVR ناهمزمان هستند، بنابراین مشخص نیست که اجرای برنامه در کجا قطع می شود، از چه کسی باید مقدار را دریافت کرد و به چه کسی بازگرداند و همچنین زمان ورود و به حداقل رساندن خروج از وقفه

void isr (باطل)

ثانیاً، قبل از نمونه اولیه تابع، باید نشان دهید که این یک رویه مدیریت وقفه است. همانطور که می دانید در زبان C فقط کد استفاده شده در تابع main اجرا می شود. از آنجایی که رویه مدیریت وقفه در تابع اصلی در هیچ کجا استفاده نمی شود، به طوری که کامپایلر آن را به عنوان غیرضروری «خارج نمی کند»، قبل از نمونه اولیه رویه باید نشان داده شود که این تابع یک رویه مدیریت وقفه است.

نمونه اولیه رویه مدیریت وقفه در محیط AVR Studio

#عبارتند از

ISR (XXX_vect)
{

}

در AVR Studio (AVR GCC)، هر روال وقفه با یک تعریف کلان ISR شروع می‌شود و به دنبال آن ساختار زیر در پرانتز قرار می‌گیرد:

XXX_vect

که در آن "XXX" نام بردار وقفه است. همه نام های برداری برای یک میکروکنترلر AVR خاص را می توان در "جدول برداری وقفه" صفحه داده میکروکنترلر یا در فایل هدر آن یافت. به عنوان مثال، "جدول برداری وقفه" برای میکروکنترلر ATmega16 در شکل 1 نشان داده شده است، جایی که در ستون منبع، نام تمام بردارهای وقفه ذکر شده است. نام ها را می توان در فایل هدر این میکروکنترلر نیز مشاهده کرد (C :\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\avr\iom16.h)، به شکل 2 مراجعه کنید. تنها کاری که باید انجام دهیم این است که نام بردار مورد نیاز خود را در جدول پیدا کرده و پسوند را اضافه کنیم. "_vect" به آن.


Fig.2 فایل هدر ATmega16 برای AVR Studio

به عنوان مثال، بیایید یک روش مدیریت وقفه برای دریافت بایت از طریق USART (USART، Rx Complete) بنویسیم:

ISR (USART_RXC_vect)
{
// بدنه کنترل کننده وقفه
}

ضمناً: قبل از استفاده از هرگونه وقفه در AVR Studio، باید فایل های هدر io.h و interrupt.h را در پروژه قرار دهید:

#عبارتند از
#عبارتند از

می توانید اطلاعات بیشتری در مورد کنترل کننده های وقفه در AVR Studio (AVR GCC) در بخش مدیریت وقفه avr-libc بخوانید.

نمونه اولیه روش مدیریت وقفه در محیط ImageCraft

#پراگما وقفه_کنترل کننده : iv_XXX
خالی< handler_name>(خالی)
{
// بدنه کنترل کننده وقفه
}

در محیط ImageCraft، نمونه اولیه روال وقفه به صورت زیر است:

خالی< handler_name>(خالی)

جایی که ، این هر نامی است که می خواهید به این کنترل کننده وقفه بدهید. یکی از الزامات برای اعلام رویه های مدیریت وقفه این است که قبل از نمونه اولیه تابع باید نشان داده شود که یک کنترل کننده وقفه است. این با استفاده از دستورالعمل پراگما انجام می شود interrupt_handler :

#پراگما وقفه_کنترل کننده : iv_XXX

جایی که این نام تابعی است که به عنوان کنترل کننده وقفه استفاده می شود و ساخت "iv_XXX" نام بردار وقفه (XXX) با پیشوند "iv_" است. مانند مورد AVR Studio، همه نام های بردار برای یک میکروکنترلر AVR خاص را می توان در "جدول بردار وقفه" صفحه داده یک میکروکنترلر معین یا در فایل هدر آن یافت (شکل 3 را ببینید).


شکل 3 فایل هدر ATmega16 برای ImageCraft IDE

به عنوان مثال، رویه مدیریت یک وقفه برای دریافت بایت از طریق USART (USART، Rx Complete) در محیط ImageCraft به این صورت خواهد بود:

#pragma interrupt_handler usart_rxc_isr: iv_USART_RXC
void usart_rxc_isr(void)
{
// بدنه کنترل کننده وقفه
}

اطلاعات بیشتر در مورد روش های مدیریت وقفه در ImageCraft IDE را می توان در منوی Help->Programming the AVR->Interrupt Handlers در محیط توسعه یافت.

گاهی اوقات، اگر چندین کنترل کننده وقفه نیاز به انجام یک کار داشته باشند، برای ذخیره حافظه برنامه، می توانید چندین بردار وقفه را به یک روال وقفه هدایت کنید.

در AVR Studio به این صورت است:

ISR (INT0_vect)
{
// کاری بکنید
}
ISR(INT1_vect، ISR_ALIASOF(INT0_vect) );

ابتدا رویه پردازش وقفه برای یک بردار خاص، در این مورد INT0 می آید. همه رویه‌های دیگر می‌توانند به هر کنترل کننده وقفه با استفاده از ساختار اشاره کنند:

ISR (YYY_vect، ISR_ALIASOF(XXX_vect) );

که در آن YYY نام بردار وقفه است که به کنترل کننده وقفه قبلاً اعلام شده برای بردار XXX اشاره دارد.

در ImageCraft به این صورت است:

#پراگما وقفه_کنترل کننده : iv_XXX : iv_YYY
خالی< handler_name>(خالی)
{
// بدنه کنترل کننده وقفه
}

#پراگما وقفه_کنترل کننده : iv_XXX
#پراگما وقفه_کنترل کننده : iv_YYY
خالی< handler_name>(خالی)
{
// بدنه کنترل کننده وقفه
}

که در آن بردارهای XXX و YYY به یک کنترل کننده وقفه اشاره دارند .

وقفه در میکروکنترلرهای AVR چگونه کار می کند؟

1. فرض کنیم که " درخواست وقفه” (IRQ).

ضمناً: اگر چندین درخواست برای پردازش وقفه به طور همزمان اتفاق بیفتد، ابتدا وقفه با بالاترین اولویت پردازش می شود، همه درخواست های دیگر پس از اتمام وقفه با اولویت بالا پردازش می شوند.

2. معاینه.

اگر بیت فعال برای این وقفه تنظیم شود (بیت فعال کننده وقفه)، و بیت I (بیت فعال کننده وقفه عمومی) ثبت وضعیت پردازنده (SREG) تنظیم شود، در این صورت پردازنده شروع به آماده سازی روال سرویس وقفه می کند، در حالی که حالت کلی بیت فعال کننده وقفه (I-bit ثبت SREG) بازنشانی می شود، بنابراین تمام وقفه های دیگر غیرفعال می شود. این اتفاق می افتد به طوری که هیچ رویداد دیگری نمی تواند پردازش وقفه فعلی را مختل کند.

به هر حال: اگر در روال مدیریت وقفه، I-bit را روی حالت log تنظیم کنید. واحدها، سپس هر وقفه فعال شده می تواند به نوبه خود پردازش وقفه فعلی را مختل کند. چنین وقفه هایی را وقفه های تو در تو می نامند.

3. آماده سازی.

پردازنده اجرای دستورات مونتاژ فعلی را کامل می کند و سپس آدرس دستور بعدی را روی پشته قرار می دهد (PC->STACK). در مرحله بعد، پردازنده بررسی می کند که کدام منبع وقفه یک "درخواست وقفه" (IRQ) ارسال کرده است، پس از آن، با استفاده از بردار این منبع (پیوند) از جدول برداری (که به طور محکم به هر منبع وقفه اختصاص داده شده است)، به سمت رویه پردازش وقفه (دستورالعمل JMP) همین است، پردازنده حداقل 4 سیکل ساعت را صرف می کند (بسته به لحظه ظاهر شدن درخواست و مدت زمان اجرای دستور فعلی) این زمان پاسخگویی بسیار خوبی به IRQ است، در مقایسه با میکروکنترلرهای سایر سازندگان

به هر حال: اگر یک IRQ در حالی که میکروکنترلر در حالت خواب است رخ دهد، زمان پاسخ به IRQ چهار سیکل ساعت دیگر به اضافه زمان ذخیره شده در فیوز بیت های SUT1 و SUT0 (زمان راه اندازی) افزایش می یابد.

وقفه - رویدادی که نیاز به پاسخ فوری پردازنده دارد. پاسخ این است که پردازنده پردازش برنامه فعلی را قطع می کند ( برنامه قطع شده) و اجرای برنامه دیگری را ادامه می دهد ( برنامه قطع کننده) مخصوص این رویداد طراحی شده است. پس از اتمام این برنامه، پردازنده به اجرای برنامه قطع شده باز می گردد.

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

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

بردار حالت اولیه شامل تمام اطلاعات لازم برای راه اندازی اولیه برنامه است. در بسیاری از موارد، بردار حالت اولیه تنها حاوی یک عنصر است - آدرس شروع برنامه در حال راه اندازی.

بردار وقفهبردار حالت اولیه برنامه قطع کننده (هندلر) است و شامل تمام اطلاعات لازم برای انتقال به کنترل کننده از جمله آدرس شروع آن است. هر نوع وقفه دارای بردار وقفه خاص خود است که اجرای کنترل کننده مربوطه را آغاز می کند. به طور معمول، بردارهای وقفه در مکان های حافظه ثابت اختصاص داده شده ویژه با آدرس های کوتاه ذخیره می شوند که نشان دهنده جدول برداری وقفه. برای پرش به برنامه وقفه مناسب، پردازنده باید بردار وقفه و آدرس این بردار را داشته باشد. در این آدرس، به عنوان یک قاعده، یک فرمان پرش بدون قید و شرط به زیربرنامه مدیریت وقفه وجود دارد.

به عنوان یک قاعده، کنترل ذخیره و بازگشت به کنترل کننده وقفه اختصاص داده می شود. در این مورد، کنترل کننده از سه بخش تشکیل شده است - مقدماتی (پرولوگ) و نهایی (پایان)، که تعویض برنامه را تضمین می کند، و برنامه قطع کننده واقعی، که عملیات درخواست شده توسط درخواست را انجام می دهد. زمان پاسخ به عنوان فاصله زمانی از لحظه دریافت درخواست وقفه تا شروع اجرای برنامه وقفه تعریف می شود.


t p- زمان پاسخگویی سیستم به وقفه؛
t z- زمان ذخیره وضعیت برنامه قطع شده؛
t ppr- زمان برنامه قطع واقعی؛
تی در- زمان بازگرداندن وضعیت برنامه قطع شده

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

اگر درخواست وقفه تا زمانی که یک درخواست جدید از همان منبع می رسد (همان اولویت) سرویس داده نشود، سپس اشباع سیستم را قطع کند. در این صورت بخشی از درخواست های وقفه از بین می رود که برای عملکرد عادیمیکروکنترلر مجاز نیست

ویژگی های سیستم وقفههستند:

  • تعداد کل درخواست های وقفه تعداد منابع درخواست وقفه؛
  • نوع نمایش وقفه - به عنوان یک قاعده، درخواست وقفه با یک سطح سیگنال منطقی نشان داده می شود.
  • اولویت وقفه - ترتیب پردازش هر درخواست وقفه را تعیین می کند؛ هر چه اولویت بالاتر باشد، تاخیر در اجرای برنامه وقفه برای آن کوتاهتر است.
  • زمان پاسخ - فاصله زمانی بین ظهور درخواست وقفه و شروع اجرای برنامه وقفه.
  • تأخیر وقفه - با کل زمان ذخیره و بازیابی برنامه تعیین می شود.
  • عمق، معمولاً با تعداد سطوح اولویت در سیستم وقفه منطبق است.
  • قطع اشباع سیستم؛
  • لحظات مجاز قطع برنامه (معمولاً پایان اجرای دستور بعدی).

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




بالا