You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:42:41