به نام خدا

سلام به بحث وقفه ها رسیدیم که باید یاد بگیریم بحث جالبیه و لازم پس خوب بخونیدش اینو توی هر میکروکنترلری نیاز داریم! خیلی کاربردی و مفیده!

 

توجه مهم : وقفه به معنی تاخیر زمانی نیست.

بزارید با یه مثال توضیح بدم ، مثال : ما میخایم یه LED   رو با یه کلید روشن و خاموش کنیم ؟

۱) روش سرکشی (Polling)
ما تو تابع MAIN   میایم و میگیم هر موقع که ما کلید رو زدیم فلان پایه ی میکرو فعال شد (یا همون ۱منطقی شد) ، اون وقت جنابعالی (منظور میکروکنترلر هستش) هم فلان پایه میکرو رو فعال کن تا LED روشن بشه. حالا مشکل زمانی هستش که ما هنوز کلید رو نزدیم و جناب میکروکنترلر مجبوره که هی بره و ببینه که آیا فلان پایه فعال شده یا نه و هی میره و هی برمیگرده (بیچاره خسته نمیشه این همه راه رو میره !!! ) البته تا حالا من خودم از همین روش استفاده کردم !!! و از روش زیر استفاده نکردم.(آخه چه کاریه گره ای که با دندون باز میشه چرا با دست بازش کنی !!!)

۲) روش وقفه ( Interrupt )
تو این روش برخلاف روش قبلی به جای این که ما هی بریم و برگردیم تا بفهمیم که آیا فلان پایه فعال شده یا نه میاییم یه کاری میکنیم : یه موبایل برا دو طرف میخریم و هر موقع که اون پایه هه فعال شد زنگ میزنه به میکرو و میگه دادا بدو بیا که فعال شدم !!! لپ کلوم ای که تو این روش اگه پایه فعال شد خودش ما رو خبر میکنه و دیگه لازم نیس که هی بریم و هی برگردیم و هی بریم و هی … حالا چطور میاد ما رو خبر میکنه رو بعدا یا در ادامه میگم …

 

انواع وقفه

 

۱) وقفه داخلی :  تقریبا تمام امکانات داخلی میکرو دارای وقفه بوده مانند تایمر –کانترها و پروتکل های ارتباطی و مقایسه کننده ها و مبدل آنالوگ به دیجیتال .

۲) وقفه خارجی : در میکرو پایه هایی به نام INTx وجود دارد که زمانی تحریک شوند ، میکرو به زیر برنامه وقفه پرش می کند و کار تعیین شده را انجام می دهد.این وقفه ها می توانند با یک لبه بالا رونده یا پایین رونده و یا یک منطقی تحریک شوند.

نکته : هنگامی که یک پایه به عنوان وقفه استفاده شود دیگر نمی توانیم از آن پایه به عنوان ورودی یا خروجی استفاده کنیم. این یه میکرو کنترلر avr از نوع atmega16 هستش که توش پایه های وقفه صفر-وقفه۱ و وقفه ۲ رو مشخص کردم.


آموزش جامع avr

 

 

 

ریجستر ها در وقفه (بازم ریجستر های دوست داشتنی خودمون !!!)

۱) ریجستر SREG

ریجستر SREG

بیت ۷ ( I ) :  با یک کردن این بیت ، وقفه سراسری یا کلی فعال میشود.(یعنی میتونیم از وقفه استفاده کنیم.)

#asm("sei") //فعال کردن وقفه سراسری

 

۲) ریجستر GICR

ریجستر GICR

 تو این ریجستر ما فقط با ۳ بیت آخرش کار داریم (البته فعلا ! )

بیت ۷ (INT1 )  : با یک کردن این بیت وقفه ۱  فعال میشود.  متناظر با پایه PORTD.3 میباشد.(اون عکس  میکروکنترلر avr که در بالا هستش رو نگاه کنید)

بیت ۶ (INT0 )  : با یک کردن این بیت وقفه ۰ فعال میشود. متناظر با پایه PORTD.2 میباشد.(اون عکس  میکروکنترلر avr  که در بالا هستش رو نگاه کنید)

بیت ۵ (INT2 )  : با یک کردن این بیت وقفه ۲  فعال میشود. متناظر با پایه PORTB.2 میباشد.(اون عکس  میکروکنترلر avr  که در بالا هستش رو نگاه کنید)

 

 

۳) ریجستر GIFR

ریجستر GIFR

لپ کلوم رو بگم و گیجتون نکنم :  *mail*

اگه وقفه مورد نظر(وقفه صفر-یک یا دو) و وقفه سراسری فعال بود و در صورت تحریک شدن (فعال شدن/غیر فعال شدن)
این ریجستر با توجه به شرایط موجود تصمیم میگیره که دستور اجرای  وقفه رو بده یا نده.

برای این که این قدرت تصمیم گیری رو به این ریجستر بدیم باید بیت های لازم و مورد نیازمون از یان ریجستر رو یک کنیم.
مثلا اگه دارید از وقفه صفر استفاده میکنید باید بیت ۶ رو یک کنید.

بیت ۵ این ریجستر مربوط به وقفه ۲»»»بیت ۶ این ریجستر مربوط به وقفه ۰»»»»بیت ۷ این ریجستر مربوط به وقفه ۱

 

۴) ریجستر MCUCR

ریجستر MCUCR

این ریجستر هم ریجستر مهمی هستش O_o

ما با نحوه مقدار دهی این ریجستر (که در ادامه میگم) میتونیم نحوه فعال و غیر فعال شدن (نحوه تحریک شدن) وقفه رو تعیین کنیم.
مثلا طوری تعیین کنیم که اگه صفر منطقی شد(۰ ولت) فعال بشه (Falling Edge)
یا طوری تعین کنیم که با یک منطقی (۵ ولت) فعال بشه (Rising Edge)

توجه مهم : این ریجستر برا دو وقفه صفر و یک هستش و ریجستر بعدی برای وقفه دو هستش.
(یکی از علش هم اینه که اگه تو کد ویژن تو قسمت کد ویزاردش و تو قسمت!
تعیین وقفه ها و تو قسمت MODE رو نگاه کرده باشید
وقفه صفر و یک ۴ تا حالت داره  اما وقفه ۲ ، فقط دو حالت داره.)

نحوه مقدار دهی ریجستر MCUCR

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

فعلا فقط دوتای آخر  رو توضیح میدم و بقیه برای بعدا :
۳) اگه ۱=ISC01   و  ۰=ISC00  شد یعنی : با صفر منطقی (همون ۰ ولت خودمون)  فعال میشه.
۴) اگه ۱=ISC01   و  ۱=ISC00  شد یعنی :  با یک منطقی (همون ۵ ولت خودمون)  فعال میشه.

isc00-01

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

ریجستر MCUCR

 

۵) ریجستر MCUCSR

ریجستر MCUCSR

با توجه به توضیحاتی که در بالا دادم ، نحوه تحریک این وقفه که وقفه ۲ هست بر خلاف وقفه ۱ و ۰ که ۴ تا حالت داشت ولی وقفه ۲ فقط دو حالت دارد لذا دیگر از جدول مدول خبری نیست.

اگه بیت ۶ (ISC2) این ریجستر رو صفر کنی   با صفر منطقی (همون ۰ ولت خودمون)  فعال میشه.
اگه بیت ۶ (ISC2) این ریجستر رو یک  کنی   با  یک  منطقی (همون ۵  ولت خودمون)  فعال میشه.

 

اصل مطلب به صورت زیر است!!!

GIFR=0x40;

فعال کردن وقفه INT0 وغیر فعال کردن دوتای دیگه

 

MCUCSR=0x00;

اینم مربوط به وقفه ۲ هستش که ماکاری باهاش نداریم لذا ۰ اش کردم.

 

MCUCR=0x03;

نحوه فعال شدن وقفه رو تعیین کردیم…..Rising Adge…..لبه بالا رونده…همون ۵ ولت یا همون ۱ منطقی

 

GICR|=0x40;

با یک کردن این بیت وقفه INT0 ( وقفه ۰ ) فعال میشه. (متناظر با پایه PORTD.2 هستش.)

 

فعلا

یا علی مدد...!