您可以做得比Brian Drummond的建议要好。尽管您的振荡器可能是系统中最大的错误源,这确实是正确的,但没有足够的理由却没有理由添加其他系统错误。
将您的计时器间隔设置为33668滴答,在0处启动计数器,并在每次计时器中断时,将计数器增加6754。
如果在递增之后,计数器> = 8105,则减去8105,并将下一秒的计时器间隔设置为33669滴答。
否则,请不要理会计数器,并将下一秒的计时器间隔设置为33668。
这将使您(假设一个完美的32.768kHz晶体)的平均间隔为
(33668 + 6754 / 8105) / 32768 ~= 1.0274912510006
秒(相对于1.0274912510小于百万分之一的误差),而不是1.0274963378906秒(几乎百万分之五的误差)。这意味着时钟的长期精度将真正取决于振荡器的精度。由于数学造成的错误,每年造成的错误将大大少于一滴答。虽然任何的长度单第二将具有相对误差高达25ppm的,在更长的和更长的平均时间间隔的误差消失。
这是布雷森纳姆(Bresenham)应用于计时的算法,发现分数6754/8105如下:
32768 * 1.027491251 = 33668.833312768
33668.833312768的确切连续分数为[33668; 1,4,1,1349,1,7]。
删除最后一项,得出的近似值为33668 + 6754/8105,它的所有部分都整齐地适合16位。