Hmm, My 10ppm crystal looses like 10 seconds a day. That's like 116 parts per million. Perhaps I have wrong capacitors?
Epson TSX-3225 16.0000MF18X-AC3 16MHz
22pf capacitors.
xMega8e5.
Clock setup code:
void CrystalClock16(void) { OSC.XOSCCTRL=OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; OSC.CTRL|=OSC_XOSCEN_bm; uint8_t n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) | CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc; CCP=CCP_IOREG_gc; CLK.PSCTRL=n; // Wait for the external oscillator to stabilize while ((OSC.STATUS & OSC_XOSCRDY_bm)==0); // Select system clock source: External Osc. or Clock n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_XOSC_gc; CCP=CCP_IOREG_gc; CLK.CTRL=n; //internal 32kHz, PLL OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm | OSC_RC32KEN_bm | OSC_PLLEN_bm); }
Setting up my 1hz interrupt
void SetUpClock(void) { // Crystal is 16000000 Hz TCD5.CTRLA = 7 ; // 16000000/1024 TCD5.CTRLB = 0 ; TCD5.CTRLC = 0 ; TCD5.CTRLD = 0 ; TCD5.CTRLE = 0 ; TCD5.PER = 15625 ; TCD5.INTCTRLA = 1 ; // Low level interrupt on overflow TCD5.INTCTRLB = 0 ; }
Maybe I need my "PER" to be 15626 or 15627? 15625*1024=16000000. 1 count difference here would be about 64ppm. Have I miscounted fenceposts?
Fenceposts: A reference to an old math question: If a farmer wants to build a straight piece of fence 100 ft long with posts spaced every 10 ft, how many posts does he need? (11)