TGViewer
KnowledgePlus.ir KnowledgePlus.ir @knowledgeplus · 5.52K subscribers
Post #468 17.7K
مطلب زیر در سال 1391 در یکی از انجمن ها نوشته شد و به لحاظ اینکه ممکن است برای برخی مخاطبین مفید باشد در اینجا قرار داده می شود:

در یک سیستم مبتنی بر AVR و دارای ورودی های میکروسوئیچ و با حجم پردازش تا مرزهای توان CPU، گزارش شد که در مواقعی میکروسوییچ ها از کار می افتند و عمل نمی کنند. برای دست یافتن به منبع مشکل، مراحل زیر طی شد:

1- در ابتدا طبقه ورودی که میکرسوئیچ ها از طریق آن به میکروکنترلر متصل بودند، بررسی و مشخص شد که مدارات سالم هستند.

2- مسئله Hang کردن میکروکنترلر مورد بررسی قرار گرفت که معلوم شد در زمان بروز مشکل، میکروکنترلر سایر وظایف خود را به درستی انجام می دهد و بنابراین مسئله Hang کردن منتفی است.

3- با توجه به نویز القایی شدید ناشی از سروموتور ها و اینورتر و ... روی بدنه دستگاه، اصلاحاتی در نحوه اتصال ورودی ها برای حفاظت از اسپایک های احتمالی ایجاد شد که عملا نتیجه ای نداشت.

4- در مرحله بعد این احتمال بررسی شد که شاید به هر دلیلی پورت متصل به میکروسوییچ ها از کار می افتد. سوال مطرح شده این بود که چرا سایر پورت ها از کار نمی افتند. بنابراین ورودی ها به پورت دیگری منتقل شدند. اما روی پورت دیگر هم همین مشکل برقرار بود.

5- در مرحله بعد تغییری در برنامه اعمال شد، به این ترتیب که اطلاعات خوانده شده از ورودی ها را روی خروجی های دیگری ظاهر کند تا به این ترتیب بتوان اطلاع حاصل کرد که در زمان ایجاد این مشکل، آیا اطلاعات درست از پین های ورودی خوانده می شود یا خیر. با آزمایش های انجام شده مشخص شد که در زمان بوجود آمدن این مشکل، آنچه در خروجی منعکس می شود، نشان دهنده ورودی های واقعی نیست. به عبارت دیگر ورودی ها به صورت صحیح خوانده نمی شوند.

6- از مرحله قبل می توان اینگونه نتیجه گیری کرد که یا بافر ورودی پورت از کار می افتد که وضعیت نادرست روی خروجی منعکس می شود و یا محتوای پورت اصولا خوانده نمی شود. با توجه به مکان قرارگیری خواندن پورت در روتین وقفه تایمر و وجود وقفه دیگری با اولویت استاتیک بالاتر (آدرس کمتر در جدول بردار وقفه)، این احتمال قوی مطرح شد که به دلیل وقوع پی در پی وقفه دیگر با اولویت استاتیک بالاتر، برنامه هیچ گاه نمی تواند وارد وقفه تایمر شود و بنابراین روند خواندن پورت مختل می شود. برای بررسی این مسئله بجای استفاده از وقفه، از روش Polling برای چک کردن Flag وقفه تایمر و سپس خواندن پورت استفاده شد که در این حالت تقاضای پی در پی وقفه ها نمی تواند مانع اجرای برنامه در حلقه اصلی شود و بعد از هر وقفه حداقل یک دستور اجرا می شود. بعد از پیاده سازی این روش، خوشبختانه مشکل برطرف شد که نشان دهنده متوقف شدن روند اجرای وقفه تایمر به دلیل تقاضای وقفه های مکرر توسط یک وقفه با اولویت استاتیک بالاتر است.

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

@KnowledgePlus
More from @knowledgeplus
  1. Oct 16, 2026هزینه فرصت (Opportunity cost) @KnowledgePlus
  2. Oct 15, 2026درباره بازار کار بِکر مرتبط با رفع نیازهای مدارات سوئیچینگ @KnowledgePlus
  3. Aug 19, 2026در بخش پایانی فیلم Amadeus ساختهٔ سال ۱۹۸۴ برای نمایش نبوغ موتزارت، سکانسی دربارهٔ ساخت بخ…
  4. Jul 17, 2026چکیده ای از گفتگوی انجام شده در تاریخ ۱۴۰۵/۴/۲۵ با موضوعات: ۱- بیان مشکلات فعلی ۲- اهمیت ح…
  5. Feb 11, 2026با توجه به گران شدن بیش از حد قلع و سیم لحیم، به این نکته توجه کنید که وزن قرقره ها در نمو…
  6. Dec 12, 2025بعضی از پر بازدیدترین پست های کانال از ۱۰ سال پیش تاکنون: زرنگی در دو نسخه شباهت عملکرد مغ…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →