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

ATTiny13项目中AVR仿真器XINT0外部中断异常触发问题咨询

ATTiny13 ExtInt0仿真异常问题原因及解决方案

根本原因

你的代码存在两个核心配置遗漏,不是仿真器bug:

  1. 未配置INT0触发条件
    ATTiny13的INT0触发方式由MCUCR寄存器的ISC01、ISC00两位控制,上电默认值为00,对应低电平触发模式。你全程没有修改这两位的配置,只要INT0引脚(PB0)处于低电平就会触发中断。
  2. PB0输入未配置上拉电阻
    你将PB0设为输入模式,但没有给PB0置位开启内部上拉,也没有外接上拉电路。仿真环境下未定义的高阻输入引脚电平默认是浮动/低电平,刚好满足低电平触发的条件,因此会持续触发INT0中断。

对应观察现象的解释

  • 单步运行不触发中断:仿真器单步执行时会默认挂起中断异步采样逻辑,或固定未定义引脚电平为高电平保证单步执行的确定性,因此不会触发中断。
  • 全速运行7-8周期就进中断:全速运行时仿真器会按照真实的硬件逻辑处理未定义输入,识别到PB0低电平后就会进入中断,7-8周期是AVR内核响应中断的固定延迟周期。
  • GIFR寄存器没有标志位:低电平触发的中断不需要锁存标志位,只要引脚电平满足条件就直接触发中断,只有边沿触发的中断才会在GIFR中置位锁存标志,这是AVR内核的标准设计,不是仿真问题。
  • AVR Studio4执行到rjmp IdleKey就进中断:不同版本的仿真器对未定义引脚电平的处理逻辑略有差异,AVR Studio4刚好在该指令执行周期采样到PB0低电平,因此触发中断。

修复方案

  • 新增INT0触发方式配置:如果你需要按键下降沿触发中断,在初始化GIMSK前添加如下代码:
ldi TmpReg, (1<<ISC01) ; 下降沿触发INT0
out MCUCR, TmpReg
  • 开启PB0内部上拉:在PORTB初始化时添加PB0的置位逻辑:
ldi TmpReg, (1<<PB0)|(1<<PB1)|(1<<PB2) ; PB0上拉开启,PB1/PB2输出高
out PortB, TmpReg
  • 优化中断服务程序冗余逻辑:AVR进入中断时硬件会自动关闭全局中断(清I位),退出时reti会自动恢复I位,你在ISR开头的cli是冗余代码可以删除。另外你在ISR里关闭了GIMSK的INT0位,需要在主循环处理完按键事件后重新开启INT0,否则后续不会再响应外部中断。

内容的提问来源于stack exchange,提问作者Wallace and Gromit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:27:04