وقفه ها Interrupts
در میکرو کنترولرهای VAR دو دسته وقفه طراحی شده است.
وقفه های داخلی
وقفه های خارجی
فعال سازی کلی وقفه ها در زبان بیسیک BASIC
برای فعال سازی هر یک از وقفه ها باید وقفه سراسری را فعال نمود. برای این کار از دستور زیر استفاده می شود.
1 |
ENABLE INTERRUPTS |
فعال سازی وقفه مورد نظر در زبان بیسیک BASIC
1 |
ENABLE INTERRUPT |
بعد از فعال سازی کلی هر وقفه را باید با ذکر نام وقفه جداگانه فعال کرد.
INTERRUPT : نام وقفه مورد نظر
غیر فعال سازی وقفه مورد نظر در زبان بیسیک BASIC
1 |
Disable interrupt |
برای غیر فعال کردن وقفه به کار می رود.
Interrupt : نام وقفه مورد نظر
پرش به وقفه در زبان بیسیک BASIC
1 |
On interrupt lable [ nosave ] |
ما وقفه را لازم داریم تا در زمان اجرای برنامه اصلی, یک برنامه فرعی اجرا شود. برای این کار باید در زمان وجود وقفه به یک زیر برنامه پرش کنیم. این کار با دستور زیر در برنامه نویسی انجام می شود.
Interrupt : نام وقفه مورد نظر
Lable : نام بر چسب زیر برنامه وقفه
Nosave : در حالت پیش فرض تمامی رجیسترهای میکرو ذخیره شده تا در زمان برگشت از وقفه میکرو بتواند برنامه اصلی خود را بدون تغییر ادامه دهد. وجود این گزینه باعث تغییر رجیسترها و اشکال در برنامه می شود.
نکته : برای برگشت از برچسب و زیر برنامه وقفه باید از دستور return استفاده کرد.
وقفه های داخلی در زبان بیسیک BASIC
وقفه های داخلی برای اکثر امکانات و خصوصیات یک میکروکنترلر طراحی شده و برای هر یک بیت پرچمی که به آن بیت وقفه گفته می شود تعبیه شده تا یک شدن آن بیت نشان دهنده وقوع وقفه برای خصوصیت مورد نظر باشد. در اینجا نام تمامی بیت های پرچم که برای نمایش پایان کار بک خصوصیت یک می شوند را آورده ایم.
1- ovf0 : وقفه سریزی تایمر – کانتر 0
2- ovf1 : وقفه سریزی تایمر – کانتر 1
3- ovf2 : وقفه سریزی تایمر – کانتر 2
4- ovf3 : وقفه سریزی تایمر – کانتر 3
5- oc1a : وقفه ورودی تایمر – کانتر 1 در مد coppare a
6- oc1b : وقفه ورودی تایمر – کانتر 1 در مد coppare b
7- oc2 : وقفه ورودی تایمر – کانتر 2 در مد capture
8- oc3a : وقفه ورودی تایمر – کانتر 3 در مد coppare a
9- oc3b : وقفه ورودی تایمر – کانتر 3 در مد coppare b
10- (icp1) capture1 : وقفه ورودی تایمر – کانتر 1 در مد capture
11- (icp2) capture2 : وقفه ورودی تایمر – کانتر 2 در مد capture
12- (icp3) capture3 : وقفه ورودی تایمر – کانتر 3 در مد capture
13- adc : وقفه پایان عمل تبدیل آنالوگ به دیجیتال
14- aci : وقفه پایان عمل مقایسه کننده آنالوگ
15- twsi : وقفه ارتباط سریال 12c
16- erdy : وقفه آمادگی خواندن eeprom
17- urxc : وقفه پایان دریافت داده از ارتباط سریال uart
18- udre : وقفه خالی بودن رجیستر داده ارتباط سریال uart
19- utxc : وقفه پایان ارسال داده به ارتباط سریال uart
20- serial : وقفه فعال و غیر فعال بودن ارتباط سریال uart
21- spi : وقفه ارتباط spi
وقفه های خارجی در زبان بیسیک BASIC
تعدادی از پایه های میکروکنترلرهای avr را می توان به عنوان یک عمل دهنده وقفه پیکر بندی نمود. این پایه ها در هر میکرو با کلمه intx مشخص شده که در آن x ععد وقفه خارجی را نشان می دهد مانند into که وقفه خارجی 0 می باشد.
دستور پیکر بندی وقفه خارجی در زبان بیسیک BASIC
1 |
Config intx = state |
برای راه اندازی یک پایه با مشخصه int به عنوان وقفه خارجی باید به روش بالا عمل کرد.
X : عدد وقفه نسبت به نوع میکرو
State : حالت حساسیت ورودی اعمالی به پایه وقفه که به سه حالت زیر بوده و در هر نوع میکرو تنها یکی از این حالت ها و در بعضی تمامی حالت ها ساپورت می شود.
حالت اول: گزینه low level که در این حالت ورودی به سطح صفر حساس است.
حالت دوم: گزینه rising که در این حالت ورودی به لبه بالا رونده ولتاژ حساس است.
حالت سوم: گزینه falling که در این حالت ورودی به لبه پایین رونده ولتاژ حساس است.
1 2 3 4 5 6 7 8 9 10 |
Enable interrupts Config int1 = low level Enanle int1 On int 1 ali End Port a =255 Waitms 10 Port a = 0 Return |
سلام،در حالت وقفه ی خارجی در مد rising میشه بفرمایید مینیمم ولتاژ لازم روی INTx برای تریگر کردن در مورد AVR َ چقدر باید باشه؟ممنون از شما.
سلام دوست عزیز
در حالت rising شما باید یک ولتاژ مثبت به پایه های مربوطه میکروکنترلر متصل کنید، مقدار مینیمم این ولتاژ برای هر میکروکنترلر کمی متفاوت است، بهتر است برای یافتن پاسخ دقیق سوال خود به دیتاشیت میکروکنترلر مورد نظر خود مراجعه کنید. اما در حالت معمولی مقدار مینیمم ولتاژ تحریک برای سطح منطقی مثبت 2.3 ولت است.
سلام.من یک برنامه دارم که تاریخ و ساعت همزمان با سنسور pir باید کار کنه.ولی متاسفانه فقط برنامه تاریخ و ساعت اجرا میشود و دستور سنسور را اجرا نمیکند.میخواستم راهنماییم کنید که چگونه از interrupts استفاده کنم تا وقفه ایجاد کنم برای اجرای همزمان دوتا دستور باهم.ممنون از مطالب مفیدتون.
سلام دوست عزیز
شما می توانید برای محاسبه ساعت از تایمر دو میکروکنترلر و برای وقفه از تایمر یک در برنامه نویسی خود استفاده کنید. همچنین می توانید برنامه خود را طوری بنویسید که از طریق تایمر 2 ساعت محاسبه شود و در حلقه Do و Loop وضعیت پایه متصل شده به سنسور PIR به صورت مداوم بررسی شود.