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

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

انجمن های تخصصی برق و الکترونیک ECA

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

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

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


خوب رسیدیم به مبحث جالب وقفه، این وقفه دو تا تابع داره، برا برد های آردوینو مختلف تعداد پایه های وقفه متفاوت هستش، مثلا برد 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 روشن یا خاموش میشه .
ولی اگه اون دو تا تابع بالا رو در پروژه زیر به حالت توضیحات دربیارید و پروژه رو تست کنید میبینید که هر لحظه از از اجرای پروژه وقفه میتونه رخ بده.
فیلم پروژه رو ببینید بهتر متوجه میشید.

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

فیلم پروژه بالا :

8.9MB آموزش جامع آردوینو جلسه 10 وقفه خارجی
0%
00:00  /  02:08

 

خوب این مطلب هم تموم شد خدا رو شکر…امیدوارم این مطلب براتون مفید بوده باشه و بدرتون بخوره و در ضمن هزینه استفاده از مطلب یادتون نره. (۳ تا صلوات برا شادی روح شهدا و امام شهدا و سلامتی رهبر و علمای اسلام و هر کسی که به کشور خدمت میکنه + دعا برا ظهور آقا)

راستی اینم بگم من چون احساس کردم همین قدر کافیه توضیح داده به همین خاطر به همین مقدار اکتفا کردم ، اگه فک میکنیم کم توضیح دادم یا جاییش رو نگفتم یا….بگید لطفا و سوال موالی هم بود بپرسید، ۱۰۰ تا سوال هم داشتین بپرسین……تک تکش رو تا جایی که بتونم جواب میدم. heart

فعلا یا علی.

تعداد مطالب : 341 تا
جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
ارسال دیدگاه

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

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

3) پسورد فایل های سایت : www.dmf313.ir

4) نظرات حاوی کد برنامه نویسی تایید نمیشوند ( قالب سایت بهم میریزه )

  1. مهمان

    مهدیار

    1 ) فرض کنید میکروکنترلر شما در حال اجرای برنامه اصلی ) Main Program ( میباشد. سپس یک وقفه
    خارجی به سیستم وارد میشود )مانند فشردن یک کلی د( ، در این حالت میکروکنترلر شما برنامه اصلی را
    متوقف کرده و تابع وقف ه ) ISR ( را اجرا م یکن د. اگر در حین اجرای تابع وقفه میکروکنترلر دوباره دچار
    وقفه شود، عملکرد سیستم به چه صورت خواهد بود ؟ به طور کامل توضیح دهید .
    2 ) اگر تعداد وقفههای تو در تو بیش از دو تا باشد، سیستم چه واکنشی از خود نشان م یده د؟ )در صورتی
    که بیش از دو پایه به عنوا ن وقفه در میکروکنترلر شما وجود داشته باش unknw
    مسشه به این دو تا سوال پاسخ بدید

  2. مهمان

    محمود

    سلام.تشکر فراوان

  3. مهمان

    مهدی

    سلام.
    اون مقاومت ها رو چرا بستید؟ تو شماتیک مدار که چیزی نیست!

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

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

      سلام – کدوم مقاومت ها؟ به کدوم پایه ها وصله؟
      PD2 و PD3 رو اگه مد نظرته که پول دان برا کلید ها هستش – تو شماتیک
      https://dmf313.ir/wp-content/uploads/ARDUINO10-INTER.png
      هم میبینیش – مقاومت دیگه ای مد نظرت هستش دقیقا بگو کجاس تا بررسی کنم.

    • مهمان

      سهیل

      سلام. مطالب خیلی خوبی گذاشتید. ممنون. یه سوال داشتم. من از وقفه استفاده کردم ولی با یه بار زدن کلید فشاری بعضی وقتها یک بار ، بعضی مواقع دو بار یا بیشتر تابع مربوط به وقفه اجرا میشه در صورتی که فقط یک بار کلید زده شده. نوع وقفه هم rising یا falling تنظیم شده.لطف میکنید راهنمایی کنید. ممنون

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

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

        سلام
        ========
        اگه به اسکپ دسترسی داری – برا خودت – دانشگاه شهرتون – رفیقی چیزی
        برو از اسکپ استفاده کن و خروجی که به وقفه میکرو میدی رو در لحظه فشرده شدن کلید، ببین / متوجه میشی
        ========
        از خازن باید استفاده کنی یا از delay در کدنویسی / یه خازن تو مایه های 0.1uf / به این خازن میگن : debounce
        ========
        البته تو ریجستر اگه تو تحریک شدن وقفه رو هر دو لبه گزاشته باشی – طبیعتا وقتی کلید رو فشار میدی و ول میکنی – 2 بار وقفه رخ میده
        اگه هم مثلا روی rising edge بزاری، زمانی که کلید رو فشار میدی وقفه رخ میده
        روی falling edge هم زمانی که کلید رو فشار دادی و ول کردی، وقفه رخ میده.
        اینو هم چک کن.
        ========
        برا بحث کد نویسی، میتونی از طریق کد نویسی این مشکل رو حل کنی، مثلا بعد از اولین بار رخ داده وقفه توسط کلید، 300ms صبر کنه ( حالا وقفه رو غیر فعال کنی، وقفه تو این مدت رخ داد، توجه نکنی و… بستگی به روش کدنویسی شما داره )
        ========
        برا بحث سخت افزاری هم که گفتم یه خازن 0.1uf موازی کلید قرار بده، مقدار مناسبشو با خطا و تست در عمل حساب کن.

        خازن debounce

        • مهمان

          سهیل

          سپاس از راهنمایی های خوبتون

  4. مهمان

    علی

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

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

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

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

  5. مهمان

    امیر

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

  6. مهمان

    حمید

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

  7. مهمان

    هادی

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

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

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

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

    • مهمان

      هادی

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

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

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

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

  8. مهمان

    مطهر

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

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

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

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

  9. مهمان

    محمد

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

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

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

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

  10. مهمان

    ِِحسین

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

  11. مهمان

    ِِحسین

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

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

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

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

  12. مهمان

    Jamal Sadeghii

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

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

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

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

  13. مهمان

    fateme naseri

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

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

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

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

  14. مهمان

    رضا

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

  15. مهمان

    ئ

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

  16. مهمان

    ياسر

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

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

      مهدی دمرچیلو

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

  17. مهمان

    محمد امین

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

  18. مهمان

    JM

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

1 2