在定时器中断中断8051期间重新配置定时器

时间:2013-09-24 11:00:02

标签: c timer interrupt 8051 sdcc

我正在使用SDCC编译器。

我想要实现的是在自己的中断处理程序中重新配置模式2自动重载中的Timer0。这是C代码:

void reconf(void)  __interrupt(1){
    TR0=0;
    TH0=0xC0;
    TL0=0xC0;
    TR0=1;
}

以下是问题:

  1. 在自己的中断处理程序执行期间,是否可以在模式2自动重载模式下为Timer0重新配置TL0和TH0?

  2. 是否需要在重新配置期间停止Timer0,因为它 在中断期间没有运行?

  3. 在中断例程之前,TH0和TL0值是否被压入堆栈 开始?如果将这些值推入堆栈,然后在例程处理程序执行期间重新配置这些值,那么这些值是否会被覆盖 退出中断时堆栈中的POPed值?

1 个答案:

答案 0 :(得分:1)

在解决您的问题之前,我认为值得指出TR0TH0TL0是什么。它们是函数本地的变量或坐在堆栈上(假设你有一个调用堆栈,大多数8051应用程序都没有 - 查找内存叠加)。这些是特殊功能寄存器,通常缩写为 SFR 。您可以read more about SFRs,但就您的问题而言,您可以从范围的角度将它们视为全局变量。

  1. 您可以随时修改TL0TH0寄存器,包括Timer 0外设的中断处理程序。

  2. 没有必要停止计时器来修改其值,但请注意它会在您执行此操作时继续计数。这可能是一个问题,如果您正在编写,因为较低的字节滚动,您可能会得到一个不同于您预期的计时器值。

    <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,风险会降低,但关闭计时器是最简单的解决方案。

  3. 由于您现在知道TL0TH0是具有全局范围的SFR,因此您不必担心堆栈或任何其他函数参数传递机制干扰它们。< / p>