وقفه خارجی یا External interrupt ، چه کار بردی در میکروکنترلر ها دارد، آیا می توان برنامه ای را بدون استفاده از وقفه ها راه اندازی کرد؟ با قسمت دوازدهم از آموزش کامل avr ساختنی همراه باشید تا پاسخ سوال های خود را پیدا کنید.

اگرچه میکروکنترلرها می توانند از پورت های I/O دیجیتال ورودی هایی قبول کنند ، اما بهتر است که وقفه ها را از از رخ داد های خارجی دریافت کرد. دلیل اصلی این مسأله این است که برای برنامه ای که بر مبنای وقفه نوشته شده است ، توجه کمتری لازم است. یک رخداد وقفه ای ،جریان اجرای  برنامه را به یک  کد کاملا مستقل سوق می دهد، که با عنوان «وقفه زیر روال» شناخته می شود. منابع بسیار زیادی برای وقفه میکروکنترلرها موجود است. بسیاری از ان ها توسط ماژولهای داخلی تولید می شوند که تحت عنوان ماژول های داخلی شناخته می شوند. و دو پین برای دریافت وقفه های خارجی وجود دارند که این امکان را فراهم می کنند که مستقیما وقفه هایی که از خارج میکرو تولید شده اند را دریافت کند .

برای اجرای یک وقفه زیر روال ، فراهم آوردن نیازمندی های زیر ضروری هستند:

  • منبع مشخص وقفه می بایست توسط تنظیمات متناسب ماسک/ وقفه بیت فعال کننده ، فعال شود.
  • وقفه زیر روال می بایست موجودیت داشته باشد. اگر کدی برای اجرا وجود نداشته باشد، بنابراین، زیر روال پوچی می بایست رخ دهد که حافظه مشخصی هم به این وقفه اختصاص داده شده است.
  • بیت نشان گر فعال وقفه در ثبات وضعیت (SREG) می بایست بر روی «۱» منطقی تنظیم شود. برای یان مهم، دستورالعملی تحت عنوان « sei» وجود دارد که مخفف Set Interrupt Enable است. در AVR Studio،تابعی به نام SEI() وجود دارد. این تابع می بایست فراخوانی شود تا اجرای وقفه زیر روال به جریان بی افتد.
  • در نهایت اتفاق (event) می بایست رخ دهد تا اجرای روال به جریان بی افتد.
  • دستورالعمل دیگری با نام « cli » وجود دارد (AVR Studio  شامل تابعی از زبان c با نام [cli] می شود) که با راه اندازی مجدد یا ریست کردن نشان گر وقفه فعال، اجرای هر زیر روالی را از کار می اندازد.
  • همچنین AVR Stuido  دارای هدرفایل دیگری با نام «avr/interrupt.h» است که وظیفه رسیدگی به زیر روال ها را دارد و اجتماع کد ها در Cرا آسان تر می سازد.
در ساختنی بخوانید :
تقویت کننده یا آمپلی فایر صوتی و کلاس های آن ها را بشناسید

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

نوشتن یک زیر روال وقفه در کد C  یک میکروکنترلر کاری سخت خواهد بود و برای تازه کار ها کمی پیچیده است. بنابراین توسعه دهندگان AVR GCC از تعدادی سمبل ها و ماکرو برای نمایش وقفه ها استفاده کرده اند که موجب کم حجم سازی کدهای نوشته شده در بسیاری از برنامه ها شده است. لیستت سمبل ها و ماکرو ها در این سند آنلاین فهرست شده اند. در اینجا فرض بر این است که می خواهیم زیر روال وقفه را برای وقفه خارجی ۰ و وقفه خارجی ۱ بنویسیم . کد چیزی شبیه به کد زیر خواهد بود:

// کد وقفه زیر روال آغاز می شود
ISR(INT0_vect)
{
// کد برای وقفه ۰
}
ISR(INT1_vect)
{
// کد برای وقفه ۱
}
// کد وقفه زیر روال پایان می پذیرد.

و برای آن قسمت از کد که وقفه ها را فعال می کند ، از تابع sei() استفاده خواهیم کرد.

ثبات های در ارتباط با وقفه های خارجی

MCU Control Register– MCUCR
Bit ۷ ۶ ۵ ۴ ۳ ۲ ۱ ۰
Bit Name SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00
Read/Write RW RW RW RW RW RW RW RW
Initial value ۰ ۰ ۰ ۰ ۰ ۰ ۰ ۰

ISC11, ISC10, ISC00: بیت ۱ و بیت ۰ ، بیت حسگر کنترل وقفه  برا وقفه ۱ و وقفه ۰

اگر I-BIT ثبات SREG و ماسک وقفه متناظر در GICR تنظیم شده باشند، وقفه خارجی ۱ توسط پین خارجی INT1  فعال می گردد. سطح و لبه های پین خارجی INT1 که وقفه را فعال می کند در جدول زیر تعریف شده اند. مقدار موجود در پین INT1 قبل از تسخیص لبه ها نمونه برداری شده است. اگر لبه یا وقفه تاگل انتخا شده باشند، پالس هایی که وقفه هایی با طول عمر بیشتر از یک کلاک تولید خواهند شد. پالس های با مدت دوام کوتاه تر، تضمینی بر ایجاد وقفه ندارند. اگر وقفه سطح پایین انتخاب شود، سطح پایین می بایست تا زمان تکمیل اجرای دستورالعمل در حال اجرا نگاه داشته شوند تا وقفه تولید شود.

در ساختنی بخوانید :
دستگاه انرژی سنج یا همان انرژی متر سه فاز ساده با استفاده از آردوینو
Interrupt Sense Control
ISCx1 ISCx0 Interrupt Generated Upon
۰ ۰ The low Level of INTx pin
۰ ۱ Any logical change in INTx pin
۱ ۰ Falling edge of INTx
۱ ۱ Rising edge of INTx
x- Interrupt number, either 0 or 1

دیگر بیت های موجود در این ثبات ، ارتباطی به بح حاضر ندارند. ۴ بیت بالایی این ثبات برای کنترل حالت Sleep CPU بکار رفته اند.

General Interrupt Control Register – GICR
Bit ۷ ۶ ۵ ۴ ۳ ۲ ۱ ۰
Bit Name INT1 INT0 IVSEL IVCE
Read/Write RW RW RW RW RW RW RW RW
Initial value ۰ ۰ ۰ ۰ ۰ ۰ ۰ ۰

بیت ۷ – INTF1: نشانگر وقفه خارجی ۱

هنگامی که یک رخداد در پین INT1 درخواست وقفه ایجاد می کند، INTF1 تنظیم (۱) می شود. اگر I-bit در SREG و بیت INT1 در GICR تنظیم (۱) شوند، MCU به بردارد وقفه متناظر پرش خواهد کرد. هنگامی که روال وقفه اجرا اجرا می شود، نشانگر پاک خواهد شد. در غیر اینصورت با نوشتن ۱ منطقی در آن می توان نشانگر را پاک نمود. این نشانگر همواره پس از آن که INT1 به عنوان وقفه هم سطح بکار می رود پاک می شود.

بیت ۶ – INTF1: نشانگر وقفه خارجی ۰

کارکرد این بیت همچون بیت قبلی است با این تفاوت که در تعامل با  INT0 است.

کد وقفه خارجی

#include
#include
ISR(INT0_vect)
{
PORTB &=0xfe;
}
ISR(INT1_vect)
{
PORTB |=0x01;
}
void initInterrupt()
{
GICR =(1≪INT1)|(1≪INT0);
MCUCR() =(1≪ISC01)|(1≪ISC11);
sei();
}
int main()
{
DDRB=0xff;
initInterrupt();
while(1);
return 1;
}

نمودار مدار

وقفه خارجی

 

منبع