پاسخ : مشکل تکرار دستور در bascom
سلام به شما دوست گرامی
برای این کار باید از تایمر ها اطلاعاتی داشته باشید تا بتونید برنامه رو بنویسید
شما باید یه تایمر رو ( مثلا تایمر 0 ) روی کمترین فرکانس ممکن تنظیم کنید
حساب کنید که با فرکانسی که تایمر 0 داره ( مثلا 1 مگاهرتز ) و تعداد شمارش هایی که تایمر میتونه انجام بده تا سریز شه چقدر زمان طول خواهد کشید تا تایمر یک بار سریز بشه . . .
مثلا فرکانس تایمر 0 یک مگاهرتز هست و 256 واحد رو میتونه بشماره بنابراین مدت زمانی که تایمر 0 یک بار سریز میشه از این فرمول بدست میاد
مدت زمان شمارش یک واحد ( به فرکانس تایمر مرتبط هست ) * 256 در نتیجه : 256 * 0.000001 = 0.000256 که بر حسب ثانیه هست
که میشه 256 میکروثانیه . . .
یعنی هر بار سریز تایمر 0 256 میکروثانیه طول میکشه . . .
حالا چند بار تایمر باید سریز بشه تا 5 دقیقه زمان بگذره ؟؟؟
به این صورت که 5 دقیقه 300 ثانیه هستش 5*60 = 300 ثانیه
300 ثانیه 300 هزار میلی ثانیه هستش
300 هزار میلی ثانیه 300 میلیون میکرو ثانیه هست
حالا باید 300 میلیون میکروثانیه رو ( که در واقع همون 5 دقیقه هستش ) به 256 میکرو ثانیه تقسیم کنیم که میشه : 1171875
یعنی 1171875 بار باید تایمر سریز بشه تا مدت 5 دقیقه بگذره . . .
خوب حالا تا این جا رو داشته باش تا بریم یه قسمت دیگه . . .
حالا شما باید تو برنامت اینطوری بنویسی :
اگه فلان کلید زده شد تایمر 0 رو با فرکانس 1 مگاهرتز راه اندازی کن و خروجی رو یک کن ( یا استارت تایمر 0 رو بزن در واقع میتونی تایمر رو در اول برنامه راه اندازی کنی و تایمر رو خاموش کنی و بعدش بعد از زدن کلید استارت تایمر رو بزنی و خروجی رو یک کنی )
یادت باشه که تایمر باید در مد اینترآپت ( وقفه ) راه اندازی شه
در این حالت با هر بار سریز یک وقفه از cpu در خواست میشه و برنامه منتقل میشه به زیر روال وقفه . . .
تو زیر روال وقفه یه شمارنده و یه دستور if قرار بده که اگه تعداد دفعات اجرای وقفه برابر 1171875 شد اونوقت خروجی رو صفر کن . . .
شرح برنامه :
حالا بعد از این که کلید رو زدی و تایمر رو استارت زدی خروجی یک میشه
زمان سنجی تایمر شروع میشه در عین حال برنامه داره کارشو انجام میده و cpu داره دستورات داخل حلقه اصلی رو اجرا میکنه . . .
بعد از این که 256 میکرو ثانیه گذشت تایمر 0 اولین وقفه خودش رو از cpu در خواست میکنه و ظرف چند سیکل کلاک cpu شروع به اجرای دستورات داخل اینتراپت تایمر میکنه . . .
حالا دستورات داخل اینتراپت ( وقفه ) چیه ؟
1_یه متغیر شمارنده که با هر بار اجرای وقفه ( اینتراپت ) تایمر یک واحد بهش اضافه میشه ( باید مقدار اولیه این متغیر رو صفر قرار داد ) ضمنا متغیر به اندازه کافی بزرگ انتخاب شه تا بتونی عدد 1171875 رو بشماره که باید از نوع 32 بیتی استفاده کنی
2_ یه دستور شرطی که با هر بار اجرای وقفه چک میکنه که چند بار وقفه اجرا شده که اگه تعداد دفعات اجرای وقفه برابر عدد کذایی
شد اون کاری که شما میخوای رو انجام بده ( خروجی رو صفر کنه )
یادت باشه هر وقت کارت با تایمر تموم شد تایمر رو غیر فعال ( stop ) کن
حواست به متغیر باشه که اگه دوباره خواستی تو تایمر ازش استفاده کنی دوباره مقدار 0 بهش بدی ( لازم نیست حتما 0 بدی ولی این طوری راحت تر میتونی حساب کتاب کنی . . . )
توجه : برای کار با تایمر ها در صورتی که زمان هایی در حد دقیقه مورد نیاز شما هست خیلی خیلی بهتره که تا جایی که میتونید فرکانس تایمر رو پایین بیارید
سوالی داشتید درخدمتم
موفق و مویــــد باشیــــد
یا حق
نوشته اصلی توسط gh.kh
نمایش پست ها
برای این کار باید از تایمر ها اطلاعاتی داشته باشید تا بتونید برنامه رو بنویسید
شما باید یه تایمر رو ( مثلا تایمر 0 ) روی کمترین فرکانس ممکن تنظیم کنید
حساب کنید که با فرکانسی که تایمر 0 داره ( مثلا 1 مگاهرتز ) و تعداد شمارش هایی که تایمر میتونه انجام بده تا سریز شه چقدر زمان طول خواهد کشید تا تایمر یک بار سریز بشه . . .
مثلا فرکانس تایمر 0 یک مگاهرتز هست و 256 واحد رو میتونه بشماره بنابراین مدت زمانی که تایمر 0 یک بار سریز میشه از این فرمول بدست میاد
مدت زمان شمارش یک واحد ( به فرکانس تایمر مرتبط هست ) * 256 در نتیجه : 256 * 0.000001 = 0.000256 که بر حسب ثانیه هست
که میشه 256 میکروثانیه . . .
یعنی هر بار سریز تایمر 0 256 میکروثانیه طول میکشه . . .
حالا چند بار تایمر باید سریز بشه تا 5 دقیقه زمان بگذره ؟؟؟
به این صورت که 5 دقیقه 300 ثانیه هستش 5*60 = 300 ثانیه
300 ثانیه 300 هزار میلی ثانیه هستش
300 هزار میلی ثانیه 300 میلیون میکرو ثانیه هست
حالا باید 300 میلیون میکروثانیه رو ( که در واقع همون 5 دقیقه هستش ) به 256 میکرو ثانیه تقسیم کنیم که میشه : 1171875
یعنی 1171875 بار باید تایمر سریز بشه تا مدت 5 دقیقه بگذره . . .
خوب حالا تا این جا رو داشته باش تا بریم یه قسمت دیگه . . .
حالا شما باید تو برنامت اینطوری بنویسی :
اگه فلان کلید زده شد تایمر 0 رو با فرکانس 1 مگاهرتز راه اندازی کن و خروجی رو یک کن ( یا استارت تایمر 0 رو بزن در واقع میتونی تایمر رو در اول برنامه راه اندازی کنی و تایمر رو خاموش کنی و بعدش بعد از زدن کلید استارت تایمر رو بزنی و خروجی رو یک کنی )
یادت باشه که تایمر باید در مد اینترآپت ( وقفه ) راه اندازی شه
در این حالت با هر بار سریز یک وقفه از cpu در خواست میشه و برنامه منتقل میشه به زیر روال وقفه . . .
تو زیر روال وقفه یه شمارنده و یه دستور if قرار بده که اگه تعداد دفعات اجرای وقفه برابر 1171875 شد اونوقت خروجی رو صفر کن . . .
شرح برنامه :
حالا بعد از این که کلید رو زدی و تایمر رو استارت زدی خروجی یک میشه
زمان سنجی تایمر شروع میشه در عین حال برنامه داره کارشو انجام میده و cpu داره دستورات داخل حلقه اصلی رو اجرا میکنه . . .
بعد از این که 256 میکرو ثانیه گذشت تایمر 0 اولین وقفه خودش رو از cpu در خواست میکنه و ظرف چند سیکل کلاک cpu شروع به اجرای دستورات داخل اینتراپت تایمر میکنه . . .
حالا دستورات داخل اینتراپت ( وقفه ) چیه ؟
1_یه متغیر شمارنده که با هر بار اجرای وقفه ( اینتراپت ) تایمر یک واحد بهش اضافه میشه ( باید مقدار اولیه این متغیر رو صفر قرار داد ) ضمنا متغیر به اندازه کافی بزرگ انتخاب شه تا بتونی عدد 1171875 رو بشماره که باید از نوع 32 بیتی استفاده کنی
2_ یه دستور شرطی که با هر بار اجرای وقفه چک میکنه که چند بار وقفه اجرا شده که اگه تعداد دفعات اجرای وقفه برابر عدد کذایی

یادت باشه هر وقت کارت با تایمر تموم شد تایمر رو غیر فعال ( stop ) کن
حواست به متغیر باشه که اگه دوباره خواستی تو تایمر ازش استفاده کنی دوباره مقدار 0 بهش بدی ( لازم نیست حتما 0 بدی ولی این طوری راحت تر میتونی حساب کتاب کنی . . . )
توجه : برای کار با تایمر ها در صورتی که زمان هایی در حد دقیقه مورد نیاز شما هست خیلی خیلی بهتره که تا جایی که میتونید فرکانس تایمر رو پایین بیارید
سوالی داشتید درخدمتم
موفق و مویــــد باشیــــد
یا حق
دیدگاه