Aduino Tutorial آموزش آردوینو

آردوینو (قسمت دهم) – Interrupt & Debouncing

           Interrupt یا وقفه در آردوینو از مواردی است که در این قسمت به آن پرداخته می شود. همچنین با Debounce و نحوه ی برطرف کردن آن به صورت سخت افزاری آشنا می شویم. با انجام یک پروژه و برنامه نویسی آن با دستورات وقفه یا Interrupt هم بیشتر آشنا خواهیم شد.

            کار Interrupt یا وقفه این است که مطمئن شویم پردازنده به سرعت به وقایع مهم پاسخ می دهد. هنگامی که یک سیگنال وقفه شناسایی می شود، وقفه هر آنچه را که پردازنده در حال انجام است را قطع کرده و کدهایی که برای وقفه در نظر گرفتیم را اجرا می کند. بعد از انجام دستورات وقفه، پردازنده دوباره به ادامه کار قبلی خود بر می گردد. و به ادامه ی پردازش های قبل از وقفه می پردازد.

            سرعت پاسخ پردازنده در وقفه به حدی است که به هیچ عنوان آن را نمی توان به صورت نرم افزاری پیاده کرد.

            همه پردازنده هایی که در آردوینو استفاده می شوند دارای دو نوع وقفه یا Interrupt هستند. یکی وقفه ی خارجی یکی هم تغییر پین. در ATMega 168/328 (که در آردوینو Uno/Nano/Due به کار رفته است) دو پین برای وقفه ی خارجی داریم. که در این برد ها پین های 2 و 3 می باشند. می توان وقفه را به صورتی تنظیم کرد که با لبه ی پایین رونده یا با لبه ی بالا رونده و یا با صفر شدن شدن یا LOW شدن یک پین عمل کند. آردوینو مگا وقفه های بیشتری دارد.

            در سوی دیگر وقفه ی تغییر پین را می توان در بیشتر پین ها فعال کرد.

            در هنگام استفاده از وقفه ی خارجی باید لرزش اتصال پین یا Debounce را از بین برد.

اشمیت تریگر

            یک مدار مقایسه کننده است که از فیدبک مثبت استفاده می کند. در این مدار یک مقدار ولتاژ به عنوان آستانه ی بالا و یه مقدار ولتاژ به عنوان آستانه ی پایین انتخاب می شود. وقتی ولتاژ ورودی از آستانه ی بالا بیشتر شود خروجی یک می شود. و تا وقتی که ولتاژ ورودی از آستانه پایین کمتر نشود همان یک میماند. وقتی ولتاژ ورودی از آستانه ی پایین کمتر شد، خروجی صفر می شود. از این مدار برای تبدیل موج سینوسی به مربعی و اصلاح صفر و یک هایی که بر اثر نویز خراب شده اند استفاده می شود.

            اشمیت تریگر معکوس کننده هم مثل همین است و تنها تفاوت آن در خروجی آن است که معکوس ولتاژ ورودی را در خروجی به ما می دهد.

Schmitt Trigger

Schmitt Trigger

 

            در این مدار از خازن برای این استفاده شده تا در تغییر ولتآژ یک تاخیری ایجاد کند، تا نویز و اثر لرزش کلید (debounce) از بین برود. ولی خازن باعث می شود تا شکل موج هنگام تغییر ولتاژ کمی انحنا پیدا کند. که آن را با اشمیت تریگر بر طرف می کنیم.  در اینجا از اشمیت تریگر معکوس کننده استفاده شده است که خروجی را معکوس ورودی می کند.

پینهای وقفه خارجی در برد های آردوینو

Digital Pins Usable For Interrupts Board
2, 3
Uno, Nano, Mini, Other 328-Based
2, 3, 18, 19, 20, 21
Mega, Mega2560, MegaADK
0, 1, 2, 3, 7
Micro Leonardo, Other 32u4-Based
all digital pins, except 4 Zero
0, 1, 4, 5, 6, 7, 8, 9, A1, A2 MKR1000 Rev.1
all digital pins Due
all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE) 101

ISRs (interrupt service routines)

           دستورالعمل سرویس وقفه، یک نوع خاص از تابع است با محدودیت های منحصر به فردی که تابع های دیگر آن محدودیت را ندارند. تابع های ISR نمیتوانند پارامتر داشته باشند و چیزی هم بر نمی گردانند. عموما تابع ISR کوتاه و سریع می باشد.

()attachInterrupt

برای استفاده از وقفه از این دستور استفاده می کنیم.

            این دستور به سه شکل به بکار می رود:

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);

attachInterrupt(interrupt, ISR, mode);

attachInterrupt(pin, ISR, mode);

پارامترها:

Interrupt: شماره ی وقفه (int)

Pin: شماره  ی پین (برای آردوینو Due, Zero, MKR1000)

ISR: تابعی که می خواهیم در هنگام وقفه اجرا شود.

Mode: حالتی که وقفه عمل می کند:

  • LOW: مادامی که پین صفر باشد وقفه اجرا می شود.
  • CHANGE: هر زمانی که مقدار پین عوض شود وقفه اجرا می شود.
  • RISING: وقتی که پین از حالت صفر به یک می رود وقفه اجرا می شود.
  • FALLING: وقتی که پین از حالت یک به صفر می رود وقفه اجرا می شود.
  • HIGH: مادامی که پین یک است وقفه اجرا می شود. ( فقط برای آردوینو Due, Zero, MKR1000 )

digitalPinToInterrupt(pin):

            همانطور که می دانیم بردهای آردوینو از پردازنده ی ATMEGA استفاده می کنند که هر کدام آنها پین های وقفه ی خودشان را دارند. که اسم این پین ها INT0 , INT1 می باشد البته در بردهای پیشرفته بیشتر هم هست. منظور از شماره ی وقفه که در بالا گفتیم یعنی وقتی می خواهیم از وفقه ی صفر استفاده کنیم باید بنویسیم INT0 . حال اینکه دستور digitalPinToInterrupt شماره پین روی برد آردوینو را به شماره وقفه متصل می کند. و در اینجا از شماره ی پین استفاده می کنیم.

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

int.5 int.4 int.3 int.2 int.1 int.0 Board
        3 2 Uno, Ethernet
18 19 20 21 3 2 Mega2560
  7 1 0 2 3 32u4 based
interrupt number = pin number Due, Zero MKR1000, 101

()detachInterrupt

            برای خاموش کردن وقفه از این دستور استفاده می شود.

detachInterrupt(interrupt);

detachInterrupt(digitalPinToInterrupt(pin));

detachInterrupt(pin);                                             Arduino Due,Zero only

Volatile :

            یک کلمه کلیدی است که معمولا قبل از مشخص کردن نوع داده می آید. این کلمه یک دستور برای کامپایلر است. کامپایلر یک نرم افزار است که دستورات ما را از زبان C,C++ به زبان ماشین تبدیل می کند. به طور خاص این کلمه به کامپایلر دستور می دهد تا یک متغیر را از RAM بار گذاری کند و نه از یک رجیستر- که یک حافظه ی موقت برای ذخیره و دستکاری توسط پردازنده می باشد. در شرایط خاص متغیر های ذخیره شده در رجیستر می توانند نادرست باشند.

            وقتی که برنامه در حال اجراست و وقفه رخ می دهد معلوم نیست که درون رجیستر مورد نظر چه چیزی ذخیره شده است چون وسط اجرای برنامه بوده ایم. شاید مقداری که درون رجیستر مورد نظر است با آن چیزی که ما در وقفه نیاز داریم فرق داشته باشد و باعث شود که وقفه به درستی اجرا نشود. برای همین از متغیری استفاده می کنیم که در RAM قرار دارد و فقط در دسترس وقفه است. در آردوینو برای تعریف متغیر هایی که در وقفه قرار است استفاده شوند از این طریق آنها را تعریف می کنیم.

در ادامه می توانید فیلم آموزشی را مشاهده کنید:

 

 

 

دیدگاه ها :

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.