AVR ATmega328P定时器中断不工作求助:汇编LED闪烁异常
问题分析与解决
你的代码核心问题是中断向量地址错误,导致定时器比较匹配中断无法跳转到正确的处理函数。
具体错误点
ATmega328P的Timer0 Compare Match A中断向量地址是0x0020,而你代码中写的0x001C是Timer1 Compare Match B的中断向量地址。当定时器触发中断时,MCU会跳转到错误的地址,自然不会执行你的TIMER_INTERRUPT函数。
修正后的代码
LDI r16, (1 << DDB0) OUT DDRB, r16 LDI r16, (1 << WGM01) ; 设置CTC模式 OUT TCCR0A, r16 ; 写入TCCR0A寄存器 LDI r16, 0x10 OUT OCR0A, r16 ; 设置比较值 SEI ; 开启全局中断 LDI r16, (1 << OCIE0A) STS TIMSK0, r16 ; 使能Timer0 Compare Match A中断 LDI r16, (1 << CS00); | (1 << CS02) ; 选择预分频器(无分频,高速运行) OUT TCCR0B, r16; 写入TCCR0B并启动定时器 rjmp MAIN .org 0x0020 ; 修正为正确的Timer0 Compare Match A中断向量地址 rjmp TIMER_INTERRUPT MAIN: rjmp MAIN TIMER_INTERRUPT: IN r16, PORTB LDI r17, (1 << PORTB0) EOR r16, r17 OUT PORTB, r16 reti
额外验证点
- 确认
TIMSK0的操作:ATmega328P的TIMSK0位于扩展I/O空间(地址0x6E),使用STS指令是正确的,无需修改。 - 全局中断
SEI的顺序:先开全局中断再使能定时器中断,或者反过来都可以,不影响功能,你的代码顺序没问题。
内容的提问来源于stack exchange,提问作者user27056768
相关产品推荐
相关产品推荐

