در این آموزش به بررسی pooling و همچنین intterupt به طور تخصصی در پلتفرمهای آردوینو خواهیم پرداخت. در ادامهی آموزش با مرجع تخصصی آدوینو ، دیجی اسپارک همراه باشید. اکثر سیستم های میکروکنترلر دارای ارتباط سریال ، SPI ، I2C ، مبدل آنالوگ به دیجیتال و . . . میباشند.گاهی اوغات یک سیستم خارجی ( مانند یک سنسور ) برای انجام عملیاتی مشخص به میکروکنترلر یا آردوینو متصل میشوند و از طریق دستورالعملهایی با آنها ارتباط برقرار شده و کنترل میشوند. به عنوان نمونه یک سیستم دماسنج دیجیتال، که دمای محیط را اندازهگیری میکند و پس از پایان اندازهگیری مقادیر را به میکروکنترلر ارسال میکند.
کاربرد وقفه در برنامه نویسی میکروکنترلرها
وقفهها (Interrupts) در برنامهنویسی میکروکنترلرها بسیار مهم و کاربردی هستند. وقفهها به میکروکنترلر اجازه میدهند تا به طور فعالیتهای رویدادی یا خارجی در زمانی که در حال اجرای برنامه اصلی هستند، واکنش نشان دهند. با استفاده از وقفهها، میکروکنترلر میتواند به طور موثر به رویدادهای خارجی واکنش نشان داده و بدون نیاز به بررسی مداوم، در زمان مناسب به آنها پاسخ دهد.یک وقفه توسط یک رویداد خارجی مانند ورودی دیجیتال، سیگنال ساعت، تایمر یا توقف درخواست کاربر ایجاد میشود. هنگامی که رویدادی اتفاق میافتد، میکروکنترلر عملکرد عادی خود را متوقف میکند و به برنامه وقفه میدهد. سپس یک بردار وقفه (Interrupt Vector) تعیین شده در حافظه میکروکنترلر را مشاهده میکند تا مکانیزم وقفه را پیدا کند.هر وقفه میکروکنترلر یک خدمات خاص را انجام میدهد. میکروکنترلر بر اساس اولویت وقفهها، وقفه با بالاترین اولویت را پیدا میکند و برنامهای که مربوط به آن وقفه است را اجرا میکند. پس از اتمام وظیفه مربوط به وقفه، میکروکنترلر به برنامه اصلی خود بازمیگردد و از همان نقطه ادامه میدهد که متوقف شده بود. وقفهها برای خواندن وضعیت ورودیهای خارجی مانند دکمهها، سوییچها و سنسورها استفاده میشوند. وقفهها به میکروکنترلر این امکان را میدهند که در هنگام فشار دادن یک دکمه یا وقوع یک رویداد، فوراً واکنش نشان دهد و برنامه اصلی را به طور موقت متوقف کند. وقفهها برای مدیریت تایمرها و شمارندهها استفاده میشوند. با استفاده از وقفهها، میکروکنترلر میتواند به طور دقیق زمان را سنجایی کند و در زمان تعیین شده واکنش نشان دهد، مثلاً در صورت رسیدن تایمر به یک مقدار مشخص، وقفهای رخ میدهد و میکروکنترلر میتواند بر اساس آن عملیات مربوطه را انجام دهد.در برنامهنویسی میکروکنترلرها، ارتباط سریال بسیار رایج است. با استفاده از وقفهها، میکروکنترلر میتواند به صورت مستقیم دادههای دریافتی از پورت سریال را دریافت کند و به طور همزمان برنامه اصلی خود را ادامه دهد. همچنین، میکروکنترلر میتواند به صورت خودکار به دادههای دریافتی پاسخ دهد یا دادههایی را برای ارسال به پورت سریال آماده کند. وقفهها میتوانند برای واکنش به رویدادهای خارجی استفاده شوند، مانند تغییرات در سیگنالهای ورودی/خروجی، وقوع سیگنالهای قطبیت (rising edge/falling edge) در سیگنالهای دیجیتال، تغییرات در سیگنالهای آنالوگ، رخ دادن خطاها و غیره. با استفاده از وقفهها، میکروکنترلر میتواند به صورت فوری واکنش نشان دهد و عملیات مورد نیاز را انجام دهد. مثلاً، در صورتی که سیگنال ورودی تغییر کند، وقفهای رخ میدهد و میکروکنترلر میتواند به تغییرات واکنش نشان دهد. وقفهها میتوانند برای تعامل با سیستمهای خارجی مورد استفاده قرار بگیرند. مثلاً، با استفاده از وقفهها میکروکنترلر میتواند به صورت خودکار به درخواستهای شبکه پاسخ دهد، با دستگاههای جانبی مانند حافظههای فلش، نمایشگرها، سنسورها و اکتوآتورها ارتباط برقرار کند و دادهها را تبادل کند. وقفهها میتوانند در پردازش سیگنال و صدا مورد استفاده قرار گیرند. میکروکنترلرها معمولاً دارای واحدهای DSP (پردازش سیگنال دیجیتال) هستند که قادر به انجام عملیات پردازش سیگنالی سریع هستند. با استفاده از وقفهها، میکروکنترلر میتواند به صورت فوری سیگنالهای ورودی را بخواند، پردازش کند و سیگنالهای خروجی تولید کند.
وقفه در میکروکنترلر avr
در میکروکنترلرهای AVR، وقفهها نقش بسیار مهمی در برنامهنویسی و کنترل سیستمها ایفا میکنند. میکروکنترلرهای AVR شامل یک واحد وقفه مجزا به نام “Interrupt Controller” هستند که امکان اتصال و تنظیم وقفهها را فراهم میکند. در میکروکنترلر AVR، از یک سیستم پیچیده و متنوع وقفهها پشتیبانی میکند که میتوان از آن برای انواع وظایف استفاده کرد.
برخی از وقفههای رایج در میکروکنترلر AVR عبارتند از:
External Interrupts (وقفههای خارجی): میکروکنترلر AVR از ورودیهای خارجی به نام “External Interrupt Pins” پشتیبانی میکند. این وقفهها به کاربر اجازه میدهند تا به رویدادهای خارجی مانند فشار دکمه، سیگنال سنسور، تغییرات در ورودیهای دیجیتال و غیره واکنش نشان دهند. در میکروکنترلر AVR، پینهای خارجی با شمارهگذاری مانند INT0، INT1 و غیره برای اتصال و تنظیم وقفهها استفاده میشوند.
Timer Interrupts (وقفههای تایمر): میکروکنترلر AVR دارای تایمرهای سختافزاری است که به طور مستقل قابل برنامهریزی هستند. میکروکنترلر AVR میتواند وقفههایی را برای محاسبه زمان و تنظیمات زمانی مشخص که تایمرها به آنها برسند، استفاده کند. با تنظیم مناسب وقفه تایمر، میکروکنترلر میتواند در زمان مشخص به صورت خودکار واکنش نشان دهد.
USART/UART Interrupts (وقفههای USART/UART): میکروکنترلر AVR از USART/UART برای ارتباط سریال استفاده میشوند. با استفاده از وقفههای USART/UART در میکروکنترلر AVR، میتوانید به صورت مؤثر با دستگاههای خارجی ارتباط برقرار کنید. این وقفهها به شما اجازه میدهند تا به صورت خودکار به درخواستهای ورودی و خروجی USART/UART پاسخ دهید و دادههای دریافتی را دریافت کنید و یا دادههایی را برای ارسال ارسال کنید.
ADC Interrupts (وقفههای تبدیل آنالوگ به دیجیتال): میکروکنترلر AVR دارای مبدل آنالوگ به دیجیتال (ADC) است. با استفاده از وقفههای ADC، میکروکنترلر میتواند به صورت فوری به تغییرات در ورودیهای آنالوگ واکنش نشان دهد و به صورت خودکار نمونههای آنالوگ را تبدیل به دیجیتال کند و دادههای نمونه برداری شده را دریافت کند.
EEPROM Interrupts (وقفههای EEPROM): میکروکنترلر AVR دارای حافظه EEPROM است که به شما امکان میدهد دادهها را به صورت غیرحذفی و غیرقابل پاک شدن ذخیره کنید. با استفاده از وقفههای EEPROM، میکروکنترلر میتواند به صورت خودکار به تغییرات در حافظه EEPROM واکنش نشان دهد و دادههای مورد نیاز را بخواند یا بنویسد.
Watchdog Timer Interrupts (وقفههای تایمر نگهبان): میکروکنترلر AVR دارای تایمر نگهبان (Watchdog Timer) است که به صورت خودکار سیستم را نظارت میکند و در صورت وقوع خطایی که ممکن است باعث کنگکاری میکروکنترلر شود، سیستم را ریست میکند. با استفاده از وقفههای تایمرمیکروکنترلر AVR، میتوانید به صورت خودکار واکنش نشان دهید و عملیات مورد نیاز را انجام دهید.
Timer/Counter Compare Match Interrupts (وقفههای تطابق مقایسه تایمر/شمارنده): میکروکنترلر AVR دارای تایمرها و شمارندههای سختافزاری است که میتوانند بر اساس تطابق و مقایسه با یک مقدار مشخص وقفهها را فعال کنند. با استفاده از وقفههای تطابق مقایسه، میکروکنترلر میتواند به صورت خودکار واکنش نشان دهد و عملیات مربوط به تطابق مقایسه را انجام دهد، مانند تغییر وضعیت پینها، محاسبه مقدار دلخواه و غیره.
SPI Interrupts (وقفههای رابط سریال همزمان): میکروکنترلر AVR دارای رابط سریال همزمان (SPI) است که برای ارتباط با دستگاههای خارجی مانند حافظههای فلش، صفحه نمایشگرها و سنسورها استفاده میشود. با استفاده از وقفههای SPI، میکروکنترلر میتواند به صورت خودکار به دادههای دریافتی و ارسالی واکنش نشان دهد و عملیات مورد نیاز را انجام دهد.
در نهایت، با استفاده از وقفهها در میکروکنترلر AVR، میتوانید به صورت موثر واکنش نشان داده و عملکرد سیستم را بهبود بخشید. با تنظیم و برنامهریزی مناسب وقفهها، میکروکنترلر میتواند به صورت خودکار و در زمان مناسب به رویدادها و وقایع مورد نظر واکنش نشان دهد و عملیات مورد نیاز را انجام دهد.
انواع وقفه در برنامه نویسی avr
در میکروکنترلر AVR، انواع وقفهها عبارتند از:
- External Interrupts (وقفههای خارجی): INT0, INT1, INT2
- Timer/Counter Interrupts (وقفههای تایمر/شمارنده): Timer/Counter0 Overflow, Timer/Counter1 Overflow, Timer/Counter2 Overflow, Timer/Counter1 Capture Event, Timer/Counter2 Compare Match
- USART/UART Interrupts (وقفههای USART/UART): USART Receive Complete, USART Transmit Complete, USART Data Register Empty
- ADC Interrupts (وقفههای تبدیل آنالوگ به دیجیتال): ADC Conversion Complete
- EEPROM Interrupts (وقفههای EEPROM): EEPROM Ready
- Watchdog Timer Interrupt (وقفهی تایمر نگهبان): Watchdog Timeout
- SPI Interrupts (وقفههای رابط سریال همزمان): SPI Serial Transfer Complete
این فهرست تنها چند نمونه از وقفههای معمول در میکروکنترلر AVR است و ممکن است در مدلها و نسخههای مختلف AVR دسترسی به وقفههای متفاوتی وجود داشته باشد. همچنین، برنامه نویسان میتوانند وقفههای سفارشی خود را نیز تعریف کنند تا به نیازهای خاص خود پاسخ دهند.
نسبت دادن intrrupt و pooling به وقایع روزانه
فرض کنید منظر سرویس برای رفتن به سر کار باشید.سرویس شما راس ساعت ۸:۰۵ در مقابل منزلتان منتظر شماست. شما میخواهید ساعت ۸ از خانه خارج شوید و در بیرون خانه منتظر سرویس بایستید. دو راه کار پیش روی شماست :
۱- هنگامی که از خواب بیدار میشوید مدام به ساعت نگاه کنید تا وقتی ساعت ۸ شد از خانه خارج شوید ( کاری بسیار کسل کننده ) ( روش pooling ) .
۲- برای ساعت ۸ زنگ ساعت را تنظیم کنید که هنگام راس ساعت ۸ زنگ آن به صدا آید و شما را مطلع ساز ( روش interrupt ) .
مثالی حقیقی از عمل کرد وقفه
فرض کنید قصد داریدبرنامهای بنویسید که با هر بار فشار دادن یک کلید ، یک عدد LED روشن شود. اگر از pooling استفاده کنید باید مدام برنامه وضعیت کلید را چک کند و در صورت یک منطقی کلید ، LED روشن میشود. ولی در روش interrupt بدون چک کردن دائم وضعیت کلید ، هنگام فعال شدن کلید یک سیگنال به cpu فرستاده میشود و سپس LED روشن میشود.
روال پاسخ گویی به وقفه یا ( ISR ( interrupt service routine
قبل از توضیح این قسمت توجه شمارا به تعریف چند کلمهی خاص جلب میکنم :
stack : قسمتی از حافظه SRAM میباشد که دستوراتی جهت اجرای وقفه و فراخوانی میکروکنتلر در آن جا ذخیره میشود.
ثبات : به حافظههای سریع درون پردازنده ثبات یا Register میگویند.
Program counter : شمارنده برنامه میباشد که نشان میدهد میکروکنترلردر کدام قسمت از برنامه قرار دارد.
بردار وقفه : هر سطح وقفه یک محل رزرو شده در حافظه دارد که بردار وقفه (interrupt vector) نامیده می شود. همه بردارهای وقفه در جدولی به نام جدول بردار وقفه (interrupt vector table) نگهداری می شوند. به عنوان مثال جدول بردار وقفه یک میکروکنترلر را مشاهده میکنید:
تذکر : اگر چند وقفه به طور همزمان رخ دهد ، هرکدام که اولویت بالاتری دارد را اجرا میکند. همانطور که در جدول فوق مشاهده میکنید وقفه RESET در میکروکنترلر و آردوینو از اولویت بالاتری برخوردار میباشد و با اجرای آن میکروکنتلربه شروع آدرس برنامهی درون خود پرش میکند.
پس از آن که cpu سیگنال وقفه را دریافت کرد مراحل زیر را به ترتیب اجرا میکند:
- ۱- برنامه دستوری که در حال اجرای آن بوه است را متوقف نموده . سپس تمام ثبات ها ، Program counter و آدرس قسمتی از برنامه که در حال اجرای آن بوده است، در stack ذخیره میشوند.
- ۳- به جدول بردار وقفه ( جدولی همانند تصویر بالا ) مراجعه میکند و آدرس سرویس وقفه ( program address ) را پیدا میکند .
- ۳- سپس به آدرس بدست آمده از بردار وقفه پرش میکند و زیربرنامه موجود در آن آدرس بدست آمده را اجرا میکند.
- ۴-به stack بازگشته ثبات ها و آدرس همان جایی از برنامه که هنگام وقوع وقفه ، متوقف شده بود را دریافت میکند.
- ۵- سپس به همان آدرس پرش میکند و ادامهی برنامه را اجرا میکند ( به زبان ساده تر،به همان جایی که برنامه متوقف شده بود ، باز میگردد و شروع به اجرای برنامه میکند).
آموزش وقفه interrupt
انواع وقفه در برنامه نویسی آردوینو
در برنامهنویسی آردوینو، نیز انواع مختلفی از وقفهها وجود دارد که میتوانید در برنامههای خود استفاده کنید. این وقفهها به شما امکان میدهند تا به صورت خودکار و در زمان مناسب به وقایع و رویدادهای خاصی در آردوینو واکنش نشان دهید. برخی از انواع وقفهها در برنامهنویسی آردوینو عبارتند از:
External Interrupts (وقفههای خارجی): آردوینو دارای پایههای ورودی و خروجی خاصی است که میتوانید از آنها برای اتصال اشیاء خارجی مانند دکمهها، سنسورها و سایر ماژولها استفاده کنید. با استفاده از وقفههای خارجی، میتوانید به صورت خودکار به تغییر وضعیت پایههای ورودی واکنش نشان دهید.
Timer Interrupts (وقفههای تایمر): آردوینو دارای تایمرهای سختافزاری است که میتوانید از آنها برای اندازهگیری زمان، ایجاد تاخیر و سایر عملیات زمانبندی استفاده کنید. با استفاده از وقفههای تایمر، میتوانید به صورت خودکار و در زمان مشخص به رویدادها و وقایع مربوط به تایمرها واکنش نشان دهید.
Pin Change Interrupts (وقفههای تغییر وضعیت پین): در آردوینو، میتوانید از وقفههای تغییر وضعیت پین استفاده کنید تا به صورت خودکار به تغییرات در وضعیت پایههای ورودی واکنش نشان دهید. این وقفهها برای مانیتور کردن وضعیت پایههایی که تغییرات مهمی در آنها اتفاق میافتد مفید هستند.
Serial Interrupts (وقفههای سریال): آردوینو دارای پورتهای سریال (مانند UART و USB) است که برای ارتباط با سایر دستگاهها و کامپیوتر استفاده میشوند. با استفاده از وقفههای سریال، میتوانید به صورت خودکار واکنش نشان دهید و عملیات مربوط به ارسال و دریافت دادهها را انجام دهید.
ADC Interrupts (وقفههای تبدیل آنالوگ به دیجیتال): آردوینو دارای مبدل آنالوگ به دیجیتال (ADC) است که به شما امکان میدهد سیگنالهای آنالوگ را به صورت دیجیتال تبدیل کنید. با استفاده از وقفههای ADC، میتوانید به صورت خودکار واکنش نشان دهید و مقادیر نمونهبرداری شده را دریافت کنید.
EEPROM Interrupts (وقفههای EEPROM): آردوینو دارای حافظه EEPROM است که به شما امکان میدهد دادهها را به صورت غیرحذفی و غیرقابل پاک شدن ذخیره کنید. با استفاده از وقفههای EEPROM، میتوانید به صورت خودکار واکنش نشان دهید و دادههای مورد نیاز را بخوانید یا بنویسید.
Wire Library Interrupts (وقفههای کتابخانه Wire): آردوینو دارای کتابخانه Wire برای ارتباط با دستگاههای I2C است. با استفاده از وقفههای کتابخانه Wire، میتوانید به صورت خودکار واکنش نشان دهید و دادهها را بین آردوینو و سایر دستگاههای I2C مبادله کنید.
دلیل استفاده از وقفه در پروژه ها چیست
استفاده از وقفه در پروژهها به دلایل متعددی انجام میشود. در زیر به برخی از دلایل مهم استفاده از وقفه در پروژهها اشاره میکنم:
واکنش به رویدادها: وقفهها به شما اجازه میدهند تا به صورت خودکار و در زمان مناسب به رویدادها و وقایع خاصی در پروژه واکنش نشان دهید. به عنوان مثال، با استفاده از وقفهها میتوانید به تغییر وضعیت یک دکمه، حسگر، یا ورودی خارجی دیگر پاسخ دهید.
زمانبندی دقیق: با استفاده از وقفهها میتوانید عملیاتهای مهم را در زمان دقیق انجام دهید. به عنوان مثال، با استفاده از وقفههای تایمر، میتوانید دستگاه را به صورت منظم و با دقت زمانبندی کنید.
کاهش مصرف انرژی: با استفاده از وقفهها میتوانید میکروکنترلر را در حالت خواب قرار داده و مصرف انرژی را به حداقل برسانید. زمانی که وقوع یک رویداد خاص تشخیص داده شود، میکروکنترلر از حالت خواب بیدار میشود و عملیات مورد نیاز را انجام میدهد.
پاسخ سریع: با استفاده از وقفهها میتوانید پاسخ سریعتری به رویدادها داشته باشید. در برنامههایی که نیاز به پاسخ فوری به رویدادها دارند، وقفهها میتوانند کارآمد باشند.
جداکردن کدهای مختلف: استفاده از وقفهها به شما امکان میدهد تا قسمتهای مرتبط وابسته به رویدادها را از بقیه کدها جدا کنید. ا
پردازش موازی: با استفاده از وقفهها، میتوانید به صورت همزمان و موازی بر روی وظایف مختلف کار کنید. برخی از وقفهها میتوانند در زمان اجرای وظایف اصلی برنامه، به طور موازی اجرا شوند و کارایی و سرعت عملکرد را بهبود بخشند.
ارتباط با دستگاههای خارجی: وقفهها میتوانند به شما اجازه دهند با دستگاههای خارجی، مانند حسگرها یا ماژولها، به صورت موثر و دقیق ارتباط برقرار کنید. با نصب وقفه بر روی پایههای مربوطه، میتوانید به طور فعال و با سرعت بالا دادهها را از دستگاههای خارجی دریافت کرده یا به آنها ارسال کنید.
استفاده از وقفهها در پروژهها میتواند منجر به جدا سازی و مدیریت بهتر کدها شود. با تعریف وقفههای مناسب برای رویدادها، میتوانید بخشهای مختلف کد را به صورت مستقل پیادهسازی کنید و به این ترتیب، کد خود را قابلتوسعه و قابلنگهداری کنید.در کل، استفاده از وقفهها در پروژههای آردوینو به شما امکان میدهد که برنامه را به صورت خودکار دقیق و دقیقتری برای واکنش به رویدادها و مدیریت زمان راهاندازی کنید. با استفاده از وقفهها میتوانید کد خود را سادهتر و قابلتوسعهتر کنید و همچنین عملکرد بهتری را در پروژه خود به دست بیاورید.به طور خلاصه، استفاده از وقفهها در پروژههای آردوینو به شما امکان میدهد:
- واکنش سریع به رویدادها و وقایع خاص را داشته باشید.
- زمانبندی دقیق را برای اجرای کدها و وظایف مختلف انجام دهید.
- مصرف انرژی را بهینهسازی کنید و میکروکنترلر را به حالت خواب ببرید.
- کدهای مختلف را جدا کرده و مدیریت بهتری بر آنها داشته باشید.
- پردازش موازی را فراهم کنید و وظایف مختلف را به صورت همزمان اجرا کنید.
- ارتباط با دستگاههای خارجی را بهبود بخشید و دادهها را به صورت دقیق دریافت یا ارسال کنید.
- به طور عمومی، کارایی، قابلیت توسعه و نگهداری پروژه خود را بهبود دهید.
[…] دو لینک زیر به آموزش وقفه در آردوینو پرداخته بخش اول بخش […]
[…] آموزش وقفه بخش اول […]
سلام. ممنون از شما. لغت pooling اشتباه است. درستش polling است.
با سلام و تشکر از توجه شما
کجای آموزش این اشتباه را دیدید؟
سلام.چه طوری میشه وقفه داخلی(نرم افزاری) ایجاد کرد؟
من می خواهم همواره در طول اجرای برنامه چک کند که اگر wifi قطع شد بیا و اینترنت رو دوباره وصل کن.
مثلا برنامه درحال روشن کردن یک چیزی است ولی یکدفعه اینترنت قطع می شود پس میکرو اول بیاید روشن کردن ان وسیله را قطع کند و سپس اینترنت را وصل کند و سپس دوباره بیاید و ان وسیله را روشن کند.
و بردمesp8266 است
ممنون می شوم راهنمایی ام کنید
۱ ) فرض کنید میکروکنترلر شما در حال اجرای برنامه اصلی ) Main Program ( میباشد. سپس یک وقفه
خارجی به سیستم وارد میشود )مانند فشردن یک کلی د( ، در این حالت میکروکنترلر شما برنامه اصلی را
متوقف کرده و تابع وقف ه ) ISR ( را اجرا م یکن د. اگر در حین اجرای تابع وقفه میکروکنترلر دوباره دچار
وقفه شود، عملکرد سیستم به چه صورت خواهد بود ؟ به طور کامل توضیح دهید .
۲ ) اگر تعداد وقفههای تو در تو بیش از دو تا باشد، سیستم چه واکنشی از خود نشان م یده د؟ )در صورتی
که بیش از دو پایه به عنوا ن وقفه در میکروکنترلر شما وجود داشته باش د(