我想你的问题是定时器周期。
MC__UP Up mode: Timer counts up to TBxCL0
所以当你的定时器 TBxR 到达 TBxCL0 时,它会重置为 0,这似乎是 TB0CCR0 的值。
所以它永远无法达到 32768 的值。
您可以将 TB0CCR0 与 TB0CCR1 切换,因此您的周期将为 1 秒。
为了获得 1ms 的中断,您需要每次增加 TB0CCR1。
INTERRUPT ISR_1MS()
{
TB0CCR1 = (TB0CCR1 + 32) & 0x7FFF;
}
但通常你不需要第二个计时器来进行第二个间隔。
您可以简单地计算 1000 次 1ms 间隔。
INTERRUPT ISR_1MS()
{
ms_count++;
if (ms_count >= 1000)
{
ms_count=0;
// Do your second stuff
}
}
如果您需要更多不同的间隔,您可以更改为另一个模型。
到系统时钟时间并仅检查该时间。
volatile unsigned int absolute_time=0;
INTERRUPT ISR_1MS()
{
absolute_time++;
}
unsigned int systime_now(void)
{
unsigned int result;
di();
result = absolute_time;
ei();
return result;
}
uint8_t systime_reached(unsigned int timeAt)
{
uint8_t result;
result = (systime_now() - timeAt ) < 0x1000;
return result;
}