وقفه Interrupt

به وسیله وقفه می توان عملیاتی که به صورت عادی در میکرو کنترلر در حال انجام است را موقتا متوقف کرد و فعالیت دیگری را انجام داد. فرض کنید میکرو کنترلر در یک حلقه بی نهایت هر یک ثانیه یک بار تاریخ و ساعت را از تراشه ds1307 می خواند و بر روی LCD نمایش می دهد. می خواهیم با زدن یک دکمه عملیات موقتا متوقف شده، روی LCD کلمه Menu نوشته شود.

 

منابع وقفه:

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

 

منابع وقفه می توانند داخلی یا خارجی باشند، وقفه های داخلی Internal Interrupt وقفه هایی هستند که عامل ایجاد کننده آن داخل خود تراشه میکروکنترلر است و وقفه هایی خارجی External Internal وقفه هایی هستند که عامل آن خارج از میکروکنترلر باشد که بر روی پایه های خاصی از میکروکنترلر رخ می دهند.

 

مد وقفه یا نوع حساسیت وقفه:

وقفه ها در چند حالت (Mode) انجام می شود (این مورد را با عنوان حساسیت وقفه ها نیز می شناسند):

1. وقفه حساس به سطح (Low level):

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

2. وقفه پایین رو (Faling Edge)

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

3. وقفه بالا رو (Rising Edge)

گذار از صفر به یک، وقفه را فعال می کند.

4. وقفه دو لبه (Any Changes)

گذار از صفر به یک یا از یک به صفر، وقفه را فعال می کند.

 

وقفه های حساس به لبه بالا رو، لبه پایین رو وقفه های پرچم دار هستند ولی وقفه حساس به سطح، پرچم دار نیست.

 

Atmega32 /Atmega16 دارای سه وقفه خارجی بر روی پین های 2 و 3 از پورت D و پین 2 از پورت B می باشد. در جدول زیر اطلاعات مربوط به این سه وقفه را مشاهده می کنید (شماره پایه ها مربوط به Atmega16 | Atmega32 است):

نام پین شماره پایه نام وقفه نوع حساسیت
PD2 پایه 16 INT0 حساس به لبه - حساس به سطح
PD3 پایه 17 INT1 حساس به لبه - حساس به سطح
PB2 پایه 3 INT2 حساس به لبه

وقفه های خارجی می توانند حساس به سطح level-triggered یا حساس به لبه edge-triggered باشند که این مورد می تواند توسط برنامه نویس تنظیم شود. توجه کنید که INT0 و INT1 می توانند به عنوان حساس به سطح یا حساس به لبه تنظیم شوند ولی وقفه INT2 تنها می تواند حساس به لبه باشد.

 

فعال کردن وقفه خارجی:

برای فعال کردن وقفه خارجی ابتدا لازم است با چند رجیستر مرتبط با وقفه آشنا شویم. این رجیسترها عبارتند از GIFR, GICR, MCUCR, MCUCSR. در مورد ATmega16 این رجیستر ها را می توان در دیتا شیت آن در بخش Register Summery ببینیم.

 

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

1. فعال کردن کلی وقفه در میکرو کنترلر:

در گام اول، باید فعال کننده کلی وقفه ها فعال باشد. این مورد را می توان به دو صورت انجام داد،

  •  یک کردن بیت هفتم در رجیستر SREG که به عنوان بیت Global Interrupt Enable نیز شناخته می شود.
  •  با استفاده از دستور اسمبلی SEI (SEI  مخفف Set Interrupt می باشد.)

توضیح: رجیستر SREG سرنام Status Register به معنای رجیستر وضعیت می باشد. دستور set در اسمبلی مقدار را برابر یک قرار می دهد.

2. فعال کردن یکی از وقفه های خارجی موجود در میکروکنترلر:

در گام دوم باید مشخص کنید کدام وقفه (ها) قرار است فعال باشد. رجیستر GICR برای فعال یا غیر فعال کردن وقفه های خارجی استفاده می شود. GICR سر نام General Interrupt Control Register می باشد همانطور که مشاهده می کنید بیت های 5، 6 و 7 مربوط به وقفه هستند. با  قرار دادن مقدار 1 در آن بیت، آن وقفه فعال می شود.

0 1 2 3 4 5 6 7 Bit
IVCE IVSE - - - INT2 INT1 INT0  
R/W R/W R R R R/W R/W R/W Rea/write
0 0 0 0 0 0 0 0 Initial Value

 

3. تنظیم مد وقفه یا نوع حساسیت آن:

باید نوع حساسیت  وقفه را مشخص کرد. تنظیم حساسیت وقفه با استفاده از رجیسترهای MCUCR و MCUCSR انجام می شود.

MCUCR:         MCU General Control Register

MCUCSR:   MCU Control and Status Register

 

در مثالی ساده تصمیم داریم با استفاده از وقفه INT0، هنگام فشار یک Push Button یک LED را روشن کنیم. مداری که استفاده می کنیم به شکل زیر است: (فراموش نکنید که حتما بر روی پوش باتن یه مقاومت بالاکش قرار دهید).

 

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