我想使用ATmega 64 microcontroller的两个8位定时器。
我使用以下代码声明它们的比较中断:
.org 0x0012 ; Timer2 8 bit counter
rjmp TIM2
.org 0x001E ; Timer0 8 bit counter
rjmp TIM1
我注意到如果我输入第一个中断(0x0012),第二个定时器不起作用......它的中断永远不会产生。 为什么会发生这种情况?如何解决?
我也注意到一些奇怪的事情。如果我改变他们的订单,我会收到错误:
错误3 .cseg重叠:addr = 0x1e与0x1e冲突:0x1f
答案 0 :(得分:4)
在ATmega上,其他中断在执行任何中断向量期间被阻止。
由于各种原因,这是一个有用的功能。这可以防止中断自身中断,防止由于递归引起的潜在堆栈溢出,并允许专门用于低延迟中断的特殊寄存器,而不必先保存它们,并确保处理程序是原子的,以及其他原因
然而,显然使用可重入中断有时很有用,特别是在缺少中断优先级的ATmega上。为此,只需添加SEI指令即可设置中断允许标志。
尽管如此,你必须小心避免上述问题。通常这意味着所有使用的寄存器必须保留在堆栈中,并且在重入部分启动之前需要禁用中断本身。
至于你的地址重叠问题,我怀疑问题是你的汇编程序以字节为单位计算程序地址,而数据表中的中断向量地址用字指定(例如,定时器2比较中断将为0x24而不是of 0x12)。在完成向量定义后,您还需要注意返回主代码段,否则任何后续代码都将简单地运行到其他向量中。