.:: نویز | آموزش AVR | میکروکنترلر | الکترونیک ::.

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

.:: نویز | آموزش AVR | میکروکنترلر | الکترونیک ::.

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

" نویز رسانه ای است برای آموزش آسان مفاهیم میکروکنترلر و الکترونیک "

دریافت مستندات
آخرین نظرات
  • ۱۵ آبان ۹۵، ۱۸:۵۸ - الهام
    ممنون

معرفی وقفه در میکروکنترلرهای AVR ؟ [15]

پنجشنبه, ۵ دی ۱۳۹۲، ۰۴:۱۲ ب.ظ

 

این بار با مطلبی تحت عنوان "معرفی وقفه در میکروکنترلرهای AVR" در خدمتتون هستم.

 

پس با ما در ادامه مطلب همراه باشید ...

 

به نام خدا

سلامی دوباره به همراهان همیشه ناهمراه !

چطورید دوستان ؟!

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

 

 

امروز میخوام راجع به وقفه یا Interrupt صحبت کنم !

دقت کنید که تنها در حد آشنایی و معرفی با وقفه آشنا میشید و در این قسمت از آموزش از بیان جزئیات خودداری میکنم و تنها هدفم از نوشتن این بخش از آموزش اینه که اگه یه جا گفتم "وقفه" نگرخید !!!

 

اگه کلمه interrupt رو داخل دیکشنری معادل فارسیشو ببینید با عباراتی نظیر :

قطع کردن،گسیختن،کلام کسی را قطع کردن،منقطع کردن و ...   روبرو خواهید شد.

 

اما اینجا منظور از interrupt دقیقا چیه ؟

 

وقفه مکانیزمی است که میکروکنترلر را برای پاسخگویی به برخی وقایع لحظه ای فعال میکند.(این تعریف کتابیش بود !)

 

مکانیزم :

 

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

 

مراحل اجرای یک وقفه ؛
 

پس از آنکه میکروکنترلر درخواست وقفه را دریافت کرد مراحل زیر انجام میشود :

1.به دستوری که در حال اجرای آن باشد پایان میدهد و آدرس دستورالعمل بعدی را در فضایی به نام پُشته (Stack) ذخیره میکند.

2.به جدول بردار وقفه مراجعه میکند،آدرس سرویس وقفه (ISR) را پیدا میکند،به آدرس بدست آمده پرش میکند.

3.زیربرنامه وقفه رو اجرا میکند.

4.آدرسی را که در پشته ذخیره کرده بود را برداشته و اجرای ادامه برنامه را از سر میگیرد.

 

بردار وقفه : هنگام رخدادن وقفه،آدرسی که در شمارنده برنامه قرار میگیرد رو بردار وقفه مینامند.

 

پُشته (Stack) چیست ؟

 

قسمتی از حافظه داده SRAM است که برای اجرای برنامه وقفه مورد نیاز است.

در واقع این بخش یک جزئی از SRAM هست که یه سری دستورات جهت فراخوانی میکرو و علی الخصوص وقفه رو در خودش ذخیره میکنه ! اینو دیگه همه در جریانش هستید که RAM چکنویس (چرکنویس!) میکرو است.(اینو گفتم که فقط گفته باشم ! cool)

 

اما تعریف خودمونیش (یجور بگم کَف بُر بشید !!!) yes :

مثال :

 

فرض کنید نشستید پای کامپیوتر و مشغول تایپ کردن متنی از روی کتاب هستید.مثلا یه تحقیق میخواین تحویل استادتون بدید و میخواین 5 صفحه شو از کتاب کُپ بزنید.میاین و کتاب رو میزارید جلوتون و شروع میکنید به تایپ کردن !

در حالیکه 2 صفحه و 3 خط از کتاب رو تایپ کردید،ناگهان مادر گرامیتون صداتون میزنه که پسرم (یا دخترمcheeky) بفرما که ناهار حاضره !

شما هم از فرط گشنگی ! نوشتن ادامه تحقیق رو بی خیال میشید و تا اونجایی که تایپ کردید رو علامت میزنید و مثل موشک خودتون رو به غذا میرسونید و پس از صرف نهار میاین سراغ کامپیوتر و شروع میکنید از خط 4 صفحه 3 (ادامش !) تایپ کردن !!!

 

این ساده ترین و کاملترین مثالی هست که میشه در مورد وقفه زد !

 

تحلیل مثال بالا با مراحل انجام وقفه که براتون بالاتر گفتم ! :

 

*شما در حال تایپ کردن هستید. ==> در حال انجام کار عادی خود

*مادر گرامی شما رو صدا میزنند. ==> درخواست وقفه (صدا زدن)

*توقف عملیات تایپ کردن. ==> متوقف شدن کار و ذخیره دستورالعمل بعدی (1)

*به سمت محل صرف غدا میروید. ==> رجوع به آدرس وقفه (2)

*شروع به غذا خوردن میکنید. ==> انجام برنامه وقفه (غذا خوردن) (3)

*بر میگردید و ادامه تایپتون رو انجام میدید. ==> بازگشت به محل قبلی و ادامه فعالیت (4)

 

تصویر بالا دقیقا همون حرفهایی که زدم رو داره بیان میکنه.

برنامه در حال اجراست،ناگهان وقفه درخواست میشه،میکروکنترلر به جدول بردار وقفه مراجعه میکنه(1)،آدرس زیرروال وقفه رو پیدا میکنه و پرش میکنه به اون آدرس(2)،پس از اینکه برنامه وقفه اجرا شد مجددا به برنامه اصلی برمیگرده (3).

 

دیاگرام پایین هم همین مسئله رو با یه چشم دیگه نگاه میکنه !

 

 

 

حالا یه عده میان میگن :" آقا قبول،توضیحاتم جامع بود و با مثال برامون جا انداختی وقفه رو.اما ما آخرش نفهمیدیم این وقفه به چه درد میخوره و اصلا کجا باید ازش استفاده کرد.اصلا استفاده نکنیم ازش چی میشه ؟! "

 

اما پاسخ من چیه ؟!

من هم بهشون میگم : " یکم گردو و ماهی بخورید ! (فسفر داره برای مغزتون خوبه !!!)  خخخخخخخخخخخخ laughcheekycool "

اما جدا از شوخی و بی مزه بازی و مسخره کردن دیگران،این سوال،سوال بجاییه !

 

بهتره که یه مطلبی رو حاشیه وار توضیح بدم ؛

 

پردازنده ها برای اینکه از رویدادهای داخلی و خارجی مطلع بشند از دو روش میتونند استفاده کنند :

 

روش اول ؛ روش سرکشی یا polling :

 

در این روش با استفاده از برنامه نویسی،یه فواصل زمانی دلخواه رو معین میکنیم و بصورت متناوب دائم رویداد مورد نظرمون چک میشه که آیا اتفاق افتاده یا نه ! (اونایی که برنامه نویسی کردند،بهتر متوجه شدند من چی میگم !)

 

 

فرض کنید میخواین چک کنید ببینید فلان کلیدی(سوئیچ) که به میکرو وصل کردید آیا در وضعیت باز(0) است یا بسته(1) ؟

چیکار میکردید ؟ میومدین یه شرط میذاشتن که هر چند میکروثانیه یه بار (بعضی وقت ها هم کاری به تعریف مدت زمان نداشتیم !) چک کن ببین وضعیت 0 هست یا 1 ؟!

خب اینکار اگرچه برای یه برنامه 10 خطی جوابگو هست و کار راه بنداز.

اما اگه برنامه 2000 خطی شد با 10 تا حلقه تو در تو،اون موقع آیا میشه دائم یه شرط رو بررسی کرد ؟

بر فرض هم که بشه (که نمیشه معمولا !)،اینجوری که پدر پردازنده در میاد !!!!!!

تو این حالت CPU دائم در حال تکاپو و چک کردن شروط شما میشه و در بعضی مواقع سرعت اجرای دستورات کم میشه و خلاصه اشک خودتون و پردازنده رو با این ندونم کاری در میارید !

 

مثل این میمونه که برق خونتون قطع باشه ، بعد منتظر یه نفر باشید،هی 30 ثانیه یه بار برید از پنجره تو کوچه رو نگاه کنید که نکنه یه وقت اون شخص بیاد و زنگ رو بزنه من متوجه نشم و عصبانی برگرده و اصلا بهم بزنه و ... cheeky ! ==> آیا روانی نخواهید شد ؟!

 

روش دوم ؛ روش وقفه یا interrupt :

 

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

یا تو اون مثال میشه اینجوری گفت که هر وقت اون شخص مورد نظر اومد زنگ رو میزنه،دیگه نیاز دائم جلو پنجره تو کوچه رو دید بزنیم !

(نکته اخلاقی : تو کوچه رو دید نزنید،زشته !!! وگرنه میان تو کوچتونو دید میزننا ! ههه surpriselaugh )

 

حالا خودتون بگید،وقفه بدرد میخوره یا نمیخوره !؟

 

واحد وقفه هم مثل بقیه بخش های میکروکنترلر،تنظیمات و پیکربندی ها و رجیستر های خاص خودشو داره که انشاالله در آینده و در پستی جداگانه و مفصل راجع به نحوه پیکربندی و رجیسترهای وقفه توضیح خواهم داد.

 

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

 

 

7.فلگ "I" یا همون "Interupt Flag" از رجیستر SREG:

این فلگ مجوز صدور وقفه را صادر میکند.

هرگاه قرار باشه وقفه ای رخ بده،بعد از اینکه دستور اجرای وقفه صادر شد میکرو چک میکنه که آیا اصلا اجازه داره اون وقفه رو عملیاتی کنه یا نه ؟!

با "یک" شدن این پرچم،مجوز صادر میشود و پس از اجرای وقفه مجددا "صفر" میشود.

 

خب ...

فکر کنم که دیگه همه به خوبی با وقفه آشنایی پیدا کردند.

اگر عمری بود مطالب رو ادامه خواهیم داد.

 

پس فعلا ...

بازم سلام...واقعا دست مریزاد خیلی خلاصه بود اما در کل خیلی خوب بود و جای کار بیشتر و کامل شدن داره.
آقا ما پای ثابت وبلاگت شدیم، نمک گیر شدیم دیگه چه میشه کرد! نوشتهات روونه و در عین کوتاهی لپ کلامو میرسونه شاید به این دلیل باشه که مثل هیچکس دیگری نمینویسی مثلا استفاده از طنز مابین جملاتت یکنواختی رو دور کرده فقط من یکی در مورد این فایل رجیستر SREG دچار گ. گیجه شدم که باید برم و یک مقداری مطالعه کنم.  راستی مبادا که از درسا یک موقع خدای نکرده غافل بشی، (خودم یازدهم امتحان مدار منطقی دارم هنوز لاشم وا نکردم :-( )، درسارو خوب بخون و به نوشتن ادامه بده راستی در مورد وبلاگم ای کاش تو این بخش نظرات یک بخش انتخاب شکلکی وجود داشت واقعا خیلی لازمه وجودش. برای اضافه شدن وبلاگ به لیست تارنمای پیوند ها تبریک میگم (هرچند خودم میانه چندان خوبی باهاش ندارم!!!) اما این بازم خودش یک گام مثبت و روبه جلوییه برای وبلاگ.
 اون کتاب پرتوی فر هم بله درسته واقعا کتاب خوبیه اما برای کسی که یک سررشته ای از مباحث داشته باشه مثلا برای همین وقفه یا تایمر وقتی دانشجویی ندونه اصلا به چه دردی میخوره و استفادش در کجا و چه زمانیه دانستن مطالب فنی و آشنایی با فایل رجیسترها و نحوه نغییر دادن و مقدار اولیه دادنشون زیاد دردی رو دوا نمیکنه. به همین جهته که من جذب وبلاگ شما شدم چونکه یک دید کلی ای از موضوع بهم میده و مطالبش کمک میکنه به پیدایش یک بینش اولیه ای از مباحث اولیه و بعضا بحضی محاسبات.
راستی اینجا (تو خوابگاه) اهم اتاقیهام از نوشتهات استفاده کردند و الان دارن سلام میرسونند.
به امید روزی که خودمون بتونیم تو کشورمون تولید سخت افزار و میکرو کنترلر داشته باشیم (یعنی میشه؟؟)
پاسخ:
سلام
والا من سعی خودم رو کردم تاجاییکه بشه روون و آسون توضیح بدم.
یه مقدار هم بد نیست خودتون پیگیر قضیه باشید،مثلا دیتاشیت بخونید یا از گوگل استفاده کنید برای پیدا کردن مطالب بیشتر !
درسا رو هم ایشالا میخونیم.
شکلک ها هم دست من نیست وگرنه اونا رو هم اوکی میکردم.
راستی شما از کدوم دانشگاهید؟بچه کجایید ؟
سلام منو هم برسونید خدمت دوستانتون !
ایشالا که ما هم بزنیم تو گوش هرچی انحصار طلبیه !!!

موفق باشید.
راستی این وقفه سراسری رو من هیچ رقمه نفهمیدم که چیه اینو یکم اگه وقت داشتی توضیح بده. ممنون.
پاسخ:
بزار اینجوری توضیح بدم که "وقفه سراسری" نداریم ما "مجوز وقفه سراسری" داریم.
در رجیستر SREG ما یک فلگی داریم با نام I.
این فلگ مثل یک فیوز مینیاتوری هست که سر راه کنتور خونه میزاریم !
تا وقتی قطع باشه هیچ وقفه ای صورت نخواهد پذیرفت !
و با وصل بودنش وقفه ها اجازه دارند که اجرا بشند.
کلا چیز پیچیده و خاصی نیست.
در مبحث کد نویسی خواهیم گفت که با دستورات sei و cli این مجوز را صادر یا باطل میکنیم !

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

ممنون.

سلام برار

مه بچه خرمووام

خدا وکیلی قبلا کتابای زیادی خونده بودم و بعضی مطالبو هنوز نگرفتم ولی دم شما گرم که خیلی راحت مطالبو میگین.

من خیلی دوست دارم با هم دوس شیم،چاکریم.


پاسخ:
به تلاش برای یادگیری ادامه بدید.
موفق باشید.
ممنون آقا احسان.
خدا قوت
با سلام
برنامه ساعت و تاریخ قابل تنظیم را به شکل زیر می خواهم
1_ با هر با فشردن کلید int0 تنظیم ساعت دقیقه ثانیه سال ماه و روز میسر شود
2_ با زده شدن کلید int1 افزایش و با زده شدن کلید int2 کاهش انجام گیرد
پاسخ:
سلام
ممنون از اینکه نظر دادید.
اما سوالتون در حوزه مباحث آموزشی وبلاگ نیست.
خواهشا سوالاتتون رو در انجمن های برق موجود در اینترنت بپرسید تا بهتر جواب بگیرید.

با تشکر
با سلام
تابع وقفه دقیقا بعد از چه دستوری اجرا میشه.ایا بعد از دستورasm# اجرا میشه یا مثلا بعد از فعال کردن وقفه سرریز(یابهت بگم بعد از تابع ا صلی چجوری فرا خونده میشه)
پاسخ:
سوالتون واضح نیست.
با دستورات اسمبلی sei و  cli تنها فلگ I از رجیستر SREG فعال و غیرفعال میشود.
تاز مانی که فلگ I فعال نباشد هیچ وقفه ای مجوز رخداد ندارد.

منظورتون از تابع وقفه چیه ؟!
آقا من مدیونتونم ، بهترین و متعادل ترین توضیحی بود که تا به حال دیده بودم ، واقعا دمتون گرم ، خسته نباشید
پاسخ:
چاکرم ...
بقیه درست توضیح نمیدند وگرنه من حرف خاصی نزدم !!!
likeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

دستت در نکنه.باید بگم که نحوه بیانت عالیه خیلی قشنگ توضیح دادی
like
خیلی عالی بود
خسته نباشی

سلام

واقعا ابو علی سینا هستی

پاسخ:
جاااااااااااااااااااااااااااان ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

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

خیلی خوب درس دادی. واقعا اگه بگم عالی بازم کمه

فعلا فقط قسمت وقفه رو خوندم 

حتما اون یکی قسمتها رو هم انشاالله میخونم

تشکر

پاسخ:
شما لطف دارید.

موفق باشید.

سلام

اجازه میدید از مطالبتون با ذکر منبع استفاده کنم؟

پاسخ:
شما منبع رو بنویسید،ما هم راضی هستیم.
راستی آدرس سایت یا وبلاگتون رو هم بهم بگید.

ممنون

سلام

چشم

اما فعلا  درستش نکردم

چند وقتی میشه همه کارهای عملیم رو  که حدود 10 تایی میشه یکی یکی با توضیحات و فایل کدویژن و پروتئوس ذخیره کردم و میخوام برای استفاده تو وبلاگ بزارم

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

سلام اقای احسان نوری
       اقا دمت جیز (خیلی گرم)خوب بود.
پاسخ:
مرسی

سلام

ممنون از وقتی که برای نوشتن و آموزش  قرار میدین واقعا مطالب رو ساده میگین 

امیدوارم همیشه تو همه مراحل زندگی موفق باشین.

پاسخ:
mer30
دستت در نکنه.باید بگم که نحوه بیانت عالیه خیلی قشنگ توضیح دادی


داداش کارت درسته
از مطلب های مفید و روانی که گذاشتی تشکر میکنم.
یک در دنیا و 100 در آخرت جوابشو بگیری.

پاسخ:
ممنونم.
خداییش استاد ما این قدر خوب درس نمیده که شما الان داری درس میدی!!!
دمت گرم دادا

پاسخ:
مرسی
اقا خیلی دمت گرم
من اینو به رفقام هم گفتم بریزن ایجا کامنت بزارن و حسابی حال کنن
آ خدا وکیلی لایک داری وولک

از طرف بکس بهمنشیر
پاسخ:
چاکریییییییییییییییییییییییییییییییم !!!!
عالی بود.سپاس
پاسخ:
مخلصییییم
خیییییییییییلی عالی بود
دستت دردنکنه داداش روشن شدم
پاسخ:
ممنون
۲۰ بهمن ۹۳ ، ۱۴:۲۲ علی اکبر صالحه
ممنون 
خیلی خوب بود
پاسخ:
خواهش ...
سلام مرسی حرف نداشت

پاسخ:
سپاس
مثل همیشه خوب بود...
به ترتیب دارم میرم جلو  ... ((:
پاسخ:
آفرین !
interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here timer0_ov++; } ///////////////////////////////////////////////////////// while (1) { TCCR0=0x06; #asm("sei") delay_ms(50); #asm("cli") in_freq=20*(timer0_ov*256+TCNT0); //delay_ms(250); TCCR0=0x00; timer0_ov=0; TCNT0=0; humidity=(-0.075872)*(in_freq-7351); //////////////////////////////////////////////////////// } مهندس جان سلام دستم به دامنت این یه تیکه اصلی از برنامه راه اندازی سنسور رطوب هستش. من این تیکه که وقفه رو فعال کرده و تاخیر گذاشته و وقفه رو قیر فعال کرده رو نمیفهمم اینجای برنامه چی میشه که یر یک سانیه داره فرکانس ورودی رو میشموره اگه لطف کنی توضیح بدی واسم خیلی ازت ممنونم. منتظرتم مهندس جان یا حق
پاسخ:
سوال موردی نپرسید !

سلام وقتتون بخیر

من همیشه ادعا می کردم AVR رو خیلی خوب بلدم و تصادفا به وبلاگتون اومدم....  شروع کردم به خوندن، و چون مقدمه جذابی داشت، تا آخرش خوندم و یه سری مطالب برام ملموس تر شد. خیلی ممنون... بسیار عالی بود.
سلام دوست عزیز
من رستم کامپیوتر ب.د اما علاقه زیادی ب برف و طراحی مدارد دارم (البته رشتم نرم افزار بود) الان چهار سال بعد مدرک لیسانسم دانشگاه و درسو ول کردم چون میخاستم ی سری اطلاعات از مدار و این چیزا داشته باشم به گوگل رفتم این بود که به وبلاگ شما اومدم مطالبتو خوب بود
شما اگ سایت و وبلاگی مد نظر دارید که منو تو این زمینه ها کمک کنه ممنون میشم کمکم کنید
تشکر
کارت حرف نداره، توضیحاتت عالیه. اما همچنان معتقدم باید از مثالهای بیشتری استفاده کنی.
برگرد به وبلاگت
خیلی خیلی خیلی عالی بود 
ممنون
کلامت روان
مثال ها عالی
بحث اصلا از استرس دور
کتاب کاهه رو میخوندم و روی برنامه هاشکار میکردم فرکانس متر رو درک نمیکردم
با خوندن مطالب شما کاملا گرفتم چی ب چیه
اما
افسوس
و صد افسوس ک وبلاگ رو رها کردید
دوست داشتم میتونستم اسپانسر شما بشم
افسوس ک در توانم نیست
درد وبلاتون بخوره تو سر استادای میکرو.مرسی

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">