我看不到错误或者编译器中有错误;-)。我正在尝试在
TCA0
上使用 ATTiny1606
来生成 PWM 来调暗一些 LED。问题是中断永远不会被调用。系统在内部振荡器 @ 20MHz 下运行并且配置正确。
TCA0配置
int main(void)
{
// ...
TCA0.SINGLE.PER = 0xFFFF;
TCA0.SINGLE.CMP0 = 0x1FFF;
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm | TCA_SINGLE_CMP0_bm;
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV2_gc | TCA_SINGLE_ENABLE_bm;
sei();
// ...
while (1)
{
// ...
}
}
中断例程
ISR(TCA0_OVF_vect)
{
PORTA.OUTCLR = PIN6_bm;
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}
ISR(TCA0_CMP0_vect)
{
PORTA.OUTSET = PIN6_bm;
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm;
}
中断永远不会被调用。即使我为了测试目的而在里面添加了延迟(我知道这永远不应该这样做),程序仍然在运行。所以也许我忘记在控制寄存器中设置一些位或者我错过了什么?
很抱歉打扰您,由于配置错误,在编译时未正确设置中断。问题不在于预处理器、编译器或任何其他东西。问题出在屏幕前的用户。经过大量时间调试代码和程序集后,我发现我的配置中有一个错误:
当我创建项目时,我选择了错误的微控制器(
ATTiny406
而不是ATTiny1606
)。真是一团糟!现在一切工作正常并且中断被正确调用。
我不会删除这个问题。也许它会帮助有同样错误的人!
非常感谢您的帮助@hcheung