نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
مهدی دمیرچیلو

آموزش جامع آردوینو جلسه ۱۰ وقفه خارجی

به نام خدا : تو این مطلب از آموزش آردوینو میخوام به آموزش وقفه خارجی در آردوینو بپردازم و یکی دو تا پروژه اردوینو هم گزاشتم براتون.
آموزش جامع آردوینو جلسه ۱۰ وقفه خارجی

آموزش جامع آردوینو جلسه ۱۰ وقفه خارجی


خوب رسیدیم به مبحث جالب وقفه، این وقفه دو تا تابع داره، برا برد های آردوینو مختلف تعداد پایه های وقفه متفاوت هستش، مثلا برد uno همش ۲ تا پایه وقفه خارجی داره و برد Due میشه از همه ی پایه هاش به عنوان پایه وقفه خارجی استفاده کرد shock ، الله اکبر؛ ولی چون ما با UNO کار میکنیم کاری به بقیه برد ها نداریم. laugh

برد آردوینو/وقفه ها int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet ۲ ۳  –  –  –  –
Mega2560 ۲ ۳ ۲۱ ۲۰ ۱۹ ۱۸
Leonardo ۳ ۲ ۰ ۱ ۷  –
Due

تمام پایه ها قابلیت تبدیل به وقفه خارجی رو دارند.

 
همون طو که میبینید برد Uno 2 تا وقفه داره به نام های int0 و int1 که به ترتیب منتسب به پایه های ۲ و ۳ برد آردوینومون هستن.
راستی تا یادم نرفته اگه در مورد وقفه چیزی نمیدونید و این که چی هستش، کارش چیه و… میتونید توضیحات اول مطلب زیر رو بخونید : آموزش جامع میکروکنترلر AVR جلسه۳ >>>> خوب بریم سراغ توضیح دو تا تابع موجود :
 
attachInterrupt : همون طور که میدونید پایه ۲ و ۳ برد آردوینو به عنوان ورودی/خروجی کار میکنه و برا این که وقفه خارجی روی این پایه ها رو فعال کنیم باس از این تابع استفاده کنیم، لذا تو حالت عادی پایه های ۲ و ۳ ، در نقش پایه های وقفه خارجی نیستند، و در نقش ورودی/خروجی هستند.

interrupt : شماره وقفه ای که میخواین ازش استفاده کنید، دو تا وقفه داریم، وقفه ۰ و ۱ (جدول بالا)
mode : توسط این قسمت نوع تحریک شدن وقفه رو تعیین میکنیم، مثلا به ازای هر تغییر ولتاژی(CHANGE) وقفه رخ بده یا وقتی ولتاژ ۰ منطقی هستش(LOW) یا وقتی که ولتاژ ۱ منطقی هستش(HIGH) یا وقتی که از ۰ منطقی میریم به ۱ منطقی(RISING) و یا برعکس(FALLING)…..این کلمات پر رنگ رو بسته به نیازتون یکیشون و در mode قرار بدید.
ISR : نام تابع وقفه، این نام اختیاری هستش، فقط شما این نامی که این جا میدید رو باس یه تابع تعریف کنید با این نام و کد هایی که دوس دارید در صورت تحریک شدن وقفه اجرا بشن رو توش قرار بدید.
 
نگاه کنید : وقتی مثلا mode رو گزاشتین روی HIGH و وقفه ۰ رو انتخاب کردین، لذا هر موقع پایه ۲ بردمون ۱ منطقی بشه وقفه ۰ رخ میده و تابع وقفه اجرا میشه(تابعی که اسمش رو به جای ISR قرار دادیم و یه تابع تعریف کردیم با این نام و کد هایی رو که دوس داریم در صورت تحریک شدن وقفه اجرا بشن رو توش قرار دادیم….به نظرم پروژه این مطلب رو بببینید بهتر متوجه میشید تا این که این چرت و پرت های منو بخونید laugh )
اینم مثال خود سایت آردوینو

 
detachInterrupt : تابع بالا پایه ۲ و ۳ رو نقششون رو از ورودی/خروجی به وقفه خارجی تغییر میداد، این تابع عکس تابع بالا هستش، وقفه مورد نظر رو غیر فعال میکنه و اون پایه رو ورودی/خروجی میکنه؛ که به صورت زیر هستش و شماره وقفه ای که میخواین غیر فعالش کنید رو به جای interrupt مینویسید.

 
اینم یه پروژه از داشتون…

 

توجه : یه موردی هستش که خود سایت آردوینو هم تذکر(یا پیشنهاد) داده :

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);  recommended
attachInterrupt(interrupt, ISR, mode);                            not recommended

که گفته به جایی این که تو تابع attachInterrupt به پارامتر اول تابع مستقیما بیاین و نام وقفه رو بدید، بهترین که از تابع digitalPinToInterrupt استفاده کنید که برای این کار به این تابع شماره پایه ای از میکرو که میخواین از اون وقفه استفاده کنید رو به این تابع میدید و این تابع رو هم تو پارامتر اول تابع attachInterrupt قرار میدید. (مثلا پایه X برد آردوینو مد نظر شما یه وقفه داره و شما میخواین از اون وقفه استفاده کنید، خب برای این کار شماره پایه که X هستش رو به تابع digitalPinToInterrupt میدید و این تابع رو هم داخل پارامتر اول تابع attachInterrupt قرار میدید.)
منبع : AttachInterrupt

 
خوب ۲ تا تابع زیر رو هم الان(۱۶ مرداد) اضافه میکنم، اول میخواستم تو یه مطلب جدا باشه، بعد نظرم عوض شد(دم دمی هم خودتی :-D)، با این ۲ تابع زیر که میخوام بگم کالا ما توی این مطلب ۴ تا تابع در رابطه با بحث وقفه گفتم، اینم همین جا بگم که جان داش تو عمل مدار رو ببندید و نه تو پروتئوس حالا از ما گفتن.(تو پروتئوس درست کار نمیکنه، پروتئوس چیز چرت و پرتی هستش در زمینه آردوینو، البته به پروتئوس ربطی نداره، این کتاب خونه آردوینو برا پروتئوس مشکل داره laugh ) ، خوب دیگه داستان گفتن بسه بریم سر اصل مطلب :
 
این  دو تابعی که دربارش حرف زدیم رو در زیر میبینید، این دو تابع رو ما جایی ازشون استفاده میکنیم که بخوایم مثلا یه سری از کدها بدون توجه به وقفه اجرا بشن(عمرا فهمیده باشین crazy ) بذار بیشتر توضیح بدم؛ مثلا فک کنید شما یه سری کد دارین و میخواین تحت هر شرایطی اجرا بشن، والا من انگلیسیم زیاد خوب نیست ولی تا جایی که تو سایت آردوینو دیدم نوشته بود از این ۲ تا تابع برا کد هایی که حساس به زمان هستند استفاده میکنیم(حالا دوستانی که انگلیسیشون خوبه ممنون میشم برن سایت آردوینو و ترجمه کنن و بیان اینجا بگن تا ما و دوستان دیگه استفاده کنیم…دو تا لینک مقابل : interrupts و  noInterrupts )

حالا طبق مثال سایت آردوینو کدهایی که بین ۲ تابع بالا باشن اجرا میشن(و کاری به وقفه وقفه ندارن)، و اگه در حین اجرای این کد ها وقفه رخ بده، برنامه وای میسته تا کدهای مورد نظر به طور کامل اجرا بشن و بعد کدهای تابع وقفه مورد نظر اجرا میشه….ok???  rtfm
 

یه مثال در زیر میزارم و فیلم پروژه رو هم میزارم تا کاملا عملکرد این دو تابع آشنا بشین و ببینین که اگه از این ۲ تا تابع استفاده کنیم و نکنیم چی میشه و چه فرقی داره.
 

پروژه آردوینو

خوب اینم از کد های پروژه….که در فیلم پروژه میبینید که وقتی از همین کد استفاده میکنم، هر لحظه از اجرای پروژه وقفه نمیتونه رخ بده و باید وایبسته تا کد های داخل این دو تابع کاملا اجرا بشه و بعد وقفه رخ میده و  LED روشن یا خاموش میشه .
ولی اگه اون دو تا تابع بالا رو در پروژه زیر به حالت توضیحات دربیارید و پروژه رو تست کنید میبینید که هر لحظه از از اجرای پروژه وقفه میتونه رخ بده.
فیلم پروژه رو ببینید بهتر متوجه میشید.

 
اینم از شماتیک کد های پروژه بالا
آموزش اردوینو
 
فیلم پروژه بالا

خوب این مطلب هم تموم شد خدا رو شکر…امیدوارم این مطلب براتون مفید بوده باشه و بدرتون بخوره و در ضمن هزینه استفاده از مطلب یادتون نره. (۳ تا صلوات برا شادی روح شهدا و امام شهدا و سلامتی رهبر و علمای اسلام و هر کسی که به کشور خدمت میکنه + دعا برا ظهور آقا)
راستی اینم بگم من چون احساس کردم همین قدر کافیه توضیح داده به همین خاطر به همین مقدار اکتفا کردم ، اگه فک میکنیم کم توضیح دادم یا جاییش رو نگفتم یا….بگید لطفا و سوال موالی هم بود بپرسید، ۱۰۰ تا سوال هم داشتین بپرسین……تک تکش رو تا جایی که بتونم جواب میدم. heart
نظر هم بدید ثواب داره جان داش. cry
فعلا یا علی.

پسورد فایل های سایت :
www.dmf313.ir
مهدی دمیرچیلو جنگ ما فتح قدس را در پی خواهد داشت (امام خمینی) >>>>>> اگر از صدام بگذریم، اگر مسأله قدس را فراموش کنیم، اگر از جنایت های امریکا بگذریم از آل سعود نخواهیم گذشت. ان‌شاالله اندوه دلمان را را در وقت مناسب با انتقام از امریکا و ال سعود برطرف خواهیم کرد و داغ و حسرت حلاوت این جنایت بزرگ را بر دلشان خواهیم گذاشت و با برپایی جشن پیروزی حق بر جنود کفر و نفاق و آزادی کعبه از دست نااهلان و نامحرمان به مسجد الحرام وارد خواهیم شد (امام خمینی)
ارسال دیدگاه
109

1) تعداد حروف غیر فارسی از حروف فارسی بیشتر باشه دیدگاه به صورت خودکار حذف میشه.

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید : debian

  1. Avatar

    مهمان

    علی

    سلام..استاد ی سوال داشتم .
    میخواستم بدونم چطور باید در یک وقفه تاخیر ایجاد کنم.مثلا میخوام هروقت تابع وقفه اجرا شد.بعد یک ثانیه یک ال ایدی روشن بشه ..لطفا کمک کنید.خیلی به اینکار احتیاج دارم😭

    1398/02/05
    09:03
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام
      کد داخل تابع وقفه نباید توش از دیلای استفاده کرد – درست نیست.
      شما هی متغییر تعریف کن که وقفه رخ داد، بیاد و متغییر فوق رو 1 کنه ( این کار داخل تابع وقفه انجام میشه )، بعد شما تو پروژت ( کدهای داخل حلقه while ) بگو اگه متغییر مد نظر 1 شد، 1 ثانیه دیلای بده، بعد led رو روشن کن، بعد متغییر فوق رو 0 کن.

      1398/02/05
      09:59
  2. Avatar

    مهمان

    امیر

    سلام مطالب سایت انقدر خوبه دل ادم میخواد همه رو بخونه !

    1397/12/03
    11:05
  3. Avatar

    مهمان

    حمید

    داش مهدی و همکاراش دستتون درد نکنه
    خداخیرت بده hi

    1397/11/30
    06:28
  4. Avatar

    مهمان

    هادی

    با سلام
    میخواستم بدونم با آردینو میشه کانتری ساخت که تعداد یک پالس رو تو زمان دودفیقه شمارش کنه

    1397/10/02
    12:07
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام – تا جایی که خاطرمه باید بشه – برا اطمینان بیشتر دیتاشیت میکرو مد نظر – فصل تایمر/کانتر ها رو بررسی کن.

      1397/10/02
      05:30
    • Avatar

      مهمان

      هادی

      با سلام وتشکر از راهنمایی شما. این جوری که من متوجه شدم توی دیتا شیت atmeg328pپایه های xtal1,2برای کلاک خارجی استفاده میشن که این پایه ها توی برد آردوینو گم میشن .چون میخوام پالس ورودی به عنوان کلاک خارجی بشه .بنظر شما آیا راه دیگری هم هست؟

      1397/10/02
      01:21
      • مهدی دمیرچیلو

        نویسنده این مطلب

        مهدی دمیرچیلو

        برد آردوینو این پایه ها رو کریستال 16 یا 20 زده ( خاطرم نی کدومش هستش ) – و در پایه های خروجی ارائه نداده.
        پالس ورودی به عنوان کلاک خارجی بشه؟ دارید اشتباه میرید – تایمر/کانتر خودش پایه جدا برا تامین کلاک داشت تا جایی که خاطرمه – مطلب مربوط به تایمر/کانتر رو تو نت مطالعه کنید.

        1397/10/02
        07:26
  5. Avatar

    مهمان

    مطهر

    این نویز تو وقفه من رو بیچاره کرده
    به خاطر همین از وقفه استفاده نمی کنم
    به جز موازی کردن خازن با کلید، چه راهی برای کاهش نویز هست؟
    دستور دیبانس تو زیر برنامه وقفه غیر فعال میشه
    از دیبانس خیلی خوب جواب گرفتم حیف که تو وقفه کار نمی کنه
    شنیدم تو avr برای وقفه دستور دیبانس مخصوصی داریم
    هعیییییی cry

    1397/09/20
    12:00
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      والا از رفع نویز زیاد اطلاعاتی ندارم ( خودم میخوام در این زمنیه مطالعه کنیم ) – چند روز پیش یه کتاب “تکنیک های کاهش نویز در سیستم های الکترونیکی” به درستم رسید – که اگه مشکلی پیش نیاد 2-3 هفته دیگه شروع به خوندنش میکنم.

      1397/09/20
      12:28
  6. Avatar

    مهمان

    محمد

    مهندس سلام
    این تابع nointerrupt و interrupt چگونه عمل میکنن دقیقل؟
    در ابتدا با nointerrupt تمام وقفه ها را غیر فعال میکنه که هیچ وقفه در اجرای کدهای آن مشکل ایجاد نکنه و در آخر interrupt میزاریم تا وقفه ها دوباره فعال شوند حالا در این بین اگر وقفه ای بیاید چه میشود؟
    دوتا فرضیه وجود داره :
    اینکه اگر وقفه ای آمد این وقفه بعد دستورات interrupt و nointerrupt اجرا میشه
    یا
    اصلا به کل وقفه آمده حذف میشود
    خب به نظر شما کدوم یک درستره

    1397/08/18
    07:20
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام-والا توابع داخلی این دو تابع رو بررسی نکردم ولی فیلم ته مطلبو میدی متوجه میشدی – وقفه ای بیاد تو این حین از بین نمیره – طبق پروژه ای که من تست کردم و فیلمشو گزاشتم – توضیحات خود سایت آردوینو درباره این دو تابع و بررسی کدای خود این دو تابع هم میتونه مفید باشه.-موفق باشید.

      1397/08/18
      10:02
  7. Avatar

    مهمان

    ِِحسین

    با سلام و خسته نباشید
    ارتباط بین آردوینو و متلب

    1397/05/09
    06:26
  8. Avatar

    مهمان

    ِِحسین

    با سلام و خسته نباشید
    ادامه ی اموزش اتصال اردوینو ومتلب بعد از نصب package ها از سایت متلب را کجا می تونم پیدا کنم؟؟

    1397/05/09
    06:24
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام- تو سایتای خارجی سرچ کن – آموزششو پیدا میکنی.

      1397/05/09
      06:26
  9. Avatar

    مهمان

    Jamal Sadeghii

    سلام.چطوری میتونم با اینتراپت خارجی جوری استافده کننم که فاصله میان دو چالس رو اندازه بگیره. به این صورت که وقتی مثلا سنسور ir در حالت off بود تا زمانی که دوباره On شد باید زمان رو حاسب کنه.دو دوباره زمانی که off شد تا on شدن بعدی بیاد زمان اون رو هم حساب کنه همینجور تا اخر

    1397/05/07
    01:41
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام-خب از تایمر استفاده کن -از توابع millis میتونی استفاده کنی – اگه هم کارت خیلی دقیقه و این توابع دقیق نبودن – میتونی خودت رجیسترهای تایمرو مقدار دهی کنی و …

      1397/05/09
      02:52
  10. Avatar

    مهمان

    fateme naseri

    سلام ایا میشه از کلید برای دوکار استفاده کرد ؟فرض کنید می خوام یک کلید هم نقش ورود به منو و هم خروج از اون رو داشته باشه چطور میشه همزمان که با زدن کلید اینتراپت اتفاق می افته بسته به محلی از برنامه که هست کار متفاوتی انجام بده؟ اگر نمیشه ممکن هست یه راهی پیشنهاد بدید؟ با تشکر

    1397/04/13
    04:32
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

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

      1397/04/14
      11:42
  11. Avatar

    مهمان

    رضا

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

    1397/04/03
    10:18
  12. Avatar

    مهمان

    ئ

    دوست عزیز
    وقتی کلید رو فشار میدی اردینو همه کارش رو ول میکنه میره تابع وقفه رو انجام میده
    توی پروژه شما چون توی تابع وقفه delay ندارید این مشخص نیست

    1397/03/22
    03:40
  13. Avatar

    مهمان

    ياسر

    حاجی دمت گرم . مشکلمو حل کردی خدا مشکلتو حل کنه ! heart

    1397/01/21
    10:53
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      حاجی کیه بابا
      ما یه بار رفتیم کربلا – قسطاشو به بابامون ندادیم هنوز laugh

      1397/01/21
      02:32
  14. Avatar

    مهمان

    محمد امین

    سلام من الان یک برنامه نوشتم که میزان یک بودن یک پایه رو اندازه میگیره بعد تعدادی ازش رو جمع میکنه و میانگین میگیره بعدش قراره روی سون سگمنت نمایش بده مشکل اینجاست که دیلی های داخل کتابخونه سون سگنت با اون برنامه تداخل میکنه و یک جویرایی برنامه خیلی بیش از حد طول میکشه میخوام ببینم برای اجرای موازی دو تا برنامه باید چیکار کنم

    1396/08/25
    03:56
  15. Avatar

    مهمان

    JM

    بیا عاغا اینم نظر laugh
    انصافا خدا خیرت بده heart

    1396/07/24
    03:41