ايران ويج

نسخه‌ی کامل: ایجاد تاخیر متغیر در حد میکرو ثانیه
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام دوستان، یه سوال ساده داشتم که ممنون میشم راهنماییم کنید.
میخواستم بدونم که اگه بخوام یه تاخیر در حد میکرو ثانیه ایجاد کنم باید چکار کنم؟ البته مقدار تاخیر ثابت نباشه و طبق برنامه ای که براش مینویسم، تو شرایط مختلف تغییر کنه. تابع delay برای میلی ثانیه جواب میده، ولی برای زمان های کوچیک تر مقدار متغیر رو قبول نمیکنه، به خاطر همین دنبال یه تابع جدید میگردم. اینو هم بگم که میتونم با نوشتن یه حلقه for و پیداکردن ماکزیمم شمارش حلقه اینکار رو انجام بدم، ولی دنبال یه روش دقیق تر و ساده تر و به اصطلاح مهندسی میگردم.
ممنونم از وقتی که میگذارید.
تابع میکرو ثانیه هم هست us
اما اگر قرار هست که متغییر باشد باید از تایمر ها خودت استفاده کنی
یه نگاهی به قسمت تایمر های میکرو بنداز
اینجا یه مثال میزنم
فرض کن می خوای 1 میکروثانیه وقفه درست کنی
سرعت کریستال میکرو هم 8 مگ هست
میای و مثلا تایمر 0 رو کلاک ورودیش رو تقسیم بر 8 می کنی
حالا هر پالسی 1 میکرو ثانیه هست حالا کافی هست پالس ها رو بشماری تا زمان بست بیاد

کد:
TCCT0 = 0x02;
wait = 10;
TCRT0 = 0x00;
while(TCRT0 <= wait);
//do what you want
البته یادت باشه توی این روش دقت 1 میکروثانیه هست برای افزایش دقت کافیه تقسیم تایمر رو کم کنی
+
حداکثر 256 میکروثانیه صبر می کنه برای مقدار بیشتر از تایمر 1 استفاده کن
ممنون از لطفی که کردین. یه سوال دیگه؛ چون این تاخیر رو برای درست کردن زاویه آتش میخوام، ممکنه که زمان تاخیر مورد نیازم تا 10 میلی ثانیه هم بزرگ بشه، مثلا 9540 میکرو ثانیه. فک کنم اون موقع مجبور بشم که از وقفه سرریز استفاده کنم، چون مقدار 3ff میشه 1023 و اگه اشتباه نکنم ماکزیمم تایمر یک هم میشه همین 1023، نه 65535؛ درست میگم؟ به نظر شما راهی هست که به استفاده از وقفه نیاز پیدا نکنم؟ ممنون
بهتر هست از تایمر یک استفاده کنید که اونموقع می تونید تا 65535 تا بشمارید (فقط در مود PWM هست که تا 1023 میره در مود تایمر و کانتر همون 16 بیت رو داره)