آموزش جامع avr
انشا الله قراره تو این جلسه در مورد وقفه یه سری توضیح بدم.
توجه مهم : وقفه به معنی تاخیر زمانی نیست.
بزارید با یه مثال توضیح بدم ، مثال : ما میخایم یه LED رو با یه کلید روشن و خاموش کنیم ؟
1) روش سرکشی (Polling)
ما تو تابع MAIN میایم و میگیم هر موقع که
ما کلید رو زدیم فلان پایه ی میکرو فعال شد (یا همون 1منطقی شد) ، اون وقت
جنابعالی (منظور میکروکنترلر هستش) هم فلان پایه میکرو رو فعال کن تا LED روشن بشه. حالا مشکل زمانی هستش که ما هنوز کلید رو نزدیم و جناب میکروکنترلر مجبوره که هی بره و ببینه که آیا فلان پایه فعال شده یا نه و هی میره و هی برمیگرده (بیچاره خسته نمیشه این همه راه رو میره !!! ) البته
تا حالا من خودم از همین روش استفاده کردم !!! و از روش زیر استفاده
نکردم.(آخه چه کاریه گره ای که با دندون باز میشه چرا با دست بازش کنی !!!)
2) روش وقفه ( Interrupt )
تو این روش برخلاف روش قبلی به جای این که ما هی بریم و برگردیم تا بفهمیم که آیا فلان پایه فعال شده یا نه میاییم یه کاری میکنیم : یه موبایل برا دو طرف میخریم و هر موقع که اون پایه هه فعال شد زنگ میزنه به میکرو و میگه دادا بدو بیا که فعال شدم !!! لپ کلوم ای که تو این روش اگه پایه فعال شد خودش ما رو خبر میکنه و دیگه لازم نیس که هی بریم و هی برگردیم و هی بریم و هی … حالا چطور میاد ما رو خبر میکنه رو بعدا یا در ادامه میگم …
1) وقفه داخلی : تقریبا تمام امکانات داخلی میکرو دارای وقفه بوده مانند تایمر –کانترها و پروتکل های ارتباطی و مقایسه کننده ها و مبدل آنالوگ به دیجیتال .
2) وقفه خارجی : در میکرو پایه هایی به نام INTx وجود دارد که زمانی تحریک شوند ، میکرو به زیر برنامه وقفه پرش می کند و کار تعیین شده را انجام می دهد.این وقفه ها می توانند با یک لبه بالا رونده یا پایین رونده و یا یک منطقی تحریک شوند.
نکته : هنگامی که یک پایه به عنوان وقفه استفاده شود دیگر نمی توانیم از آن پایه به عنوان ورودی یا خروجی استفاده کنیم. این یه میکرو کنترلر avr از نوع atmega16 هستش که توش پایه های وقفه صفر-وقفه1 و وقفه 2 رو مشخص کردم.
بیت 7 ( I ) : با یک کردن این بیت ، وقفه سراسری یا کلی فعال میشود.(یعنی میتونیم از وقفه استفاده کنیم.)
توجه مهم : اگه بخواید از وقفه استفاده کنید این بیت حتما باید یک بشه.که این بیت به صورت زیر فعال/غیر فعال میشود.
تو این ریجستر ما فقط با 3 بیت آخرش کار داریم (البته فعلا ! )
بیت 7 (INT1 ) : با یک کردن این بیت وقفه 1 فعال میشود. متناظر با پایه PORTD.3 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت 6 (INT0 ) : با یک کردن این بیت وقفه 0 فعال میشود. متناظر با پایه PORTD.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت 5 (INT2 ) : با یک کردن این بیت وقفه 2 فعال میشود. متناظر با پایه PORTB.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
لپ کلوم رو بگم و گیجتون نکنم :
اگه وقفه مورد نظر(وقفه صفر-یک یا دو) و وقفه سراسری فعال بود و در صورت تحریک شدن (فعال شدن/غیر فعال شدن)
این ریجستر با توجه به شرایط موجود تصمیم میگیره که دستور اجرای وقفه رو بده یا نده.
برای این که این قدرت تصمیم گیری رو به این ریجستر بدیم باید بیت های لازم و مورد نیازمون از یان ریجستر رو یک کنیم.
مثلا اگه دارید از وقفه صفر استفاده میکنید باید بیت 6 رو یک کنید.
بیت 5 این ریجستر مربوط به وقفه 2»»»بیت 6 این ریجستر مربوط به وقفه 0»»»»بیت 7 این ریجستر مربوط به وقفه 1
این ریجستر هم ریجستر مهمی هستش O_o
ما با نحوه مقدار دهی این ریجستر (که در ادامه میگم) میتونیم نحوه فعال و غیر فعال شدن (نحوه تحریک شدن) وقفه رو تعیین کنیم.
مثلا طوری تعیین کنیم که اگه صفر منطقی شد(0 ولت) فعال بشه (Falling Edge)
یا طوری تعین کنیم که با یک منطقی (5 ولت) فعال بشه (Rising Edge)
نحوه مقدار دهی ریجستر MCUCR
جدول زیر که انواع مقدار دهی بیت های ISC01 و ISC00 رو نشون داده که مربوط به وقفه صفر هستش.
فعلا فقط دوتای آخر رو توضیح میدم و بقیه برای بعدا :
3) اگه 1=ISC01 و 0=ISC00 شد یعنی : با صفر منطقی (همون 0 ولت خودمون) فعال میشه.
4) اگه 1=ISC01 و 1=ISC00 شد یعنی : با یک منطقی (همون 5 ولت خودمون) فعال میشه.
جدول زیر هم مربوط به وقفه یک هستش.
که دیگه من توضیح نمیدم ، چون مثل حالت بالا هستش.
با توجه به توضیحاتی که در بالا دادم ، نحوه تحریک این وقفه که وقفه 2 هست بر خلاف وقفه 1 و 0 که 4 تا حالت داشت ولی وقفه 2 فقط دو حالت دارد لذا دیگر از جدول مدول خبری نیست.
اگه بیت 6 (ISC2) این ریجستر رو صفر کنی با صفر منطقی (همون 0 ولت خودمون) فعال میشه.
اگه بیت 6 (ISC2) این ریجستر رو یک کنی با یک منطقی (همون 5 ولت خودمون) فعال میشه.
تو کد ویژن وقتی یه پروژه جدید ایجاد میکنی و میری تو قسمت کد ویزارد ، میتونی وقفه رو از همون جا فعال کنی و دیگه کد مد ننویسی.
البته به جای EXT_INT0 میتونستیم عدد 2 رو قرار بدیم .
و به جای EXT_INT1 میتونستیم عدد 3 رو قرار بدیم .
و به جای EXT_INT2 میتونستیم عدد 19 رو قرار بدیم .
نام تابع هم اختیاری هستش.هر چی خواستین بزارین.
سایر منابع : سایت دمرچیلو