اطلاعیه

Collapse
No announcement yet.

تایمر مد Normal

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تایمر مد Normal

    من از تایمر Xmega در مد normal می خواستم استفاده کنم و در صورت overflow شدن تایمر وارد زیر برنامه وقفه تایمر بشود.
    کد:
    	TCC0_PER = 124;		//0.5ms
    TCC0_CTRLA = TC_CLKSEL_DIV1024_gc	;	//timer CLK div 64  32MHz/64
    PMIC_CTRL |= PMIC_HILVLEN_bm;
    مشکل اینجاست که در بخشی از برنامه قبل از overflow شدن تایمر باید آن را ریست کنم. برای انجام این کار من ابتدا تایمر را متوقف و سپس در رجیستر TCC0_PERآ‌ مقدار مورد نظر را بارگذاری و دوباره تایمر را راه اندازی می کنم. ولی باز با این حال تایمر overflowآ‌میشود.
    به نظر شما مشکل کار کجاست؟ من خودم به double buffering خیلی شک دارم

    #2
    پاسخ : تایمر مد Normal

    نکته اول اینکه برای تغییر مقادیر برخی رجیسترها در تایمر نیازی به توقف تایمر نیست و می توان در حال کار تایمر مقادیر رو تغییر داد. نکته دوم اینکه Double Buffering زمانی موضوعیت دارد که شما برای تغییر مقدار مثلا رجیستر PER ابتدا مقدار رو در رجیستر PERBUFF قرار داده و بعد در زمان Updat شدن مقدار مورد نظر در رجیستر PER کپی می شود وگرنه نقشی در مقدار دهی به رجیستر نخواهد داشت.
    در مورد مشکل شما توضیح ندادید که آیا هدف از بارگذاری مجدد رجیستر PER شروع به کار مجدد تایمر کانتر از صفر هست یا اینکه ادامه کار اما با PER متفاوت. اگر قصد شما مورد اول هست برای اینکار دو راه دارید یکی اینکه مستقیما مقدار رجیستر CNT رو صفر کنید چون رجیستر PER فقط تعیین کننده مقدار ماکزیمم برای شمارنده هست و تغییر مقدار آن و همچنین متوقف کردن تایمر باعث صفر شدن مقدار رجیستر CNT نمی شود. راه دوم استفاده از Command یا دستور Force restart در رجیستر CTRLFCLR/SET که باعث صفر شدن مقدار رجیستر CNT می شود (البته جهت شمارش شمارنده هم به مقدار اولیه( صفر یا همان افزایشی) برمی گردد)
    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

    دیدگاه

    لطفا صبر کنید...
    X