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

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

وقفه چیست ؟ و برای چه از وقفه استفاده می کنیم؟

برای اطلاع CPU میکروکنترلر از وقوع یک اتفاق خاص دو روش وجود دارد:
  1.  polling یا سرکشی
  2.  interrupt یا وقفه

1-polling یا سرکشی:

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

2-interrupt یا وقفه در میکروکنترلر های AVR:

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

jadval int

روتین سرویس وقفه در میکروکنترلر های AVR یا ISR :

Interrupt service routine

به زیر برنامه ای که در پاسخ به وقه ی درخواست شده اجرا می شود روتینسرویس وقفه یا ISR گفته می شود.

مراحل اجرای یک وقفه در میکروکنترلر های AVR :

در صورت دریافت یک درخواست وقفه IRQ یا Interrupt Request  مراحل زیر انجام می شود:

  1. دستوری که در حال  که در حال انجام آن می باشد را تمام کرده و آدرس دستور العمل بعدی را از شمارنده برنامه (PC)به دست می آورد و  درپشته ذخیره می کند.
  2. سپس برنامه به آدرس مشخصی پرش می کند (جدول وقوع وقفه)و آدرس سرویس وقفه ISR را بدست می آورد.
  3. شروع به اجرای برنامه ی وقفه می کن.د
  4. بعد از پایان وقفه آدرس ذخیره شده در پشته بازیابی شده و شمارنده ی پشه بازیابی شده و شمارنده ی برنامه به آن مقدار تغییر می کند به این ترتیب برنامه از جایی که اجرایش با وقفه مواجه شده بود ادامه می یابد.

منابع وقفه در میکروکنترلر های AVR :

 

میکروکنترلر مورد نظر مادر ین بحث ATmega32 است در این میکروکنترلر 21 منبع وفه وجود دارد که لیست کامل آن ها در جدول پایین مشاهده می کنید از این 21 مورد 3 مورد مربوط به وقفه خارجی و 19 مورد باقی مانده مربوط به وقفه های داخلی میباشد.

وقفه ی داخلی ناشی از عوامل داخلی میکرو هستند این منابع در AVR شامل وقفه تایمر و کانترها – ارتباط سریال – مبدل ADC و مقایسه کننده ی آنالوگ  می باشد.

وقفه های خارجی می توانند از طریق پایه های خاصی از میکروکنترلر اتفاق بیافتند. در ATmega32 پایه های مربوط به P.B3 – P.D2 و P.D3 برای در خواست وقوع وقفه ی خارجی در نظر گرفته شده اند.

برای در خواست وقفه باید شرایط زیر محیا باشد:

  1. بیت فعال ساز وقفه ی مورد نظر یک باشد.
  2. بیت فعال ساز عمومی وقفه ها با دستور اسمبلی sei یک شده باشد.
  3. با روی دادن رخداد مورد نظر پرچم وقفه ی آن رویداد یک شود.

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

 مرحله 1:

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

رجیستر GICR:

GICR

به وسیله ی 3 بیت آخر رجیستر GICR نوع منبع خارجی تعیین می شود.

  • Bit-6: بیت فعال ساز وقفه خارجی صفر INT0
  • Bit-7:  بیت فعال ساز وقفه خارجی یک INT1
  • Bit-8:  بیت فعال ساز وقفه خارجی دو INT2

رجیستر GIFR:

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

GIFR

رجیستر MCUCR:

mcucr

به وسیله ی 4 بیت اول رجیستر MCUCR نوع تریگر شدن وقفه خارجی صفر و یک را تعیین می کنیم. پایه های INT0 و INT1 هر کدام به چهار نوع تحریک خارجی حساس هستند. در جدول پایین نحوه تنظیم هر دو آورده شده است.

INT0int1

به وسیله ی بیت 6 از رجیستر MCUCSR نوع تریگر شدن وقفه ی خارجی دو را تعیین می کنیم. پایه ی INT2 فقط به وسیله ی دو نوع تحریک خارجی می تواند در خواست وقفه دهد. این تحریک ها یا لبه بالا رونده پین INT2 و یا لبه پایین رونده پین می باشد.

 mcucr

مرحله 2:

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

وقفه ی سراسری i فعال می شود.

 

وقفه سراسری i غیر فعال می شود.

 

مرحله ی 3:

نوشتن زیر برنامه ی مربوط به وقفه:

فرم کلی ISR هر وقه در کامپایلر codevision به صورت زیر است.

 مثال راه اندازی وقفه خارجی 0 در میکروکنترلر ATmega 32:

در این برنامه 2 led که به پایه های 0 و 4 پورت A وصل هستند به طور یک درمیان چشمک می زنند. با زده شدن کلیدی که به پایه 2 پورت D وصل شده است (همان INT0) برنامه اصلی متوقف شده و برنامه مربوط به سرویس وقفه اجرا می شود در این برنامه led که به پایه ی 7 پورت A وصل هست 5 بار چشمک زده و بعد از تمام شدن برنامه وقفه میکرو به اجرای برنامه اصلی می پردازد.

شماتیک مدار لازم برای برنامه ی بالا:

int fd

ویدیوی آموزش برنامه نویسی با کد ویزارد و عملکرد مدار:

 

About علی عزتی

علی عزتی هستم. رشته ی مهندسی برق الکترونیک رو خوندم. علاقه ی من به یادگیری و به اشتراک گذاشتن چیز هایی که یاد گرفتم. باعث شد تا الکترولب ایجاد بشه. علاقه ی زیادی به الکترونیک دارم. و دوست دارم چیزهای جدید یادبگیرم و بسازم ... :))

Check Also

آموزش میکروکنترلرهای STM32 – بخش دوم

بخش دوم – آشنایی اجمالی با محیط نرم‌افزار STM32CubeMX + ضمیمه‌ی شماره (2) – راهنمای ...

One comment

  1. خسته نباشی مهندس کارت عالیه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *