توجه مهم : وقفه به معنی تاخیر زمانی نیست.
بزارید با یه مثال توضیح بدم ، مثال : ما میخایم یه LED رو با یه کلید روشن و خاموش کنیم ؟
۱) روش سرکشی (Polling)
ما تو تابع MAIN میایم و میگیم هر موقع که ما کلید رو زدیم فلان پایه ی میکرو فعال شد (یا همون ۱منطقی شد) ، اون وقت جنابعالی (منظور میکروکنترلر هستش) هم فلان پایه میکرو رو فعال کن تا LED روشن بشه. حالا مشکل زمانی هستش که ما هنوز کلید رو نزدیم و جناب میکروکنترلر مجبوره که هی بره و ببینه که آیا فلان پایه فعال شده یا نه و هی میره و هی برمیگرده (بیچاره خسته نمیشه این همه راه رو میره !!! ) البته تا حالا من خودم از همین روش استفاده کردم !!! و از روش زیر استفاده نکردم.(آخه چه کاریه گره ای که با دندون باز میشه چرا با دست بازش کنی !!!)
۲) روش وقفه ( Interrupt )
تو این روش برخلاف روش قبلی به جای این که ما هی بریم و برگردیم تا بفهمیم که آیا فلان پایه فعال شده یا نه میاییم یه کاری میکنیم : یه موبایل برا دو طرف میخریم و هر موقع که اون پایه هه فعال شد زنگ میزنه به میکرو و میگه دادا بدو بیا که فعال شدم !!! لپ کلوم ای که تو این روش اگه پایه فعال شد خودش ما رو خبر میکنه و دیگه لازم نیس که هی بریم و هی برگردیم و هی بریم و هی … حالا چطور میاد ما رو خبر میکنه رو بعدا یا در ادامه میگم …
انواع وقفه
۱) وقفه داخلی : تقریبا تمام امکانات داخلی میکرو دارای وقفه بوده مانند تایمر –کانترها و پروتکل های ارتباطی و مقایسه کننده ها و مبدل آنالوگ به دیجیتال .
۲) وقفه خارجی : در میکرو پایه هایی به نام INTx وجود دارد که زمانی تحریک شوند ، میکرو به زیر برنامه وقفه پرش می کند و کار تعیین شده را انجام می دهد.این وقفه ها می توانند با یک لبه بالا رونده یا پایین رونده و یا یک منطقی تحریک شوند.
نکته : هنگامی که یک پایه به عنوان وقفه استفاده شود دیگر نمی توانیم از آن پایه به عنوان ورودی یا خروجی استفاده کنیم. این یه میکرو کنترلر avr از نوع atmega16 هستش که توش پایه های وقفه صفر-وقفه۱ و وقفه ۲ رو مشخص کردم.
ریجستر ها در وقفه (بازم ریجستر های دوست داشتنی خودمون !!!)
۱) ریجستر SREG
۲) ریجستر GICR
تو این ریجستر ما فقط با ۳ بیت آخرش کار داریم (البته فعلا ! )
بیت ۷ (INT1 ) : با یک کردن این بیت وقفه ۱ فعال میشود. متناظر با پایه PORTD.3 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت ۶ (INT0 ) : با یک کردن این بیت وقفه ۰ فعال میشود. متناظر با پایه PORTD.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت ۵ (INT2 ) : با یک کردن این بیت وقفه ۲ فعال میشود. متناظر با پایه PORTB.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
تو این ریجستر ما فقط با ۳ بیت آخرش کار داریم (البته فعلا ! )
بیت ۷ (INT1 ) : با یک کردن این بیت وقفه ۱ فعال میشود. متناظر با پایه PORTD.3 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت ۶ (INT0 ) : با یک کردن این بیت وقفه ۰ فعال میشود. متناظر با پایه PORTD.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت ۵ (INT2 ) : با یک کردن این بیت وقفه ۲ فعال میشود. متناظر با پایه PORTB.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
۳) ریجستر GIFR
لپ کلوم رو بگم و گیجتون نکنم :
اگه وقفه مورد نظر(وقفه صفر-یک یا دو) و وقفه سراسری فعال بود و در صورت تحریک شدن (فعال شدن/غیر فعال شدن)
این ریجستر با توجه به شرایط موجود تصمیم میگیره که دستور اجرای وقفه رو بده یا نده.
برای این که این قدرت تصمیم گیری رو به این ریجستر بدیم باید بیت های لازم و مورد نیازمون از یان ریجستر رو یک کنیم.
مثلا اگه دارید از وقفه صفر استفاده میکنید باید بیت ۶ رو یک کنید.
بیت ۵ این ریجستر مربوط به وقفه ۲»»»بیت ۶ این ریجستر مربوط به وقفه ۰»»»»بیت ۷ این ریجستر مربوط به وقفه ۱
لپ کلوم رو بگم و گیجتون نکنم :
اگه وقفه مورد نظر(وقفه صفر-یک یا دو) و وقفه سراسری فعال بود و در صورت تحریک شدن (فعال شدن/غیر فعال شدن)
این ریجستر با توجه به شرایط موجود تصمیم میگیره که دستور اجرای وقفه رو بده یا نده.
برای این که این قدرت تصمیم گیری رو به این ریجستر بدیم باید بیت های لازم و مورد نیازمون از یان ریجستر رو یک کنیم.
مثلا اگه دارید از وقفه صفر استفاده میکنید باید بیت ۶ رو یک کنید.
بیت ۵ این ریجستر مربوط به وقفه ۲»»»بیت ۶ این ریجستر مربوط به وقفه ۰»»»»بیت ۷ این ریجستر مربوط به وقفه ۱
۴) ریجستر MCUCR
این ریجستر هم ریجستر مهمی هستش O_o
ما با نحوه مقدار دهی این ریجستر (که در ادامه میگم) میتونیم نحوه فعال و غیر فعال شدن (نحوه تحریک شدن) وقفه رو تعیین کنیم.
مثلا طوری تعیین کنیم که اگه صفر منطقی شد(۰ ولت) فعال بشه (Falling Edge)
یا طوری تعین کنیم که با یک منطقی (۵ ولت) فعال بشه (Rising Edge)
توجه مهم : این ریجستر برا دو وقفه صفر و یک هستش و ریجستر بعدی برای وقفه دو هستش.
(یکی از علش هم اینه که اگه تو کد ویژن تو قسمت کد ویزاردش و تو قسمت!
تعیین وقفه ها و تو قسمت MODE رو نگاه کرده باشید
وقفه صفر و یک ۴ تا حالت داره اما وقفه ۲ ، فقط دو حالت داره.)
نحوه مقدار دهی ریجستر MCUCR
جدول زیر که انواع مقدار دهی بیت های ISC01 و ISC00 رو نشون داده که مربوط به وقفه صفر هستش.
فعلا فقط دوتای آخر رو توضیح میدم و بقیه برای بعدا :
۳) اگه ۱=ISC01 و ۰=ISC00 شد یعنی : با صفر منطقی (همون ۰ ولت خودمون) فعال میشه.
۴) اگه ۱=ISC01 و ۱=ISC00 شد یعنی : با یک منطقی (همون ۵ ولت خودمون) فعال میشه.
جدول زیر هم مربوط به وقفه یک هستش.
که دیگه من توضیح نمیدم ، چون مثل حالت بالا هستش.
این ریجستر هم ریجستر مهمی هستش O_o
ما با نحوه مقدار دهی این ریجستر (که در ادامه میگم) میتونیم نحوه فعال و غیر فعال شدن (نحوه تحریک شدن) وقفه رو تعیین کنیم.
مثلا طوری تعیین کنیم که اگه صفر منطقی شد(۰ ولت) فعال بشه (Falling Edge)
یا طوری تعین کنیم که با یک منطقی (۵ ولت) فعال بشه (Rising Edge)
(یکی از علش هم اینه که اگه تو کد ویژن تو قسمت کد ویزاردش و تو قسمت!
تعیین وقفه ها و تو قسمت MODE رو نگاه کرده باشید
وقفه صفر و یک ۴ تا حالت داره اما وقفه ۲ ، فقط دو حالت داره.)
نحوه مقدار دهی ریجستر MCUCR
جدول زیر که انواع مقدار دهی بیت های ISC01 و ISC00 رو نشون داده که مربوط به وقفه صفر هستش.
فعلا فقط دوتای آخر رو توضیح میدم و بقیه برای بعدا :
۳) اگه ۱=ISC01 و ۰=ISC00 شد یعنی : با صفر منطقی (همون ۰ ولت خودمون) فعال میشه.
۴) اگه ۱=ISC01 و ۱=ISC00 شد یعنی : با یک منطقی (همون ۵ ولت خودمون) فعال میشه.
جدول زیر هم مربوط به وقفه یک هستش.
که دیگه من توضیح نمیدم ، چون مثل حالت بالا هستش.
۵) ریجستر MCUCSR
با توجه به توضیحاتی که در بالا دادم ، نحوه تحریک این وقفه که وقفه ۲ هست بر خلاف وقفه ۱ و ۰ که ۴ تا حالت داشت ولی وقفه ۲ فقط دو حالت دارد لذا دیگر از جدول مدول خبری نیست.
اگه بیت ۶ (ISC2) این ریجستر رو صفر کنی با صفر منطقی (همون ۰ ولت خودمون) فعال میشه.
اگه بیت ۶ (ISC2) این ریجستر رو یک کنی با یک منطقی (همون ۵ ولت خودمون) فعال میشه.
با توجه به توضیحاتی که در بالا دادم ، نحوه تحریک این وقفه که وقفه ۲ هست بر خلاف وقفه ۱ و ۰ که ۴ تا حالت داشت ولی وقفه ۲ فقط دو حالت دارد لذا دیگر از جدول مدول خبری نیست.
اگه بیت ۶ (ISC2) این ریجستر رو صفر کنی با صفر منطقی (همون ۰ ولت خودمون) فعال میشه.
اگه بیت ۶ (ISC2) این ریجستر رو یک کنی با یک منطقی (همون ۵ ولت خودمون) فعال میشه.
اصل مطلب به صورت زیر است!!!
فعال کردن وقفه INT0 وغیر فعال کردن دوتای دیگه
اینم مربوط به وقفه ۲ هستش که ماکاری باهاش نداریم لذا ۰ اش کردم.
نحوه فعال شدن وقفه رو تعیین کردیم…..Rising Adge…..لبه بالا رونده…همون ۵ ولت یا همون ۱ منطقی
با یک کردن این بیت وقفه INT0 ( وقفه ۰ ) فعال میشه. (متناظر با پایه PORTD.2 هستش.)
منبع: dmf313.ir