در سلسله آموزش های برد Maixduino، قسمت پنجم به بررسی وقفه ها می پردازیم. وقفه ها یکی از مهم ترین و پرکاربردترین قابلیت ها در میکروکنترلرها به شمار می رود. برد Maixduino نیز از قابلیت وقفه بر روی پایه های GPIO خود بهره می برد. در این آموزش قصد داریم به این موضوع بپردازیم. بنابراین در ادامه این آموزش با مرجع تخصصی برد هوش مصنوعی Sipeed به زبان فارسی، دیجی اسپارک همراه باشید.
تعریف وقفه و کاربرد
پیش از آنکه در رابطه با وقفه ها خارجی برد Maixduino صحبت کنیم، در این قسمت به مفهوم وقفه و کاربرد آن در سیستم های دیجیتال می پردازیم. مفهوم وقفه را با یک مثال شروع می کنیم. فرض کنید منتظر رسیدن مهمان به منزل خود هستید. برای اطلاع از رسیدن مهمان ها به منزل، یا می توانید دائم در را باز کرده و ببینید آیا مهمان ها رسیده اند یا خیر؟ یا این که هرگاه مهمان ها زنگ زدند، در را باز کنیم. طبیعتا روش اول را الان کسی انجام نمی دهد!!! اما اینجا مثال بود و در مثل مناقشه نیست!
در رابطه با پردازنده ها نیز، وقفه مفهومی مشابه به مهمانی دارد. فرض کنید یک پایه را به عنوان ورودی تعریف کرده اید و این ورودی با مقامت داخلی پول آپ شده است. بنابراین مقدار پیشفرض این پایه یک است. در ادامه فرض کنید به این پایه یک کلید متصل شده که اتصال کلید، سبب اتصال این پایه به GND و صفر شدن آن می شود. در طرف دیگر، فرض کنید که یک پایه را به عنوان خروجی تعریف کرده ایم. هرگاه پایه ورودی صفر شود، این خروجی هم صفر خواهد شد. برای تشخیص صفر شدن این پایه، دور راه وجود دارد:
۱-کنترل مداوم وضعیت پایه و صفر کردن خروجی در صورت صفر شدن ورودی
۲-هرگاه ورودی به صفر تبدیل شد، خروجی هم صفر شود.
روش شماره ۱ که اصطلاحا به آن polling هم گفته می شود، در حلقه اصلی برنامه وضعیت پایه را کنترل می کند. موردی که در قسمت قبلی سلسله آموزش مشاهده کردید. این روش شاید همه جا مناسب نباشد؛ چراکه گاهی اوقات بعضی از پردازده ها زمانبر خواهند شد. در این حالت کنترل وضعیت پایه ناممکن خواهد شد. روش دوم اما، هرگاه پایه صفر شود، یک تابع خاص به نام روتین وقفه اجرا خواهد شد. تابع روتین وقفه هرگاه که وضعیت پایه (به شکلی که ما تعیین می کنیم) تغییر کند، اجرا خواهد شد. در این صورت بدون درگیر کردن پردازنده و توان پردازشی، می توانیم در صورت تغییر وضعیت پایه، عمل مورد نظر را اجرا کنیم.
پس از آنکه با مفهوم وقفه آشنا شدیم، در قسمت بعدی به دستورات برنامه نویسی آن در برد Miaxduino می پردازیم.
دستورات وقفه در برد Maixduino
برد Maixduino وقفه های خارجی روی پایه های GPIO را بر روی ۳۲ پایه پشتیبانی می کند. برای تعریف وقفه روی پایه های GPIO برد Maixduino، به صورت زیر عمل می کنیم.
attachInterrupt(Pin_Number,ISR,Mode)
تابع فوق پایه مد نظر را برای وقفه تنظیم می کند. ورودی نخست شماره پایه، ورودی دوم نام تابعی که قرار است روتین وقفه را اجرا کند و ورودی سوم مد وقفه را تعیین می کند. به عبارت دیگر این مد تعیین می کند که با وقوع چه وضعیتی روی پایه، وقفه رخ دهد. مد وقفه به صورت جدول زیر تعریف می گردد.
شرح | مقدار معتبر برای Mode |
هرگاه پایه LOW شود، وقفه رخ می دهد. | LOW |
هرگاه وضعیت پایه نسبت به حالت فعلی تغییر کند، وقفه رخ می دهد. | CHANGE |
هرگاه وضعیت پایه به صورت لبه بالا رونده(تغییر از LOW به HIGH) شود، وقفه رخ می دهد. | RISING |
هرگاه وضعیت پایه به صورت لبه پایین رونده(تغییر از HIGH به LOW) شود، وقفه رخ می دهد. | FALLING |
هرگاه پایه HIGH شود، وقفه رخ می دهد. | HIGH |
در صورتیکه بخواهید وقفه را از روی پایه غیر فعال کنید، به کمک تابع زیر می توانید مورد را اجرا کنید.
detachInterrupt(pin_number)
در رابطه با ورودی دوم، ISR، توجه داشته باشید که تابع مربوط به سرویس روتین وقفه، حتما از نوع void باشد. همچنین برای این تابع نام دلخواه می توانید تعیین کنید. قسمت بعدی ضمن معرفی یک مثال عملی، موضوع را بیشتر روشن خواهیم نمود.
اجرای یک نمونه برنامه
پس از بررسی توابع مربوط به تنظیم وقفه ها، نوبت به اجرای یک نمونه برنامه می رسد. در این برنامه یکی از پایه ها به صورت ورودی تعریف شده که در صورت تغییر وضعیت آن، پایه خروجی در رویتن وقفه نیز تغییر وضعیت خواهد داد.
void setup() { pinMode(5, INPUT_PULLDOWN); //تعریف پایه ۵ به عنوان ورودی و پول داون pinMode(8, OUTPUT); //تعریف پایه ۸ به عنوان خروجی attachInterrupt(5, key, HIGH); //تنظیم وقفه } void key() { //روتین(تابع) وقفه digitalWrite(8, HIGH); } void loop() { }
لوازم مورد نیاز
بردهای مبتنی بر هوش مصنوعی Sipeed
جمع بندی
در سلسله آموزش های برد Maixduino قسمت پنجم به بررسی وقفه های خارجی پرداختیم. برد Maixduino می تواند تا ۳۲ پایه GPIO را به صورت وقفه تعریف کند. به کمک وقفه ها منابع پردازشی کمتر درگیر شده و کارایی برنامه ها در کنار سرعت، افزایش خواهند یافت. در این آموزش ابتدا به مفهوم وقفه ها پرداختیم. در ادامه به بررسی توایع و تنظیمات آن اشاره کردیم. در نهایت با ارائه مثالی، نحوه استفاده از توابع در برنامه ها را مشاهده کردیم.
چنانچه هرگونه ابهامی در مطالب درج شده وجود دارد، می توانید با ثبت نظر در انتهای همین پست سوال خود را بپرسید. تاکنون در دیجی اسپارک بیش از ۲۶ هزار سوال و پاسخ ثبت شده است؛ پس نظرات بی جواب نمی مانند! همچنین اگر ایراد و یا اشکالی در مطالب درج شده وجود دارد، لطفا آن را با ثبت نظر، مطرح کنید. همچنین اگر مشکلی در کدها وجود داشته و یا اجرا نمی شوند، مورد را حتما در انتهای همین آموزش مطرح نمایید. نظرات شما برای ما بسیار ارزشمند هسنند!!