به نام خدا
سلام خدمت دوستان عزیز و هموطنان گرامی!
علاقه مندان به میکروکنترلر و الکترونیک :)
خوب من سعی کردم برنامه ای بنویسم که همه اش از وقفه استفاده بشه و حلقه while خالی بمونه، چون به نظرم این جور برنامه حرفه ای تره و کمتر خطا خواهد داشت!
ولی یه جایی متوجه شدم که وقفه تایمر اجرا میشه، وقفه پایه خارجی میکرو اجرا میشه ولی وقفه دریافت سریال اجرا نمیشه! جالب این بود که وقتی وقفه تایمر رو غیر فعال میکردم، وقفه سریال کار میکرد! فک کنم مشکل این بوده که وقفه تایمر بسیار سریع اجرا میشد و اجازه اجرای کد های دیگر رو به پردازنده نمیداد، جالب این بود که انقدر وقفه تایمر سریع و پشت سر هم اجرا میشد که حتی کد های حلقه while هم نمیتونست اجرا کنه! خیلی برام جالب بود و تا حالا فک نمیکردم یک وقفه مانع اجرای کد های اصلی برنامه بشه! بنابراین به این نتیجه رسیدم که وقفه تایمر اولیت بالایی داره که نمیذاره وقفه سریال اجرا بشه! بنابراین رفتم دنبالش تا اولویت این وقفه رو کم کنم! و کم کردم و خداروشکر مشکلم حل شد!
خوب بریم سراغ اصل مطلب
در این میکرو دوست داشتنی ما 4 اولیت برای وقفه داریم (در میکرو ARM معمولا 256 سطح برای اولویت بندی وقفه ها وجود دارد)
سطح اولویت ها به صورت زیر است!
که طبق تصویر زیر مقدار اولیه همه وقفه ها برابر با 3 است یعنی Level 3
همچنین برای دسترسی به تنظیمات اولویت بندی باید از رجیستر های زیر استفاده کنیم!
همانطور که مشاهده میکنید در هر رجیستر میتوان 4 وقفه را الویت بندی کرد. برای تنظیم اولویت بندی وقفه ها از 8 رجیستر استفاده شده است که میتوان 30 بردار وقفه را اولیت بندی کرد.
شماره بردار وقفه ها را میتوانید در صفحه 41 دیتاشیت میکرو مطالعه بفرمایید (برای دانلود کلیک کنید) همچنین لازم به ذکر است که جداول بالا از دو فایل PDF که در این صفحه قرار دارد استخراج شده است!
تصویر آن را در زیر قرار میدهم!
من برای کم کردن سطح اولویت وقفه تایمر 2 از شماره بردار وقفه 13 استفاده کردم و کدم به صورت زیر شد:
ITC_SPR4.VECT13SPR=0; /* Timer2 OverFlow Interrupt Priority Level 2 */
امیدوارم مفید بوده باشه!
فعلا
یا علی مدد....!