راه اندازی وقفه خارجی رزبری پای پیکو – Raspberry Pi Pico External Interrupt

وقفه خارجی رزبری پای پیکو یکی از امکانات پرکاربردی است که در کار با این میکروکنترلر با آن مواجه خواهید شد. وقفهها یکی از امکانات اساسی در پردازندهها هستند و مدیریت تسکها را سادهتر میکنند. در این مقاله ابتدا به توضیحاتی کلی در مورد وقفهها پرداخته، سپس به صورت خاص در مورد راه اندازی وقفه خارجی رزبری پای پیکو صحبت میکنیم.
اگر با مفاهیم وقفه آشنایی کافی ندارید پیشنهاد میکنیم قبل از مطالعه این مقاله به مقاله وقفه چیست مراجعه کنید.
وقفه (Interrupt) چیست؟
از نظر فنی وقفه سیگنالی است که به پروسسور اعلام میکند باید تسک جاری که مشغول به انجام آن است را متوقف کرده و تسکی را انجام دهد که مربوط به آن وقفه است. اگر منبع ایجاد کننده وقفه خارج از سختافزار باشد و سخت افزار از طریق پینهای خود آن را دریافت کند وقفه را خارجی میگویند.
بررسی وقفه خارجی رزبری پای پیکو
برای بررسی وقفه خارجی رزبری پای پیکو باید امکانات وقفه خارجی چیپ RP2040 که میکروکنترلر استفاده شده در برد Raspberry Pi Pico است را بررسی نمود. این چیپ از وقفههای تودرتو و اولویت بندی وقفهها (در چهار سطح) پشتیبانی میکند. واحد NVIC مخفف (Nested Vector Interrupt Controller) مدیریت این موضوع را به عهده دارد. چیپ RP2040 امکان فعال کردن وقفه خارجی روی همه پینها را در اختیار شما قرار میدهد.
هر وقفه خارجی رزبری پای پیکو را میتوانید در چهار مد زیر فعال کنید:
- بالارونده (Edge High) – با دیدن یک پالس بالا رونده روی پین رخ میدهد
- پایین رونده (Edge Low) – با دیدن یک پالس پایین رونده روی پین رخ میدهد
- سطح بالا (Level High) – با دیدن سطح 1 منطقی روی پین رخ میدهد
- سطح پایین (Level Low) – با دیدن سطح 0 منطقی روی پین رخ میدهد

برای بررسی دقیقتر بخش وقفه خارجی رزبری پای پیکو میتونید به دیتاشیت RP2040 مراجعه کنید.
راهاندازی وقفه خارجی رزبری پای پیکو
برای راهاندازی وقفه خارجی رزبری پای پیکو میخواهیم برنامهای بنویسیم که یک چشمک زن روی LED موجود روی برد Raspberry Pi Pico ایجاد کند که 1 ثانیه روشن و 1 ثانیه خاموش باشد. سپس اگر کلید متصل به پین 5 برد فشرده شد (حتی برای یک لحظه در حد میلی ثانیه) فرکانس چشمک زدن بالا برود به گونهای که 100 میلی ثانیه روشن و 100 میلی ثانیه خاموش باشد.

در مسئله فوق پروسسور یک کار دائمی برای انجام دادن دارد یعنی روشن و خاموش کردن مداوم LED. در عین حال از آن انتظار داریم حتی یک لحظه تغییر وضعیت در سوییچ را هم بفهمد. یک روش برای حل این مسئله استفاده از وقفه خارجی است. (دقت داشته باشید برای یک مسئله راه حلهای زیادی وجود دارد اما چون هدف ما توضیح نحوه کدنویسی اینتراپت است از وقفه برای حل آن استفاده میکنیم)
از آنجا که پین میکروکنترلر کار داریم کلاس Pin از ماژول machine را import میکنیم.
from machine import Pin
در ادامه برای ایجاد تاخیر بین چشمک زدن LED تابع sleep_ms را از ماژول utime فراخوانی میکنیم
from utime import sleep_ms
یک شی از کلاس Pin برای کار با LED ایجاد میکنیم و نام آن را led میگذاریم (این نام دلخواه است). تنظیمات این پین را به صورتی انجام میدهیم که به پین GP25 اشاره کند (چون LED روی برد به پین GP25 متصل است) و در حالت خروجی باشد.
led = Pin(25, Pin.OUT)
یک شی دیگر از کلاس Pin برای کار با سوییچ ایجاد میکنیم و نام آن را key میگذاریم (این نام دلخواه است). تنظیمات این پین را به گونهای انجام میدهیم که به پین GP5 اشاره کند. (چون سوییچ را به این پین متصل کردهایم) و در حالت ورودی باشد. همچنین حالت PullUp را فعال میکنیم زیرا یک سمت سوییچ به پین و سمت دیگر به GND است و در واقع سوییچ ما GND را به پایه قطع یا وصل میکند.
key = Pin(5, Pin.IN, Pin.PULL_UP)
اگر در مورد کارکردن با پینها در میکروپایتون آشنایی کافی ندارید و به توضیحات بیشتری نیاز دارید پیشنهاد میکنم مقاله راه اندازی پایه های Raspberry Pi Pico را مطالعه کنید.
در ادامه یک متغیر با نام sleep_value برای تعیین میزان تاخیر چشمک زن تعریف میکنیم و مقدار اولیه آن را 1000 در نظر میگیریم. بعدا این متغیر را به عنوان تعداد میلی ثانیه به تابع sleep_ms پاس میدهیم تا تاخیر 1 ثانیه را برای ما ایجاد کند.
sleep_value = 1000
حال تابعی که قرار است هنگام اتفاق افتادن وقفه فراخوانی شود (همان روتین وقفه) را پیادهسازی میکنیم. از آنجا کار این تابع تغییر سرعت چشمک زدن به 100 میلی ثانیه است کافی است مقدار متغیر sleep_value را به عدد 100 تغییر دهیم. همچنین این تابع یک ورودی دارد که نشان دهنده منبع ایجاد کننده وقفه است که اگر در برنامهای برای شما کاربرد داشته باشد میتوتنید از آن استفاده کنید. در این برنامه احتیاجی به آن نداریم اما برای آنکه مقدار آن را مشاهده کنید آن را پرینت میکنیم. نام این تابع را fast_blink میگذاریم.
def fast_blink(a): global sleep_value sleep_value = 100; print(a)
نوبت آن رسیده که وقفه خارجی رزبری پای پیکو را برای پین سوییچ فعال کرده و تابع fast_blink را به آن معرفی کنیم. همچنین اینتراپت را در مد falling پیکربندی میکنیم زیرا پین متصل به سوییچ همواره در حالت high قرار دارد (چون Pull Up آن فعال شده است) و در مدت زمان فشره شدن سوییچ low میشود (چون سر دیگر سوییچ به GND متصل شده است)
key.irq(fast_blink, Pin.IRQ_FALLING)
در نهایت در یک حلقه بیپایان LED را به مدت 1 ثانیه روشن و 1 ثانیه خاموش میکنیم.
while True: led.value(not led.value()) sleep_ms(sleep_value)
برنامه کامل به صورت زیر خواهد بود
from machine import Pin from utime import sleep_ms key = Pin(5, Pin.IN, Pin.PULL_UP) led = Pin(25, Pin.OUT) sleep_value = 1000 def fast_blink(a): global sleep_value sleep_value = 100; print(a) key.irq(fast_blink, Pin.IRQ_FALLING) while True: led.value(not led.value()) sleep_ms(sleep_value)
در پایان
در این مقاله در مورد راهاندازی وقفه خارجی رزبری پای پیکو مطالبی بیان شد. ذکر این نکته ضروری است برنامه نوشته شده تنها یکی از بسیار راههای حل این مسئله است و اگر شما کد متفاوتی دارید که بر اساس استفاده از وقفه خارجی رزبری پای پیکو مسئله را حل کردهاید آن را در کامنتها با دوستانتان به اشتراک بگذارید. همچنین با قرار دادن نظرات خود در بخش کامنتهای این مقاله ما را بسیار خوشحال خواهید کرد.
دیدگاهتان را بنویسید