想知道如何奇怪地预设 Timer0 的值?

Wondering how to strangely preset the value of Timer0?

请问在给Timer0取值的时候,为什么有些时候要用减法来表示预设的Timer0,而不是直接用它的结果(本例为175)?在这种情况下,UL 后缀的用途是什么?

示例:

X=255Ul-80;
void 中断 ISR(void)
{
如果 (T0IF)
{
T0IF=0;
TMR0=X;
abc();
}
}
...

Microchip 文档描述了 TIMER0 模块的工作原理。

它没有描述如何很好地使用这个 counter/timer 模块的方法。

与当今任何现代嵌入式控制器相比,TIMER0 模块的基本架构都非常原始。目前还不清楚为什么 Microchip 坚持在新的 8 位 PIC 控制器中包含这个 counter/timer 模块。了解 35 年前,用最少数量的晶体管最大化功能是一项挑战,这样每个控制器芯片将尽可能小,并在每个晶圆上生产最多的芯片。

TIMER0 的工作方式是作为递增计数器。首次实施时,控制器根本不支持中断。请参阅基准控制器,例如 PIC12F508。 mid-range 控制器(如 PIC16F877)增加了对中断的支持,并且 TIMER0 获得了在 8 位计数寄存器从 0xFF 翻转到 0x00 时请求中断的功能。当 TIMER0 计数寄存器从 0x00 开始时,TIMER0 需要 256 次计数才能发出中断请求。当在特定数量的计数后需要断言中断时,将计数寄存器的值设置为 256-(Specific_Number_Of_Counts),然后清除 TIMER0 中断请求。

开发人员使用此功能让 TIMER0 中断请求在特定计数后生效。

你问题中的例子有一个“off-by-one”错误:

X=255Ul-80;

因为 TIMER0 计数寄存器在 80 次计数后的值为 0xFF,而 TIMER0 中断请求将在 81 次计数后设置。

您问题中的示例代码“建议”您希望在 TIMER0 计时 80 次后调用“abc()”函数。该函数将在 TIMER0 被计时 81 次后实际调用。

另请注意,TIMER0 的仿真模型没有周期精确实现,因此无法准确模拟实际情况。此仿真缺陷存在于所有用于 8 位 PIC 控制器的 MPLABX 版本中。请注意,模拟器不会提供与真实世界硬件相匹配的循环计数。