我正在使用SDCC编译器。
我想要实现的是在自己的中断处理程序中重新配置模式2自动重载中的Timer0。这是C代码:
void reconf(void) __interrupt(1){
TR0=0;
TH0=0xC0;
TL0=0xC0;
TR0=1;
}
以下是问题:
在自己的中断处理程序执行期间,是否可以在模式2自动重载模式下为Timer0重新配置TL0和TH0?
是否需要在重新配置期间停止Timer0,因为它 在中断期间没有运行?
在中断例程之前,TH0和TL0值是否被压入堆栈 开始?如果将这些值推入堆栈,然后在例程处理程序执行期间重新配置这些值,那么这些值是否会被覆盖 退出中断时堆栈中的POPed值?
答案 0 :(得分:1)
在解决您的问题之前,我认为值得指出TR0
,TH0
和TL0
是什么。它们是函数本地的不变量或坐在堆栈上(假设你有一个调用堆栈,大多数8051应用程序都没有 - 查找内存叠加)。这些是特殊功能寄存器,通常缩写为 SFR 。您可以read more about SFRs,但就您的问题而言,您可以从范围的角度将它们视为全局变量。
您可以随时修改TL0
和TH0
寄存器,包括Timer 0外设的中断处理程序。
没有必要停止计时器来修改其值,但请注意它会在您执行此操作时继续计数。这可能是一个问题,如果您正在编写,因为较低的字节滚动,您可能会得到一个不同于您预期的计时器值。
<previous code> // Timer increments to 0x12fe
TH0 = 0xff; // Timer is now 0xffff
// Timer increments to 0x0000
TL0 = 0x52; // Timer is now 0x0052
// Timer increments to 0x0053
您尝试将计时器设置为0xff52但最终得到0x0052。这是一个极端的例子,但存在风险。首先编写TL0
后跟TH0
,风险会降低,但关闭计时器是最简单的解决方案。
由于您现在知道TL0
和TH0
是具有全局范围的SFR,因此您不必担心堆栈或任何其他函数参数传递机制干扰它们。< / p>