عکس پیش‌فرض نوشته

خروجی یک مولتی ویبراتور بای استابل، با هر بار فشار دکمه تغییر وضعیت می دهد.

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

از لحاظ فنی این حالت، مولتی ویبراتور بای استابل نامیده می شود و همچنین به آن سویچ دو راهه هم می گویند.

 
Learning ARM
 

نحوه کار:

هر زمانی که سویچ فشار داده شود، وضعیت LED باید تغییر کند. اگر روشن باشد باید خاموش شود و اگر خاموش است باید روشن شود.

بنابراین اساسا باید وضعیت پایه را تغییر دهیم.

برای انجام این کار می توان از عملگر NOT منطقی استفاده کرد. این عملگر یک منطقی(درست) را به صفر منطقی (غلط) تبدیل می کند و برعکس.

عملکر NOT با علامت تعجب نشان داده شده است که باید “not” خوانده شود. بنابراین خط «ورودی =! خروجی» را می توان «خروجی not ورودی» خواند.

در زبان c می توانیم از تکنیک زیر برای تغییر وضعیت LED استفاده کنیم:

myled = !myled;

در تئوری می توانیم از این تکنیک برای کامل کردن بخش اصلی برنامه استفاده کنیم:

int main() {
    while (1) {
        if (button) {
            myled = !myled;
        }
    }
}

این برنامه کار می کند اما شما چیزی نخواهید دید. قبل از آنکه بتوانید انگشت خود را بردارید؛ LED هزاران بار خاموش و روشن شده است. بنابراین نمی توان حالت نهایی آن را دانست.

راهکار ایجاد انتظار تا زمان رها کردن دکمه با استفاده از عبارت while است.

While(button);

تا زمانی که دکمه فشار داده می شود عبارت while تکرار می شود. حلقه دستورات دیگری ندارد؛ بنابراین در اینجا متوقف می شود و تا زمانی که دکمه فشار داده می شود منتظر می ماند.

این بهتر است اما عالی نیست.

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

در خلال این وضعیت، کنتاکت ها گاهی با هم تماس دارند؛ گاهی نه. شما چیزی نخواهید دید؛ اما myled به سرعت چشمک می زند و بنابراین آن را می بیند. در حقیقت آن را بصورت فشارهای سریع پشت سر هم می بیند. این تاثیر «bouncing» سویچ نامیده می شود.

می توانیم این را به آسانی حل کنیم. قبل از دریافت وضعیت جدید سویچ، میکروکنترلر برای مدت کوتاهی منتظر می ماند. بسته به کیفیت سویچ، زمان بین ۰.۱ تا ۰.۵ ثانیه کافی است؛ بنابراین ما ۰.۳ ثانیه را انتخاب می کنیم.

While(button)wait(0.3);

اکنون تمام بخش هایی که برای ایجاد برنامه لازم داریم؛ وجود دارد.

#include "mbed.h"

DigitalIn button(p20);
DigitalOut myled(LED1);

Intmain() {
    While (1) {
        If (button) {
            Myled = !myled;
            While(button)wait(0.3);
        }
    }
}

در عبارت myled = !myled ممکن است اشتباهی وجود داشته باشد. برای اینکه این کار را انجام دهیم؛ ابتدا باید وضعیت واقعی پایه را بررسی کنیم.

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

هرچه سریعتر وضعیت پایه را تغییر دهید، اگر بار بزرگتر باشد زودتر به مشکل می خورید. در این پروژه این پایه به LED متصل شده است و برای تست از آن استفاده می کنیم، بنابراین مشکلی وجود ندارد. اگر سرعت بالا باشد یا بار خیلی بزرگ باشد؛ بهتر است از یک متغییر میانی استفاده کنیم.

Flag = !flag;
Myled = !myled;

برای اینکه این کار را انجام دهیم باید “flag” را یک متغییر تعریف کنیم.

اکنون کاری که باقی می ماند ساخت سخت افزار است. از سخت افزار مشابهی مانند مطلب قبلی ( برنامه نویسی مولتی ویبراتور مونواستابل با ARM )  استفاده خواهیم کرد.

وقتی برنامه درحال اجرا است سویچ را فشار دهید تا LED روشن شود و سپس آن را دوباره فشار دهید تا خاموش شود.

این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست به‌روزرسانی‌های سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال می‌شیم به ما اطلاع بدهید.