راهنمائی برای برنامه نویسی وقفهای زمانی

سلام به دوستان
من برای لاگ ثبت وضعیت چند تا کلید
با آردوینو یا ESP32
و روشهای استفاده از تایم پردازنده در این موارد سئوال دارم.
همینطور ثبت اطلاعات همزمان سنسور دما در لوپ برنامه ،
با توجه به تاخیر مورد نیاز سنسور دما
و امکان گیر کردن یا تاخیر در زمان دریافت دما
کدوم راه بهتره؟

دریافت زمان از توابع
یا
چک کردن زمان و ذخیره اون با نوشتن شمارنده

چیزی مثل لاجیک آنالایزر مورد نظرم هست
و ثبت زمان همزمان وضعیت کلید ها و سنسور دما

که بنظرم بهتره از اینتراپت استفاده بشه
چون زمان تغییر وضعیت صفر و یک شدن کلید ها معلوم نیست کی اتفاق بیافته
ولی سنسور دما در لوپ دائمی هست

ممنون میشم اگر نمونه کد بفرستید

سلام
چندبار سوالت رو خوندم اما درست متوجه نشدم.
با گذاشتن ‘.’ یا ‘:’ نشون بده کجا جملت تموم شده یا کدوم خطها مربوط به خط بالایی هستن.

2 پسندیده

اینجوری باز بهتر شد اما جمله های گنگ زیاد داره
ببین درست متوجه شدم:
شما میخوای طی یک بازه زمانی متناوب مثلا هر 50 میلی ثانیه سه گروه اطلاعات رو ذخیره کنی تا بعدا ازشون استفاده کنی.

اطلاعات مورد نظرت برای ثبت کردن این سه مورد هستش:
1- زمان
2- دما
3- وضعیت کلید ها

تا اینجاش درست فهمیدم؟
زمانت میخوای چی باشه؟ ساعت و دقیقه یا تاریخ هم میخوای داشته باشه؟


خوب یه مقدار بریم سراغ اینتراپت ها:
خیلی ساده بگم:
اینتراپت مثل پدرمون میمونه که شب موقع خواب بهش گفتیم فردا صبح برای نماز صدامون کن.
و بعد ما که مثل cpu میمونیم شب که میشه شام رو میخوریم و یه نگاهی به کتاب مورد علاقمون میندازیم و بعدم میخوابیم.
صبح موقع نماز پدر صدامون میزنه و ما بیدار میشیم، نماز رو میخونیم و بعد برمیگردیم سراغ کارهای معمول روزانه.
این شکل ساده استفاده از اینتراپت هستش.


توی برنامه مشخص میکنیم که 3 عدد اینتراپت میخوایم:
1- یکی هر 10 میلی ثانیه یه اینتراپت به cpu بده تا cpu بره و دما رو بخونه.
2- یکی هر 50 میلی ثانیه یه اینتراپت به cpu بده تا cpu بره و وضعیت کلید هارو بخونه .
3- یکی هم هر 1 ثانیه یه اینتراپت به cpu بده تا cpu یکی عدد به ثانیه شمار اضاف کنه.


حالا نحوه پیاده کردن این بخش اینتراپت ها چند شیوه داره.
1- برای هر بخش یک اینتراپت مستقل بوجود میاری و اولویت اینتراپت هارو هم یکسان میگیری.(شیوه ساده)
2- برای هر بخش یک اینتراپت مستقل بوجود میاری و اولویت اینتراپت هارو بر اساس اهمیت و نوع کارکردن اون بخش دسته بندی میکنی(شیوه معمولی با دقت بالا اما اگر درست اولویت بندی نکنی ممکنه برنامه درست کار نکنه)
3- تنها یک یا دو اینتراپت بوجود میاری و هر سه کار رو بینشون تقسیم میکنی(شیوه معمولی با دقت پایینتر اما بعضی جاها لازم میشه) (مثلا یک اینتراپت برای هر 10 میلی ثانیه بوجود میاری و داخلش با یک متغیر static تعداد دفعات اجرا شدن ISR یا همون تابع زیرشاخه اینتراپت رو میشماری و با توجه به تعداد شمارش میفهمی که چقدر زمان گذشته و با توجه به زمان هر کاری که نیاز هست رو انجام میدی مثلا اگر در اینتراپت 10 میلی ثانیه 100 بار اجرا شدن داشته باشیم یعنی که ثانیه به زمان باید اضافه کنیم چون 1000 میلی ثانیه گذشته)


نمونه کد توی اینترنت خیلی زیاده


اگر با avr کار میکنی بهتره توی اولین فرصت بیای سراغ میکرو های 32 بیتی که هم ساده تره و هم خیلی قوی تر و مهمتر اینکه ارزونتر هم هست و ابزار های مختلفی داره و در دسترسه مثل دیباگر هاش که خطایابی رو خیلی سادهتر میکنه.

2 پسندیده

ممنون بلی منظور همینطور هست که فرمودید
برای پروژه دوستم هست و نیاز به زمان دقیق هست
تاریخ مهم نیست یک بار اول کار انجام میشه تو لاگ
ولی توی اینترنت با آردوینو یا ESP مثالی نزدیک پیدا نکردم
بیشتر کلی گوئی برای یاد دادن یک مثال دیدم
باز ممنون سعی میکنم روی روش راهنمائی شما بیشتر کار کنم و باز هم بگردم