من با میکرو یه مدار بستم که هم از وقفه سرریز تایمر صفر استفاده کردم هم از وقفه خارجی صفر. برای من وقفه خارجی اهمیت بیشتری داره، در حالیکه میدونم وقفه تایمر بالاترین اولویت رو بین وقفه ها داره! حالا باید چیکار کنم؟چطوری میشه اولویت وقفه ها رو عوض کنم؟رجیسترش چیه؟ و باید چطوری باشه؟ :icon_razz:
اطلاعیه
Collapse
No announcement yet.
چطور اولویت وقفه ها رو تنظیم کنم؟
Collapse
X
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
نوشته اصلی توسط uni_ahmadiدر حالیکه میدونم وقفه تایمر بالاترین اولویت رو بین وقفه ها داره! :icon_razz:
اولویت وقفه خارجی بالاتره
در ثانی مگه چقدر زمان فرضا 500 نانو ثانیه برات مهمه
یادت باشه وقفه ها در صورتی که با هم اتفاق بیفتن از بین نمیرن و به کار هردوشون رسیدگی میشه
اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
ای بابا! حتما یه چیزی میدونم که میگم دیگه!تو دیتا شیت مگا32 تو بخش تایمرها دیدم که وقفه تایمر بالاترین اولویتو داره! در ثانی خود وقفه که مهم نیست زمانش!زیر برنامه ای که توی وقفه تایمرم اجرا میشه 3ثانیه طول میکشه، من میخوام اگه این وسط وقفه خارجی فعال شد، میکرو، زیربرنامه وقفه تایمرو ول کنه و بره سراغ وقفه خارجی و زیر برنامه اون،بعدا برگرده سراغ تایمر ...
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
یکی از اشکالات بزرگ AVR این است که اولویت وقفه های آن فقط از نوع Static است(بر خلاف 8051 و XMEGA که بیش از یک سطح اولویت در آنها قابل تعریف است). به این معنا که اگر دو یا چند وقفه بصورت همزمان درخواست شوند، وقفه ای که آدرس بردار آن (در حافظه Flash) کوچکتر باشد، دارای اولویت بالاتری خواهد بود و زودتر پذیرفته می شود. اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.اوژن: به معنای افکننده و شکست دهنده است
دانایی، توانایی است-Knowledge is POWER
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
نوشته اصلی توسط طراحیکی از اشکالات بزرگ AVR این است که اولویت وقفه های آن فقط از نوع Static است(بر خلاف 8051 و XMEGA که بیش از یک سطح اولویت در آنها قابل تعریف است). به این معنا که اگر دو یا چند وقفه بصورت همزمان درخواست شوند، وقفه ای که آدرس بردار آن (در حافظه Flash) کوچکتر باشد، دارای اولویت بالاتری خواهد بود و زودتر پذیرفته می شود. اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.
این چیزی که شما میخوای بهش میگم ماسک پذیری وقفه که متاسفانه توسط میکروی AVR پشتیبانی نمیشه
راه کاری که بشه کار شما رو راه انداخت به این صورته
شما زیر برنامه ای رو که قراره تو تایمر اجرا بشه رو بذار تو لوپ تابع main براش یه شرط بذار که مثلا وقتی فلان رجیستر مقدارش 1 بود بیاد و برنامه رو اجراکنه ، اون وقت تو تایمر بیا و مقدار اون متغییر رو یک کن
اینجوری روتین وقته تایمر فقط چند پالس ساعت طول میکشه و لطمه ای به روتن دیگر وقفه ها نمیزنه
کد:char flag=0; //timer int { flag = 1; } // main rotin { while(1){ if(flag==1){ flag = 0; . . . } } }
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
نوشته اصلی توسط طراحیکی از اشکالات بزرگ AVR این است که اولویت وقفه های آن فقط از نوع Static است(بر خلاف 8051 و XMEGA که بیش از یک سطح اولویت در آنها قابل تعریف است). به این معنا که اگر دو یا چند وقفه بصورت همزمان درخواست شوند، وقفه ای که آدرس بردار آن (در حافظه Flash) کوچکتر باشد، دارای اولویت بالاتری خواهد بود و زودتر پذیرفته می شود. اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.
فک کنم روال بدون اینکه برنامه اسمبلی هم دست کاری بشه باز هم اجرا بشه
توی همین بخش چند تا مثال آوردم " به نام وقفه در وقفه "
حتی اونجا با یک برنامه نشون دادم که اگه بجای 2 تا وقفه تعداد بیشتری وقفه اتفاق بیفته باز هم به کار همگی رسیدگی میشه و هیچ وقفه ای از بین میره
به نظر من برنامه نویسی جناب یونی آندرلاین احمدی مشکل داره که تویزیر روال وقفه تاخیر 3 ثانیه ایجاد کرده وگرنه وقفه ها هیچ مشکلی نداره
اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
در سوال جناب uni_ahmadi بحث بر سر از بین رفتن وقفه نیست، بلکه سوال بر سر اجرای روتین یک وقفه در وسط اجرای روتین وقفه دیگر است. بعد از پذیرش تقاضای یک وقفه توسط CPU و پرش به آدرسی که روتین وقفه در آن نوشته شده، Flag مجوز تمام وقفه ها که در رجیستر SREG قرار دارد و I نامیده می شود، تا پایان وقفه بصورت خودکار صفر می شود و بنابراین هیچ وقفه دیگری تا پایان اجرای روتین وقفه جاری پذیرفته نمی شود. بنابراین راه تغییر این وضعیت همان است که در پست قبل گفته شد.
اما در مورد از بین نرفتن وقفه ها هم اشاره به این نکته لازم است که در برخی شرایط ممکن است وظیفه ای که به عهده یک وقفه است به دلیل نوع برنامه نویسی و عدم امکان پاسخگویی CPU به درستی انجام نشود و هرچند در این موقعیت، وقفه به اصطلاح از بین نمی رود، اما وظیفه خود را هم نمی تواند به درستی انجام بدهد. به عنوان مثال فرض کنید وقفه دریافت USART فعال شده باشد و بایتی دریافت شود که تقاضای وقفه ای را ایجاد کند. اگر پاسخ گویی به این تقاضای وقفه به دلیل درگیر بودن CPU در وقفه دیگر به حدی طول بکشد که اطلاعات جدیدی در بافر سریال نوشته شود، در این شرایط تقاضای وقفه به قوت خود باقی است، اما شرایط Overrun ایجاد می شود که به معنای از دست رفتن Data قبلی است. یا به عنوان مثال دیگر اگر لازم باشد به ازای هر بار سرریز (Overflow) یک تایمر عملی انجام شود، اما بعد از یکبار سرریز، تقاضای وقفه به حدی معطل شود که سرریز بعدی اتفاق بیافتد. در این شرایط تقاضای وقفه از بین نرفته است، اما وظیفه مورد نظر برنامه نویس برای وقفه هم به درستی انجام نشده است.اوژن: به معنای افکننده و شکست دهنده است
دانایی، توانایی است-Knowledge is POWER
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
آقای طراح ممنون از راهنماییتون!
دستور sei همه وقفه ها رو فعال میکنه، من در حال حاضر همین دو تا وقفه رو دارم اما به زودی به تعداد وقفه ها اضافه میشه، و یه این دلیل نمیتونم همه روبا همفعال یا غیر فعال کنم. یعنی الویت دهی میخوام :mrgreen:
آقای گاپه ممنون از راهنماییتون!
من حلقه اصلی برنامم قراره یه عالمه شولوغ پولوغ بشه، یه عالمه کار کنه میکروی بیچاره! حالا اگه من این تاخیر لعنتی رو ببرم تو حلقه اصلی که بقیه کارا علاف میشه!اونا رو چه کنم؟! :icon_razz:
یعنی هیچ راه دیگه ای وجود نداره!؟من صدسال پیش که اسمبلی خوندم به این نتیجه رسیدم که با اسمبلی میشه همه جای میکرو رو دستکاری کرد. من با کدویژن برنامه مینویسم و کلا اسمبلی از ذهنم پریده! واسه همین فکر میکنم اگه بلد بودم شاید میشد یه کلکی به میکرو بزنم! :icon_razz:
کلا چطوری میتونم دستورای اسمبلی که میشه وسط برنامه سی استفاده کرد و رجیسترها رو دستکاری کرد، گیر بیارم؟کسی ایده ایف نظری...داره آیا؟
ممنون
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
نوشته اصلی توسط uni_ahmadiدستور sei همه وقفه ها رو فعال میکنه، من در حال حاضر همین دو تا وقفه رو دارم اما به زودی به تعداد وقفه ها اضافه میشه، و یه این دلیل نمیتونم همه روبا همفعال یا غیر فعال کنم. یعنی الویت دهی میخواماوژن: به معنای افکننده و شکست دهنده است
دانایی، توانایی است-Knowledge is POWER
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
سلام جناب طراح و سایر دوستان
نوشته اصلی توسط طراحاما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
نوشته اصلی توسط طراحضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.
این قضیه خیلی برام حیاتیه !
آخه دارم با وقفه ی USART یه سری رشته رو دریافت میکنم که چیه ! (با صدا زدن چند تایع دیگه)
البته الان مشکلی نداره و به درستی کار میکنه(البته صد در صد اصولی نیست طبق صحبت دوستان تو جاهای مختلف :read
[بادریت : 9600 / کریستال:11.0592 / Atmega8A]زمان تنها واحد حقیقی اندازه گیریه
زمان وجود ماده رو اثبات میکنه
بدون زمان هیچکدوم ما وجود نخواهیم داشت
زمان یکتاست
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
با سلام
یعنی وقتی داره زیر برنامه وقفه ای اجرا میشه اگر همون وقفه دوباره بیاد هم تا پایان زیر برنامه ، زیر برنامه ی وقفه از ابتدا اجرا نمیشه؟
چه طوری می تونم متوجه شم که روتین وقفم چقد طول میکشه ؟
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
نوشته اصلی توسط mojtaba_ledکامپایلر برنامه شما رو به هر زبونی که باشه اول به اسمبلی تبدیل میکنه ، معادل اسمبلی روتین وقفتون رو ببینید بعد با دونستن فرکانس کار میکرو و اینکه هر دستور در چند سیکل اجرا میشه میتونید زمان اجرای روتین وقفه رو حساب کنید البته در صورت لزوم میتونید روتین وقفه خودتون به اسمبلی بنویسید .
نمیشه با یه تخمین زیاد محاسبه کرد ؟ زمان دقیقش خیلی برام مهم نیست !
مثلا دستور مقایسه (if) یا مقدار دهی به یک متغیر در َAtmegaA چند سیکل طول میکشه ؟
آخه دارم با وقفه ی USART یه سری رشته رو دریافت میکنم که چیه ! (با صدا زدن چند تایع دیگه)
البته الان مشکلی نداره و به درستی کار میکنه(البته صد در صد اصولی نیست طبق صحبت دوستان تو جاهای مختلف :read
[بادریت : 9600 / کریستال:11.0592 / Atmega8A]
آحه زمان اجرای زیر برنامه همیشه ثبته دیگه ! پس اگه الن کار میکنه میشه مطمئن باشم که از نشر زمانی ایرتدی نداره؟زمان تنها واحد حقیقی اندازه گیریه
زمان وجود ماده رو اثبات میکنه
بدون زمان هیچکدوم ما وجود نخواهیم داشت
زمان یکتاست
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
خوب ماکزیمم زمانی که میتونید به اجرای وقفه تون اختصاص بدید چقدره ؟اگه میتونید تابعی رو داخل وقفه صدا نکنید چون اونوقت کامپایلر تمام رجیسترها رو پوش میکنه توی دیتا استک . در مورد تخمین آخه چی بگم نمیدونم !کد اسمبلی معادل روتین وقفه تون رو بزارید فرکانس میکرو رو هم بگید ببینم میتونم براتون محاسبه کنم
الان که داره درست کار میکنه امکان داره به مشکل بخوره؟
آحه زمان اجرای زیر برنامه همیشه ثبته دیگه ! پس اگه الن کار میکنه میشه مطمئن باشم که از نشر زمانی ایرتدی نداره؟
دیدگاه
-
پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟
نوشته اصلی توسط mojtaba_ledخوب ماکزیمم زمانی که میتونید به اجرای وقفه تون اختصاص بدید چقدره ؟
دارم از USART دیتا میگیرم . هر وقت یه دیتای کامل(8بیتی) برسه میره به وقفه
Boudrate=9600 / Data bit=8 / Parity=None / Stop bit=1 / Flow control=None
یعنی تقریبا هر دیتای کامل که بخواد برسه و وقفه فعال بشه چقدر طول میکشه؟زمان تنها واحد حقیقی اندازه گیریه
زمان وجود ماده رو اثبات میکنه
بدون زمان هیچکدوم ما وجود نخواهیم داشت
زمان یکتاست
دیدگاه
دیدگاه