معرفی
این دومین مقاله من در رابطه با پلتفرم ریزپردازنده آردوینو است. اولین مورد اجرای ساده بازی SIMON با استفاده از آردوینو بود. مقاله را می توان در اینجا یافت .
برای آشنایی با سخت افزار آردوینو، به مقالات عالی jeffb42 مراجعه کنید ، زیرا تکرار چیزها در اینجا فایده ای ندارد.
این مقاله درباره چیست؟
در این مقاله قصد دارم وقفه های سخت افزاری را معرفی کنم و اینکه چگونه می توانند یکی از ویژگی های مهم پلتفرم آردوینو باشند.
وقفه چیست؟
وقفه ها روشی هستند که به ریزپردازنده سیگنال می دهند که اتفاقی افتاده است. با این حال، ممکن است از خود بپرسید، آیا به هر حال وقتی از ورودی دیجیتال و غیره استفاده می کنید این اتفاق نمی افتد؟ خیلی ساده - نه.
هنگامی که از ورودیهای دیجیتالی استفاده میکنید، معمولاً مقدار آن را با صدور یک دستورالعمل میخوانید، سپس با استفاده از نوعی منطق، روی مقدار خوانده شده عمل میکنید، یعنی کد در حال نظرسنجی برای یک مقدار است.
بسته به پیچیدگی روال های شما و مدت زمان تغییر حالت در ورودی، کاملاً ممکن است که تغییر در ورودی اصلاً رخ ندهد.
با استفاده از یک وقفه، کد به معنای واقعی کلمه قطع میشود، و مجبور میشود که منشعب شود و اجرای دیگری انجام دهد، یعنی تغییر حالت در ورودی «از دست نمیرود». بنابراین وقفه ها مانند یک محرک سخت افزاری هستند.
چه فایده ای دارند؟
وقفه ها می توانند به حل مشکلات زمان بندی که ممکن است در تنظیمات کد/سخت افزار شما رخ دهد کمک کنند. ممکن است قبلاً مشکل زمان بندی داشته اید و متوجه نشده اید که چه اتفاقی افتاده است. چند بار تا به حال به خود گفتهاید: «چرا آن شلیک نشد؟» یا «آخرین باری که آن را اجرا کردم کار کرد. چه تفاوتی داره؟"
شروع به کسب و کار
من از Arduino Duemilanove Board برای این مثال استفاده می کنم و از نسخه 18 توسعه IDE استفاده خواهم کرد. این را می توان مستقیماً از Arduino.cc دانلود کرد .
اگر از نوع دیگری از برد آردوینو استفاده میکنید، باید مشخصات را بررسی کنید تا ببینید کدام پینها کدام هستند، زیرا انواع مختلف برد میتوانند تخصیصها و تعداد وقفهها/پینهای دیجیتال/پینهای آنالوگ و غیره متفاوت داشته باشند.
در Duemilanove، 2 وقفه سخت افزاری موجود است. این ها روی پین های دیجیتال 2 و 3 قرار دارند. در این دمو از پین 2 و همچنین از پین دیجیتال 4 به عنوان خروجی برای کنترل LED استفاده می کنیم. شماتیک این مورد در زیر نشان داده شده است:
ورودی و خروجی دیجیتال استاندارد - بدون وقفه
آردوینو را مطابق شماتیک تنظیم کنید و کد زیر را در ریزپردازنده آپلود کنید. در اینجا مقدار یک ورودی را می خوانید، یک مقایسه شرطی انجام می دهید، روال طولانی را اجرا می کنید و تکرار می کنید.
این خروجی های غیرقابل پیش بینی را در LED به دلیل طولانی بودن فرآیند در یک نقطه نامشخص نسبت به زمانی که دکمه ورودی فعال می شود، می دهد. گاهی اوقات LED بلافاصله حالت را تغییر می دهد، گاهی اوقات هیچ اتفاقی نمی افتد، و گاهی اوقات باید دکمه را برای مدتی نگه دارید تا وضعیت تغییر یافته تشخیص داده شود. [این کد قسمت A در فایل منبع دانلود شده است.]
پنهان کردن کد کپی
int pbIn = 2; // Digital input on pin 2 int ledOut = 4; // The output LED pin int state = LOW; // The input state void setup() { // Set up the digital Pin 2 to an Input and Pin 4 to an Output pinMode(pbIn, INPUT); pinMode(ledOut, OUTPUT); } void loop() { state = digitalRead(pbIn); //Read the button digitalWrite(ledOut, state); //write the LED state //Simulate a long running process or complex task for (int i = 0; i < 100; i++) { // do nothing but waste some time delay(10); } }
استفاده از وقفه ها
ما از همان نمودار شماتیک استفاده می کنیم و کد را برای استفاده از وقفه های سخت افزاری تغییر می دهیم. اکنون هنگامی که کد را آپلود می کنید، هر زمان که دکمه فشار داده شود، LED تغییر حالت می دهد، حتی اگر کد همچنان با همان تاخیر طولانی در حلقه اصلی اجرا می شود. [این کد PART B در فایل منبع دانلود شده است.]
پنهان کردن کد کپی
int pbIn = 0; // Interrupt 0 is on DIGITAL PIN 2! int ledOut = 4; // The output LED pin volatile int state = LOW; // The input state toggle void setup() { // Set up the digital pin 2 to an Interrupt and Pin 4 to an Output pinMode(ledOut, OUTPUT); //Attach the interrupt to the input pin and monitor for ANY Change attachInterrupt(pbIn, stateChange, CHANGE); } void loop() { //Simulate a long running process or complex task for (int i = 0; i < 100; i++) { // do nothing but waste some time delay(10); } } void stateChange() { state = !state; digitalWrite(ledOut, state); }
Thevolatile
keyword is added to thestate
variable, this causes the compiler to use RAM instead of a storage register. This is done because the storage register can be temporarily inaccurate if they are being modified by areas other than the main thread. In the Arduino, this relates to code being triggered by interrupts.
نیاز attachInterrupt(param1, param2, param3)
به 3 پارامتر، اینها عبارتند از.