嵌入HCS12:计数器定时器和计算输出比较值

嵌入HCS12:计数器定时器和计算输出比较值

问题描述:

我在HCS12上的定时器输出比较中断时遇到问题。这个问题似乎是我写计算值到输出比较寄存器,而不是立即数,即...嵌入HCS12:计数器定时器和计算输出比较值

OCval = x + y; ldd OC1,OCval; //我需要做什么

ldd OC1,#3000; //有什么作用

使用计算值,定时器中断不稳定,这在我的应用程序中是不可接受的。这个问题已经被牢牢地记录下来,要求在单个周期内访问定时器和OC寄存器,除了立即写入之外的任何其他内容都会违反这个规定。我还注意到,网络上的所有示例代码都使用即时操作。

只是想知道是否有软件解决方法。我需要允许计数器*运行(即不复位),因为还有其他输出与立即写入相比较,必须保持运行。只有两个中断需要计算。

软件修复会很好,因为我可以看到的唯一其他选项涉及额外的硬件来处理动态计时,凌乱。 TIA

+0

这是很难回答,没有提供任何代码。我认为代码是用C编写的?如果是这样,你应该查看反汇编以查看实际生成的代码。你正在使用哪种编译器?一般来说,当你在C中遇到不需要的操作时,你应该用几个步骤编写C代码,例如'volatile uint16_t result = x + y; OCval =结果;'。 – Lundin

+0

特别针对HCS12,清除定时器标志时,C代码通常会导致错误的汇编程序。无论编译器如何,您都必须反汇编清除定时器标志的代码,以查看它是否按预期工作。一个常见的错误是当你有像'FLAGREG | = MASK;'这样的结果时'读取FLAGREG,将结果存入累加器,添加掩码,写回结果'。然后,通过向它们写入1来清除标志,还可以销毁同一个寄存器中的所有其他标志。为了得到正确的汇编代码(BSET),FLAGREG = MASK;通常会给出正确的指令。取决于编译器。 – Lundin

+0

感谢您的回复。关于清除旗帜是正确的,在这种情况下,ASM清单显示这不是问题。测试从那以后证明了问题是在多个周期内将值写入比较寄存器。将这个功能移动到模块化的下降计数器已经稳定了应用程序。 – BruceV

这有些尝试,但早期的测试是令人鼓舞的。我将主定时器的违规中断移到了模数下计数器,该计数器也提供时钟中断。该文档指出,设置计数寄存器需要遵循相同的单周期写入规则,但是使用主定时器进行广泛的测试表明,只有在计数器运行一段时间后才发生问题,直到新的设置。这种新方法的优点是,只需一次写入一次值,即初始设置时间值,而不像主要定时器那样需要每秒重复执行一次重写。

如果有帮助,我会在写入之前停止计数器,然后重新启动它。