به نام خدا : تو این مطلب از آموزش آردوینو میخوام به آموزش وقفه خارجی در آردوینو بپردازم و یکی دو تا پروژه اردوینو هم گزاشتم براتون.
آموزش جامع آردوینو جلسه ۱۰ وقفه خارجی
خوب رسیدیم به مبحث جالب وقفه، این وقفه دو تا تابع داره، برا برد های آردوینو مختلف تعداد پایه های وقفه متفاوت هستش، مثلا برد uno همش ۲ تا پایه وقفه خارجی داره و برد Due میشه از همه ی پایه هاش به عنوان پایه وقفه خارجی استفاده کرد ، الله اکبر؛ ولی چون ما با UNO کار میکنیم کاری به بقیه برد ها نداریم.
برد آردوینو/وقفه ها | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
Uno, Ethernet | ۲ | ۳ | – | – | – | – |
Mega2560 | ۲ | ۳ | ۲۱ | ۲۰ | ۱۹ | ۱۸ |
Leonardo | ۳ | ۲ | ۰ | ۱ | ۷ | – |
Due |
تمام پایه ها قابلیت تبدیل به وقفه خارجی رو دارند. |
همون طو که میبینید برد Uno 2 تا وقفه داره به نام های int0 و int1 که به ترتیب منتسب به پایه های ۲ و ۳ برد آردوینومون هستن.
راستی تا یادم نرفته اگه در مورد وقفه چیزی نمیدونید و این که چی هستش، کارش چیه و… میتونید توضیحات اول مطلب زیر رو بخونید : آموزش جامع میکروکنترلر AVR جلسه۳ >>>> خوب بریم سراغ توضیح دو تا تابع موجود :
attachInterrupt : همون طور که میدونید پایه ۲ و ۳ برد آردوینو به عنوان ورودی/خروجی کار میکنه و برا این که وقفه خارجی روی این پایه ها رو فعال کنیم باس از این تابع استفاده کنیم، لذا تو حالت عادی پایه های ۲ و ۳ ، در نقش پایه های وقفه خارجی نیستند، و در نقش ورودی/خروجی هستند.
1 |
attachInterrupt(interrupt, ISR, mode); |
interrupt : شماره وقفه ای که میخواین ازش استفاده کنید، دو تا وقفه داریم، وقفه ۰ و ۱ (جدول بالا)
mode : توسط این قسمت نوع تحریک شدن وقفه رو تعیین میکنیم، مثلا به ازای هر تغییر ولتاژی(CHANGE) وقفه رخ بده یا وقتی ولتاژ ۰ منطقی هستش(LOW) یا وقتی که ولتاژ ۱ منطقی هستش(HIGH) یا وقتی که از ۰ منطقی میریم به ۱ منطقی(RISING) و یا برعکس(FALLING)…..این کلمات پر رنگ رو بسته به نیازتون یکیشون و در mode قرار بدید.
ISR : نام تابع وقفه، این نام اختیاری هستش، فقط شما این نامی که این جا میدید رو باس یه تابع تعریف کنید با این نام و کد هایی که دوس دارید در صورت تحریک شدن وقفه اجرا بشن رو توش قرار بدید.
نگاه کنید : وقتی مثلا mode رو گزاشتین روی HIGH و وقفه ۰ رو انتخاب کردین، لذا هر موقع پایه ۲ بردمون ۱ منطقی بشه وقفه ۰ رخ میده و تابع وقفه اجرا میشه(تابعی که اسمش رو به جای ISR قرار دادیم و یه تابع تعریف کردیم با این نام و کد هایی رو که دوس داریم در صورت تحریک شدن وقفه اجرا بشن رو توش قرار دادیم….به نظرم پروژه این مطلب رو بببینید بهتر متوجه میشید تا این که این چرت و پرت های منو بخونید )
اینم مثال خود سایت آردوینو
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int pin = 13; int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; } |
detachInterrupt : تابع بالا پایه ۲ و ۳ رو نقششون رو از ورودی/خروجی به وقفه خارجی تغییر میداد، این تابع عکس تابع بالا هستش، وقفه مورد نظر رو غیر فعال میکنه و اون پایه رو ورودی/خروجی میکنه؛ که به صورت زیر هستش و شماره وقفه ای که میخواین غیر فعالش کنید رو به جای interrupt مینویسید.
1 |
detachInterrupt(interrupt); |
اینم یه پروژه از داشتون…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); attachInterrupt(0, BlinkLed1, RISING ); attachInterrupt(1, BlinkLed2, RISING ); } void loop() { digitalWrite(13, 0); delay(500); digitalWrite(13, 1); delay(500); } void BlinkLed1() { Serial.print("DMF313.IR"); delay(2000); } void BlinkLed2() { Serial.print("\n>>> "); delay(2000); } |
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); recommended
attachInterrupt(interrupt, ISR, mode); not recommended
که گفته به جایی این که تو تابع attachInterrupt به پارامتر اول تابع مستقیما بیاین و نام وقفه رو بدید، بهترین که از تابع digitalPinToInterrupt استفاده کنید که برای این کار به این تابع شماره پایه ای از میکرو که میخواین از اون وقفه استفاده کنید رو به این تابع میدید و این تابع رو هم تو پارامتر اول تابع attachInterrupt قرار میدید. (مثلا پایه X برد آردوینو مد نظر شما یه وقفه داره و شما میخواین از اون وقفه استفاده کنید، خب برای این کار شماره پایه که X هستش رو به تابع digitalPinToInterrupt میدید و این تابع رو هم داخل پارامتر اول تابع attachInterrupt قرار میدید.)
منبع : AttachInterrupt
خوب ۲ تا تابع زیر رو هم الان(۱۶ مرداد) اضافه میکنم، اول میخواستم تو یه مطلب جدا باشه، بعد نظرم عوض شد(دم دمی هم خودتی :-D)، با این ۲ تابع زیر که میخوام بگم کالا ما توی این مطلب ۴ تا تابع در رابطه با بحث وقفه گفتم، اینم همین جا بگم که جان داش تو عمل مدار رو ببندید و نه تو پروتئوس حالا از ما گفتن.(تو پروتئوس درست کار نمیکنه، پروتئوس چیز چرت و پرتی هستش در زمینه آردوینو، البته به پروتئوس ربطی نداره، این کتاب خونه آردوینو برا پروتئوس مشکل داره ) ، خوب دیگه داستان گفتن بسه بریم سر اصل مطلب :
این دو تابعی که دربارش حرف زدیم رو در زیر میبینید، این دو تابع رو ما جایی ازشون استفاده میکنیم که بخوایم مثلا یه سری از کدها بدون توجه به وقفه اجرا بشن(عمرا فهمیده باشین ) بذار بیشتر توضیح بدم؛ مثلا فک کنید شما یه سری کد دارین و میخواین تحت هر شرایطی اجرا بشن، والا من انگلیسیم زیاد خوب نیست ولی تا جایی که تو سایت آردوینو دیدم نوشته بود از این ۲ تا تابع برا کد هایی که حساس به زمان هستند استفاده میکنیم(حالا دوستانی که انگلیسیشون خوبه ممنون میشم برن سایت آردوینو و ترجمه کنن و بیان اینجا بگن تا ما و دوستان دیگه استفاده کنیم…دو تا لینک مقابل : interrupts و noInterrupts )
1 2 |
noInterrupts(); interrupts(); |
حالا طبق مثال سایت آردوینو کدهایی که بین ۲ تابع بالا باشن اجرا میشن(و کاری به وقفه وقفه ندارن)، و اگه در حین اجرای این کد ها وقفه رخ بده، برنامه وای میسته تا کدهای مورد نظر به طور کامل اجرا بشن و بعد کدهای تابع وقفه مورد نظر اجرا میشه….ok???
1 2 3 4 5 6 7 8 |
void setup() {} void loop() { noInterrupts(); // critical, time-sensitive code here interrupts(); // other code here } |
یه مثال در زیر میزارم و فیلم پروژه رو هم میزارم تا کاملا عملکرد این دو تابع آشنا بشین و ببینین که اگه از این ۲ تا تابع استفاده کنیم و نکنیم چی میشه و چه فرقی داره.
پروژه آردوینو
خوب اینم از کد های پروژه….که در فیلم پروژه میبینید که وقتی از همین کد استفاده میکنم، هر لحظه از اجرای پروژه وقفه نمیتونه رخ بده و باید وایبسته تا کد های داخل این دو تابع کاملا اجرا بشه و بعد وقفه رخ میده و LED روشن یا خاموش میشه .
ولی اگه اون دو تا تابع بالا رو در پروژه زیر به حالت توضیحات دربیارید و پروژه رو تست کنید میبینید که هر لحظه از از اجرای پروژه وقفه میتونه رخ بده.
فیلم پروژه رو ببینید بهتر متوجه میشید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <LiquidCrystal.h> LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 10); void setup() { lcd.begin(20, 4); pinMode(13, OUTPUT); digitalWrite(13, 0); attachInterrupt(0, BlinkLed1, RISING ); attachInterrupt(1, BlinkLed2, RISING ); } void loop() { noInterrupts(); for (int i = 0; i <= 10; i++) { lcd.setCursor(0, 0); lcd.print(i); lcd.print(" "); MyDelay(500); } interrupts(); } void MyDelay(int Delay) { for (int i = 0; i < Delay; i++) delayMicroseconds(1000); } void BlinkLed1() { digitalWrite(13, 1); } void BlinkLed2() { digitalWrite(13, 0); } |
اینم از شماتیک کد های پروژه بالا
فیلم پروژه بالا :
خوب این مطلب هم تموم شد خدا رو شکر…امیدوارم این مطلب براتون مفید بوده باشه و بدرتون بخوره و در ضمن هزینه استفاده از مطلب یادتون نره. (۳ تا صلوات برا شادی روح شهدا و امام شهدا و سلامتی رهبر و علمای اسلام و هر کسی که به کشور خدمت میکنه + دعا برا ظهور آقا)
راستی اینم بگم من چون احساس کردم همین قدر کافیه توضیح داده به همین خاطر به همین مقدار اکتفا کردم ، اگه فک میکنیم کم توضیح دادم یا جاییش رو نگفتم یا….بگید لطفا و سوال موالی هم بود بپرسید، ۱۰۰ تا سوال هم داشتین بپرسین……تک تکش رو تا جایی که بتونم جواب میدم.
فعلا یا علی.
مهمان
1 ) فرض کنید میکروکنترلر شما در حال اجرای برنامه اصلی ) Main Program ( میباشد. سپس یک وقفه
خارجی به سیستم وارد میشود )مانند فشردن یک کلی د( ، در این حالت میکروکنترلر شما برنامه اصلی را
متوقف کرده و تابع وقف ه ) ISR ( را اجرا م یکن د. اگر در حین اجرای تابع وقفه میکروکنترلر دوباره دچار
وقفه شود، عملکرد سیستم به چه صورت خواهد بود ؟ به طور کامل توضیح دهید .
2 ) اگر تعداد وقفههای تو در تو بیش از دو تا باشد، سیستم چه واکنشی از خود نشان م یده د؟ )در صورتی
که بیش از دو پایه به عنوا ن وقفه در میکروکنترلر شما وجود داشته باش
مسشه به این دو تا سوال پاسخ بدید
مهمان
سلام.تشکر فراوان
مهمان
سلام.
اون مقاومت ها رو چرا بستید؟ تو شماتیک مدار که چیزی نیست!
نویسنده این مطلب
سلام – کدوم مقاومت ها؟ به کدوم پایه ها وصله؟
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 موازی کلید قرار بده، مقدار مناسبشو با خطا و تست در عمل حساب کن.
مهمان
سپاس از راهنمایی های خوبتون
مهمان
سلام..استاد ی سوال داشتم .
میخواستم بدونم چطور باید در یک وقفه تاخیر ایجاد کنم.مثلا میخوام هروقت تابع وقفه اجرا شد.بعد یک ثانیه یک ال ایدی روشن بشه ..لطفا کمک کنید.خیلی به اینکار احتیاج دارم😭
نویسنده این مطلب
سلام
کد داخل تابع وقفه نباید توش از دیلای استفاده کرد – درست نیست.
شما هی متغییر تعریف کن که وقفه رخ داد، بیاد و متغییر فوق رو 1 کنه ( این کار داخل تابع وقفه انجام میشه )، بعد شما تو پروژت ( کدهای داخل حلقه while ) بگو اگه متغییر مد نظر 1 شد، 1 ثانیه دیلای بده، بعد led رو روشن کن، بعد متغییر فوق رو 0 کن.
مهمان
سلام مطالب سایت انقدر خوبه دل ادم میخواد همه رو بخونه !
مهمان
داش مهدی و همکاراش دستتون درد نکنه
خداخیرت بده
مهمان
با سلام
میخواستم بدونم با آردینو میشه کانتری ساخت که تعداد یک پالس رو تو زمان دودفیقه شمارش کنه
نویسنده این مطلب
سلام – تا جایی که خاطرمه باید بشه – برا اطمینان بیشتر دیتاشیت میکرو مد نظر – فصل تایمر/کانتر ها رو بررسی کن.
مهمان
با سلام وتشکر از راهنمایی شما. این جوری که من متوجه شدم توی دیتا شیت atmeg328pپایه های xtal1,2برای کلاک خارجی استفاده میشن که این پایه ها توی برد آردوینو گم میشن .چون میخوام پالس ورودی به عنوان کلاک خارجی بشه .بنظر شما آیا راه دیگری هم هست؟
نویسنده این مطلب
برد آردوینو این پایه ها رو کریستال 16 یا 20 زده ( خاطرم نی کدومش هستش ) – و در پایه های خروجی ارائه نداده.
پالس ورودی به عنوان کلاک خارجی بشه؟ دارید اشتباه میرید – تایمر/کانتر خودش پایه جدا برا تامین کلاک داشت تا جایی که خاطرمه – مطلب مربوط به تایمر/کانتر رو تو نت مطالعه کنید.
مهمان
این نویز تو وقفه من رو بیچاره کرده
به خاطر همین از وقفه استفاده نمی کنم
به جز موازی کردن خازن با کلید، چه راهی برای کاهش نویز هست؟
دستور دیبانس تو زیر برنامه وقفه غیر فعال میشه
از دیبانس خیلی خوب جواب گرفتم حیف که تو وقفه کار نمی کنه
شنیدم تو avr برای وقفه دستور دیبانس مخصوصی داریم
هعیییییی
نویسنده این مطلب
والا از رفع نویز زیاد اطلاعاتی ندارم ( خودم میخوام در این زمنیه مطالعه کنیم ) – چند روز پیش یه کتاب “تکنیک های کاهش نویز در سیستم های الکترونیکی” به درستم رسید – که اگه مشکلی پیش نیاد 2-3 هفته دیگه شروع به خوندنش میکنم.
مهمان
مهندس سلام
این تابع nointerrupt و interrupt چگونه عمل میکنن دقیقل؟
در ابتدا با nointerrupt تمام وقفه ها را غیر فعال میکنه که هیچ وقفه در اجرای کدهای آن مشکل ایجاد نکنه و در آخر interrupt میزاریم تا وقفه ها دوباره فعال شوند حالا در این بین اگر وقفه ای بیاید چه میشود؟
دوتا فرضیه وجود داره :
اینکه اگر وقفه ای آمد این وقفه بعد دستورات interrupt و nointerrupt اجرا میشه
یا
اصلا به کل وقفه آمده حذف میشود
خب به نظر شما کدوم یک درستره
نویسنده این مطلب
سلام-والا توابع داخلی این دو تابع رو بررسی نکردم ولی فیلم ته مطلبو میدی متوجه میشدی – وقفه ای بیاد تو این حین از بین نمیره – طبق پروژه ای که من تست کردم و فیلمشو گزاشتم – توضیحات خود سایت آردوینو درباره این دو تابع و بررسی کدای خود این دو تابع هم میتونه مفید باشه.-موفق باشید.
مهمان
با سلام و خسته نباشید
ارتباط بین آردوینو و متلب
مهمان
با سلام و خسته نباشید
ادامه ی اموزش اتصال اردوینو ومتلب بعد از نصب package ها از سایت متلب را کجا می تونم پیدا کنم؟؟
نویسنده این مطلب
سلام- تو سایتای خارجی سرچ کن – آموزششو پیدا میکنی.
مهمان
سلام.چطوری میتونم با اینتراپت خارجی جوری استافده کننم که فاصله میان دو چالس رو اندازه بگیره. به این صورت که وقتی مثلا سنسور ir در حالت off بود تا زمانی که دوباره On شد باید زمان رو حاسب کنه.دو دوباره زمانی که off شد تا on شدن بعدی بیاد زمان اون رو هم حساب کنه همینجور تا اخر
نویسنده این مطلب
سلام-خب از تایمر استفاده کن -از توابع millis میتونی استفاده کنی – اگه هم کارت خیلی دقیقه و این توابع دقیق نبودن – میتونی خودت رجیسترهای تایمرو مقدار دهی کنی و …
مهمان
سلام ایا میشه از کلید برای دوکار استفاده کرد ؟فرض کنید می خوام یک کلید هم نقش ورود به منو و هم خروج از اون رو داشته باشه چطور میشه همزمان که با زدن کلید اینتراپت اتفاق می افته بسته به محلی از برنامه که هست کار متفاوتی انجام بده؟ اگر نمیشه ممکن هست یه راهی پیشنهاد بدید؟ با تشکر
نویسنده این مطلب
سلام
تو قسمت کد نویسی این کارارو میکین دیگه
یه متغییر تعیین میکنی با نام مد فعلی
اگه تو منو بودی ازش خارج شو وگرنه واردش شو.
هر بار هم مقدار متغیر رو تغییر میدی.
مهمان
اجرت با امام زمان(عج) برادر
دست دردنکنه واقعا از مطالبت فیض میبریم.
یاعلی
مهمان
دوست عزیز
وقتی کلید رو فشار میدی اردینو همه کارش رو ول میکنه میره تابع وقفه رو انجام میده
توی پروژه شما چون توی تابع وقفه delay ندارید این مشخص نیست
مهمان
حاجی دمت گرم . مشکلمو حل کردی خدا مشکلتو حل کنه !
نویسنده این مطلب
حاجی کیه بابا
ما یه بار رفتیم کربلا – قسطاشو به بابامون ندادیم هنوز
مهمان
سلام من الان یک برنامه نوشتم که میزان یک بودن یک پایه رو اندازه میگیره بعد تعدادی ازش رو جمع میکنه و میانگین میگیره بعدش قراره روی سون سگمنت نمایش بده مشکل اینجاست که دیلی های داخل کتابخونه سون سگنت با اون برنامه تداخل میکنه و یک جویرایی برنامه خیلی بیش از حد طول میکشه میخوام ببینم برای اجرای موازی دو تا برنامه باید چیکار کنم
مهمان
بیا عاغا اینم نظر

انصافا خدا خیرت بده
مهمان
سلام مجدد مهندس.ببخشید میخواستم بدونم چرا دستور ()tone تو تابع وقفه اجرا نمیشه?؟
مهمان
سلام.خسته نباشید و همیشه شادو سلامت باشید.وقتی تابع وقفه اجرا میشه فقط یک خط دستور داخل تابع اجرا
میشه؟
نویسنده این مطلب
سلام.نه.تمام دستوراتش
مهمان
دلیل سوالم اینه که HIGH کردن یه پایه انجام میشه وخط بعدی که دستور tone هست داخل تابع وقفه اجرا نمیشه??
مهمان
سلام مجدد مهندس.ببخشید میخواستم بدونم چرا دستور ()tone تو تابع وقفه اجرا نمیشه?؟
مهمان
?
مهمان
بیزحمت اینو حذف کنید?
مهمان
سلام مهندس عزیز.مقاومت پول آپ رو کم انتخاب کنیم مثلا ۱k اشکال نداره؟ و کمترین مقدار مناسب برای مقاومت پول آپ چقدر است؟
مهمان
سلام.
میکرو ATMEGA48P تمام پایه هاش وقفه است.
مهمان
salam khaste nabashid ye soal dashtam mikhastam bedunam tuye mode hallati b qeir az inayi k gofTd vojud nadare
akhe man b intrrupt ehtiaj daram vali ye meqdar nois dare va motaqaiere man hey kamo ziad mishe
مهمان
خیلی با حالی
مهمان
سلام دوست عزیز!
من یه سنسور دارم که یه پایش به ۵ ولت وصله و یه پایه به A1 که پین آنالوگ هست. سوال من اینه که چجوری میشه پین آنالوگ رو وقفه شو فعال کرد. مرسی!
نویسنده این مطلب
سلام – باید با رجیستر کار کرده باشی – و از وقفه های ADC استفاده کنی و این که بررسی کن ببین همچین وقته ای که میخوای هستش یا نه – دیتاشیت رو بررسی کن.
مهمان
سلام من میخوام مسیر یاب بسازم
بردم هم مگا۲۵۶۰ هستش
میخواستم بدونم میشه برای دوتا از سنسور ها یه وقفه درست کنم؟
نویسنده این مطلب
سلام – یه چیزی تو این مایه ها.
attachInterrupt(0, blink, CHANGE);
attachInterrupt(1, blink, CHANGE);
مهمان
دمت گررررررم
هم برای مطالب آموزشی و هم از خط فکری سیاسی.
ایشالا شاهد نیروهای انقلابی بیشتری تو حوزه های مختلف برای رشد سرزمین ما
،ایران باشیم.
خدا قوت
مهمان
سلام
وقتتون رو زیاد نگیرم
من از وقفه اینتراپت زیر در شمارش پالس ورودی DUE استفاده میکنم ولی اعداد نمایشی سریال مانیتور مرتب نیستش.مثلا دو تا دو تا یا چند تا چند تا افزایش پیدا میکنن بعضی وقتها هم در اثر ورود پالس تغییر نمیکنن.
const byte ledPin = 13;
const byte interruptPin = 53;
unsigned long sCount =0;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
// attachInterrupt(interruptPin, blink, CHANGE);
}
void loop() {
// digitalWrite(ledPin, state);
Serial.println(sCount);
}
void blink() {
sCount++;
}
(البته مثل اینکه کدهای بالا درست وبا چیدمان صحیح برای شما ارسال نشدن ولی فکر کنم شما متوجه بشین.)
ولی همین پالسهای وارد شده با برنامه شمارنده کاملا مرتب و بدون اشکال شمرده میشن و توسریال مونیتور هم نمایش داده میشن.
من احساس میکنم نویز پذیری میکرو در حالت اینتراپت خیلی بیشتر از حالت شمارنده ساده هستش.
لطفا راهنمایی کنید.
با تشکر
نویسنده این مطلب
سلام-خازن موازی دکمه کن.
۲۰۰ نانویی چیزی
مهمان
سلام – میشه این پروژه رو ببندید هر کاری کردم در عمل انجام نمیشه. ممنون
void setup() {
pinMode(10 ,OUTPUT);
pinMode(7 ,OUTPUT);
attachInterrupt(digitalPinToInterrupt(2), BlinkLed, RISING );
}
void loop() {
digitalWrite(10, 0);
delay(500);
digitalWrite(10, 1);
delay(500);
}
void BlinkLed()
{
digitalWrite(7, 0);
delay(200);
digitalWrite(7, 1);
delay(300);
}
نویسنده این مطلب
سلام
مشکلی تو کد نمیبینم – شماتیک پروژت رو بده –
مهمان
نمونه ای
به خدا یه دونه ای
مهمان
salam.mesl hamishe aaaaaaaliiiiiiii
مهمان
به عبارت بهتر توضیح بفرمایید: “ایجاد وقفه روی تمام پین های ازاد اردوینو”
نویسنده این مطلب
این مورد تو میکروهای آرم من دیدم – و بعضی میکرو های aVR
مهمان
سلام. معمولا برای سنجش دور موتور و فن ها از اینتراپت استفاده میشه.
یه مسئله در مورد اینکه اگه ما مثلا ۱۲ فن داشته باشیم و بخواهیم دور موتور اونا رو مانیتور کنیم باید از ۲ اردو مگا استفاده بشه.
حالا ایا راهی هست که بشه این ۱۲ فن رو به مگا وصل کنیم و با دستورات پین های اینتراپت رو عوض کنیم؟
یه دستوری دیدم مرجع فارسی پیدا نکردم
میشه این توضیح رو به مطالب اضافه نمایید.
Pin Change Interrupt on Arduino
If you need more pins, or other physical pins, there is a mechanism to generate an interrupt when any pin is changed in one of the ports of 8 bits. You don’t know which single bit, but only which port. The example below generates an interrupt when one of the ADC0 to ADC5 pins (used as a digital input) is changed. In that case, the interrupt service routine ISR(PCINT1_vect) is called. In the routine you can figure out which of the specific pins within that port it has been.
First, the Pin Change Interrupt Enable flags have to be set in the PCICR register. These are bits PCIE0, PCIE1 and PCIE2 for the groups of pins PCINT7..0, PCINT14..8 and PCINT23..16 respectively. The individual pins can be enabled or dsiabled in the PCMSK0, PCMSK1 and PCMSK2 registers. In the Arduino circuit, in combination with the Atmel Atmega328 datasheet, you can figure out that the PCINT0 pin corresponds to pin 0 in port B (called PB0). This is pin 14 on the DIL version of the chip and digital pin 8 on the Arduino Uno. Another example is pin A0 on the Arduino board, which can be used as a digital input like in the example below. It is pin 23 on the Atmega328 (DIL version) which is called ADC0. The datasheet shows that it is PCINT8 which means it is part of PCINT14..8 and therefore enabled by the bit PCIE1 in PCICR.
void setup()
{
Serial.begin(9600);
Serial.println(“Boe”);
InitialiseIO();
InitialiseInterrupt();
}
void loop() {
/* Nothing to do: the program jumps automatically to Interrupt Service Routine “blink”
in case of a hardware interrupt */
}
void InitialiseIO(){
pinMode(A0, INPUT); // Pin A0 is input to which a switch is connected
digitalWrite(A0, HIGH); // Configure internal pull-up resistor
pinMode(A1, INPUT); // Pin A1 is input to which a switch is connected
digitalWrite(A1, HIGH); // Configure internal pull-up resistor
pinMode(A2, INPUT); // Pin A2 is input to which a switch is connected
digitalWrite(A2, HIGH); // Configure internal pull-up resistor
}
void InitialiseInterrupt(){
cli(); // switch interrupts off while messing with their settings
PCICR =0x02; // Enable PCINT1 interrupt
PCMSK1 = 0b00000111;
sei(); // turn interrupts back on
}
ISR(PCINT1_vect) { // Interrupt service routine. Every single PCINT8..14 (=ADC0..5) change
// will generate an interrupt: but this will always be the same interrupt routine
if (digitalRead(A0)==0) Serial.println(“A0”);
if (digitalRead(A1)==0) Serial.println(“A1”);
if (digitalRead(A2)==0) Serial.println(“A2”);
}
اینم ادرسش
http://www.geertlangereis.nl/Electronics/Pin_Change_Interrupts/PinChange_en.html
مهمان
یه دونه باشی. مطالب عالین
مهمان
سلام
سایتتون در زمینه آموزش الکترونیک عملی عالیه. من که هروقت دنبال مطلبی می گردم معمولا تو سایت شما پیدا می کنم
خسته نباشید
مهمان
سلام خط 30 تا 33 رو نفهمیدم میشه توضیح بدی
نویسنده این مطلب
سلام
MyDelay : تابع ساخت زمان میلی ثانیه.
مهمان
سلام.من یک ماژول rfid دارم که به esp وصلش کردم و با esp یک وب سرور راه انداری کردم بطوریکه با نزدیک کردن کارت به ماژول rfid شماره کارت برای وب ارسال میشه و نمایش داده میشه.اما دوتا مشکل دارم:
1-با هر بار نزدیک کردن کارت به ماژول و رفرش صفحه وب شماره کارت قبلی که در وب نمایش داده میشد پاک میشه و شماره کارت جدید نشون داده میشه،من میخام شماره کارت قبلی پاک نشه و شماره کارت جدید اضافه بشه.
2-میخام هر بار که کارت رو به ماژول rfid نزدیک میکنم و ماژول شماره کارت رو به esp ارسال میکنه،صفحه وب که شماره کارتو نشون میده خود بخود رفرش بشه و نیاز به رفرش دستی نباشه.
لطفا راهنماییم کنید.با تشکر.
نویسنده این مطلب
سلام
والا با ماژول وای فای کار نکردم
مهمان
سلام.من میخوام ی کلیدو روی کیپد بزنم واگه ب مدت 2 دقیقه کلید دگ ای زده نشد ی آلارم بده دستگاهم ولی اگه تو این مدت دو دقیقه ای ی کلید دگ زده شد آلارم دگ روشن نشه . با اینتراپت چ جوری بنویسم.اصن میشه نوشت؟؟؟؟؟
نویسنده این مطلب
سلام-تایمر هم لازم داره
مهمان
سلام
ی سوال خیلی مهم
میخوام با یک دسته ی بازی یک ربات رو کنترل کنم از طریق دو تا آردوینو که با هم ارتباط بی سیم دارند (از ماژول های زیگ بی استفاده کردم) برای ارتباط دسته با آردوینوی اول آیا میشه یو اس بی دسته رو به یو اس بی آردوینو وصل کرد و داده فرستاد ینی منظورم اینه که از طریق یو اس بی میشه داده فرستاد کلا…… اگه هست از چه کتابخونه ای و چه تابعی. ممنون میشم
نویسنده این مطلب
سلام
نمیدونم ولی فک نکنم بشه چون USB میکرو به آی سی FTD232RL وصل هسشت – حالا باز شماتیک میکروت رو ببین – و اون پروتکول کاری اون دسته بازی مد نظرت
مهمان
سپاس سپاس سپاس! خیلی کارتون درسته .
مهمان
سلام اردویینو هم مثل کدویژن کدویزارد داره؟؟؟؟
نویسنده این مطلب
سلام
نه – چون اصلا با دیچستر ها کاری نداری
مهمان
سلام دمتون گرم سایتتون عالیه
تواین پروژه کاربرد تابعmydelayرو نفهمیدم اگه میشه توضیح بدین چرا همون delay خودمون رو نزاشتید
نویسنده این مطلب
سلام
از delayMicroseconds استفاده شده جون دیلای میلی مشکل ایجاد میکنه تو وقفه
مهمان
دمت گرم عالی بود
مهمان
سلام من تو یه پروژه از دوتا SRF05 و یک ال سی دی و یه موتور و فتوسل و لامپ استفاده کردم وقتی دوتا SRF05 و ال سی دی فقط کار میکنن مشکلی وجود نداره ولی وقتی لامپ رو با رله ویا موتور رو با درایور جریان به آردویینو وصل می کنم روی ال سی دی چرت و پرت نشون میده چیکار کنم این اتفاق نیفته ؟
برای تغذیه درایور جریان و SRF05 و موتور و لامپ هم از یه آداپتور5 ولت استفاده کردم (شارژر گوشیم) فکر کنم تا 1000 میلی آمپر هم تحمل میکنه.
در ضمن چرا ایمیل میزنیم جواب نمیدید؟
مهمان
سلام دوباره
چرا delay تو تابع وقفه اجرا نمیشه؟
نویسنده این مطلب
سلام
دلیلش رو نمیدونم، اگه فهمیدی به ما هم بگو، لینک زیر رو ببین
چرا delay تو تابع وقفه اجرا نمیشه؟
مهمان
سلام
اگه میکرو وسط برنامه باشه حالا یه وقفه رخ بده و انجام بشه برنامه ادامه کارشو میکنه یا از اول حلقه لوپ اجرا میشه؟
نویسنده این مطلب
سلام
تا جایی که من میدونم مورد 1
مهمان
سلام دادا.خدا قوت
ببخشید سوالم یه مقدار بی ربطه(ندونستم کجا مطرحش کنم).بنده می خوام یه آردوینو(یونو یا نانو) که بهش ماژول nrf24l01 هم متصله و هر موقع وقفه خارجی فعال بشه یه دیتایی رو ارسال میکنه تغذیه کنم ( کل مدارم هم همینه).با فرض اینکه مدار24ساعته فعال باشه چند روز با باتری دووم میاره؟ترجیحم اینه که سراغ برق شهر نرم.
باتشکر فراوان اگر لطف کنی جوابشو ایمیل کنید هم خیلی عالی میشه.
مهمان
سلام
ببخشید داشتم تو نظرات می خوندم دیدم که قرار بوده جلسه بعدی راجع به 2تا تابع دیگه اینتراپت باشه.
میشه یه لطفی کنید همین جا راجع بشون توضیح کامل بدین؟ plzzzzzz
نویسنده این مطلب
سلام
قبلا به همین مطلب اضافه کردمشون
مهمان
سلام برادر
من این وقفه رو روی uno درست انجام میدم ولی روی due جواب نمیده…سنسور srf05 ک منبعش 5ولت ه.
چ کنیم؟
نویسنده این مطلب
سلام
آردوینو due تمام پایه هاش وقفه میتونن باشن – نمیدونم چرا جواب نمیده
گوگل
مهمان
سلام
ببخشید من یک سوال دارم که خیلی ربطی به این بخش نداره.
چطور میشه از تایمر کانتر در اردوینو استفاده کرد یعنی برای همین برد uno من میخوام با ide اردوینو برنامه ای بنویسم که مخصوصا از کانتر به صورت مستقیم استفاده کنم. دقیقتر بگم یه کانتر می خوام که با کلاک خارجی و حساس به لبه increament بشه.
نویسنده این مطلب
سلام
خب همینو میتونید با وقفه هم درست کنید – و وقفه مد نظرتون رو تعریف کنید و نوح حساستش رو هم همنین طور و بعد داخل تابع وقفه بیاید و ….
ولی اگه حتما میخواین از تایمر استفاده کنید میتونید مطلب زیر رو بخونید
http://playground.arduino.cc/Code/Timer1
مهمان
اقا ی سوال
گفتی برا interrupt میشه اسم نزاشت . اونوقت دستوراتمونو کجا مینویسیم ی توضیح میدی
نویسنده این مطلب
کدوم خط اینو دقیقا گفتم؟ بگو تا تصحیح کنم
هر نامی میشه گزاشت….احتمالا منظورم این بوده.
این که اسم نزاشت…..این اشتباهه
مهمان
عالی عالی جالی قلی خالی
مهمان
نظر ندی یه وقت…گناه میشه
مهمان
خدا خیرت بده داداش
مهمان
اها…..
مرسی
مهمان
باز یه سوال دیگه….ببخشید مبتدی ام دیگه
اون روشی که خودم گفتم هم قابل انجامه؟؟؟؟
یا بهتر بپرسم میشه چند تا میکرو رو به آردوینو وصل کرد؟
نویسنده این مطلب
همون اول اینو گفتم که
تا جایی که من میدونم میشه
ولی برا پروژه شما که صنعتی هستش فک نکنم این کار اقتصادی باشه
مهمان
خیلی ممنون
مهمان
دم شما گرم الان میرم میخونم .،..
آقا حالا یه سوال دیگه غیر از سریال راه دیگه ای برای ارتباط دوتا آردوینو یا آردوینو و میکرو هست؟
نویسنده این مطلب
بله
مثلا spi
که آموزشش رو به زودی میزارم
مهمان
آقا سلامٌ علیکم
اول اینکه دمت گرم سایتت خیلی خوبه شخصا خیلی ازت ممنونم ….
دوم اینکه آقا مسالهُ…
من میخوام خروجی تعداد زیادی سنسور رو از جمله التراسونیک و دما و نور رو با یه پردازنده مرکزی پردازش و براساس اون یه سری رله ها رو روشن و خاموش کنم (یه سیستم ساده کنترلیه) در حال حاضر یه آردوینو نانو دارم و پورت کم میارم !!!!!
به نظر شما چه جوری میتونم این کارو بکنم ؟
خودم مد نظرم اینه که هر سری سنسور با کارکرد مشابه (مثلا تمام سنسورهای فاصله سنج) رو با یه میکرو راه بندازم و بعد از طریق اون میکرو اطلاعات رو به آردوینو بدم (به این منظور که پورتهای کمتری از آردوینو اشغال بشه) که یه جورایی طراحی ماژولار میشه !!!!اما اینم بلد نیستم O_O
حالا شما میتونی راهنماییم کنی؟
نویسنده این مطلب
سلام
والا بسته به سنسورتون داره…
مثلا برا سنسور های aDC میشه از آی سی های کسترش دهنده استفاده رد که آموزششون تو سایت هم هستش
ولی اگه خیلی خیلی پایه کم میاریم و حتما باس از NANO استفاده کنید میتونید از ۲ تا نانو استفاده کنید و بینشون ارتباط برقرار کنید.
رله ها رو هم همینطور…مثل سنسور های aDC …. میشه از آی سی های کسترش دهنده استفاده کرد که تو تابلو روان(وطالبش تو سایت هستش) ازش استفاده کردم و میتونید برید بخونید
امری بود در خدمتیم
مهمان
سلام
میشه یک مثال ه راجع به تابع detachInterrupt بنویسید.
نویسنده این مطلب
https://www.arduino.cc/en/Reference/Interrupts
مهمان
سلام
دستتون درد نکنه
میشه لطفا جلسه بعدی رو زودتر بذارید؟
من خیلی لازم دارم که در مورد توابع
NoInterrupts();
Interrupts();
بدونم.
نویسنده این مطلب
سلام
یه چیز تو مایه های
غیر فعال کردن لحظه ای(برای اجرای کد های خاص) و فعال کردن
اگه وسط اجرای کد های خاص وقفه رخ بده وای میسته برنامه تا کد های خاص تموم بشه کارشون و بعد کد های تابع وقفه اجرا میشه
OK?
نویسنده این مطلب
جلسه بعدی با وقفه؟
مهمان
واقعا مطالب سایتتون عالیه
مهمان
سلام

آقای دمر چیلو منتظره بقیه جلساتتون هم هستیم.
کی میزارین ان شا الله؟
ممنون بابت همه توضیحاته سرجمع و جامع و روانتون.
نویسنده این مطلب
سلام

اینترنت ندارم….تحریم شدم
مجبورم قاچاقی اینترنت استفاده کنم
مهمان
salam
ye soal dashtam
mikhastam bebinam ba arduino chetori mishe ke ye adado too lcd chap kard
yani manzooram iine ba codevision az tabe itoa az ketabkhoone stdlib.h estefade mikonim
too arduino bayad az chi estefade konim
نویسنده این مطلب
سلام
تو مطلب lcd با arduino توضیح دادم
مهمان
دستتون درد نکنه
مهمان
سلام
مثل همیشه عالی
یه سوال داشتم میخواستم بدونم تابع های
noInterrupts();
interrupts();
ربطی به اینتراپت خارجی دارن؟
یا اگه نه این ۲تا تابع رو یه توضیح بدید
ممنون
نویسنده این مطلب
سلام
جلسه بعد توضیحشون میدم.
مهمان
دم شما گرم
مهمان
مرسی / مفید بود / تشکر
مهمان
سلام
در بردهای نانو کدام پایه ها وقفه هستند؟
ممنون
نویسنده این مطلب
سلام
در سایت آردوینو چیزی ذکر نکرده بودن ولی میتونی میکروی روی برد نانو که فک کنم باس ۱۶۸-mega328 باشه رو نگاه کنی
ولی یه سرچی که کردم مثل این که مثل uno هستش….پایه ۲ و ۳
خواستی لینک زیر رو ببین…شاید اشتب کرده باشم
http://playground.arduino.cc/Code/Interrupts
مهمان
سلام و خسته نباشید بنده یک مدار دیمر دیجیتال با آردوینو نانو درست کردم اما به هیچ وجه کار نمیده
مدار و دستورات آردوینو هم از این سایت گرفتم
***
لطفا اگه این مدار یا دستورات و یا برد آردوینویی که انتخاب کردم مشکل داره بهم بگید تا مشکلش را برطرف کنم ممنونم از سایت خوب و عالیتون…