سلام
من توی برنامه احتیاج به زمان 1 ثانیه دارم که با استفاده از تایمر tcc0 و با استفاده از وقفه تایمر ایجاد کردم.
اسیلاتور میکرو 32 مگاهرتز داخلی انتخاب شده.
وقفه به درستی اتفاق میافته.
مشکل سر دقت اسیلاتور هست چرا که توی هر 10 دقیقه زمان محاسبه شده تقریبا 12 ثانیه خطا داره.
با استفاده از dfll هم این کار را کردم ولی مشکل هم چنان باقی است.
با استفاده از کریستال خارجی و pll هم زمان دقیق بدست نمیاد
من توی برنامه احتیاج به زمان 1 ثانیه دارم که با استفاده از تایمر tcc0 و با استفاده از وقفه تایمر ایجاد کردم.
کد:
TCC0.PER = 31249; TCC0.CTRLB = TC_WGMODE_NORMAL_gc; TCC0.INTCTRLA = TC_OVFINTLVL_MED_gc; TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;
کد:
OSC.CTRL |= OSC_RC32MEN_bm; // enable 32MHz oscillator while(!(OSC.STATUS & OSC_RC32MRDY_bm)); // wait for oscillator to be ready CCP = CCP_IOREG_gc; // disable register security for clock update CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // switch to 32MHz clock
مشکل سر دقت اسیلاتور هست چرا که توی هر 10 دقیقه زمان محاسبه شده تقریبا 12 ثانیه خطا داره.
با استفاده از dfll هم این کار را کردم ولی مشکل هم چنان باقی است.
کد:
OSC.CTRL |= OSC_RC32MEN_bm; // enable 32MHz oscillator while(!(OSC.STATUS & OSC_RC32MRDY_bm)); // wait for oscillator to be ready CCP = CCP_IOREG_gc; // disable register security for clock update CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // switch to 32MHz clock OSC.CTRL |= OSC_RC32KEN_bm; // enable 32kHz oscillator while(!(OSC.STATUS & OSC_RC32KRDY_bm)); // wait for oscillator to be ready OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; DFLLRC32M.CTRL = DFLL_ENABLE_bm;
با استفاده از کریستال خارجی و pll هم زمان دقیق بدست نمیاد
کد:
OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; OSC.CTRL |= OSC_XOSCEN_bm; // enable External Oscillator while(!(OSC.STATUS & OSC_XOSCRDY_bm)); // wait for oscillator to be ready OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 2; OSC.CTRL |= OSC_PLLEN_bm; while(!(OSC.STATUS & OSC_PLLRDY_bm)); // wait for oscillator to be ready CCP = CCP_IOREG_gc; // disable register security for clock update CLK.CTRL = CLK_SCLKSEL_PLL_gc; // switch to PLL clock
دیدگاه