۲۰-اسفند-۱۳۹۱, ۱۸:۰۷:۱۷
امروز میخوام کار با وقفه هارو آموزش بدم برای این کار کتابخانه ی "AVR/INTERRUPT.H" رو به برنامه اضافه کنید
توجه کنید که تمامی ادرس های وقفه رو توی فایل اصلی بنویسید وگرنه خطا میده
اولین دستور ها
اولی وقفه ی سراسری رو فعال می کنه دومی غیر فعال
-
کلا برنامه ای که اجرا میشه توی یه قسمتی مثل زیر هست
مثلا این وقفه ی انالوگ به دبجیتال رو به این جا میاره
برای هر قسمتی اسم مخصوص به خودش رو داره این جا دنبالش بگردید
اگه یه وقفه ای رخ بده که هیچ چیزی براش تعریف نکرده باشید مثل بالا موجب میشه میکرو ریست بشه
!
برای همین از این استفاده کنید که همه ی وقفه هایی که بردارشون مشخص نشده به اینجا برن
اصولا وقتی وقفه رخ میده وقفه ی سراسری غیر فعال میشه و بعد فعال تا توی وقفه وقفه انجام نشه برای غیر فعال کردن این قابلیت این جوری استفاده کیند
اگه می خواید دو تا وقفه به یک جا برن اینجوری استفاده کنید
الان دومی به همون اولی میره
اگه می خواید هیچ برنامه ای اجرا نشه اینو استفاده کنید
یکسری چیز هایی رو خود کامپایلر مدیریت می کنه مثل ذخیره ی SREG و باز گشت از وقفه و غیره اگه می خواید برنامه سریع تر اجرا بشه یا هرچی دیگه اینجوری استفاده کنید
اون reti اخر باید باشه چون باعث برگشت از وقفه میشه در ضمن بدونید که چون هیچ کد اضافی نمی شه ممکن هست داده های مربوط به برنامه که ذخیره شدن رو از بین ببرید پس اگه این کاره نیستید بی خیال شید
-
اینم باعث بازگشت از وقفه میشه به طور عادی نیازی به این نیست مگر جا هایی که گفتم
توجه کنید که تمامی ادرس های وقفه رو توی فایل اصلی بنویسید وگرنه خطا میده
اولین دستور ها
کد:
sei();
cli();
-
کلا برنامه ای که اجرا میشه توی یه قسمتی مثل زیر هست
کد:
ISR(ADC_vect){
//code here
}
برای هر قسمتی اسم مخصوص به خودش رو داره این جا دنبالش بگردید
اگه یه وقفه ای رخ بده که هیچ چیزی براش تعریف نکرده باشید مثل بالا موجب میشه میکرو ریست بشه
![Biggrin Biggrin](https://www.iranled.com/forum/images/smilies2/biggrin.gif)
برای همین از این استفاده کنید که همه ی وقفه هایی که بردارشون مشخص نشده به اینجا برن
کد:
ISR(BADISR_vect)
{
// user code here
}
کد:
ISR(XXX_vect, ISR_NOBLOCK)
{
...
}
کد:
ISR(PCINT0_vect)
{
...
// Code to handle the event.
}
ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
اگه می خواید هیچ برنامه ای اجرا نشه اینو استفاده کنید
کد:
EMPTY_INTERRUPT(ADC_vect);
کد:
ISR(TIMER1_OVF_vect, ISR_NAKED)
{
PORTB |= _BV(0); // results in SBI which does not affect SREG
reti();
}
-
اینم باعث بازگشت از وقفه میشه به طور عادی نیازی به این نیست مگر جا هایی که گفتم
کد:
reti ( )