Arduino MEGA 2560清除中断标志位

        Arduino 开发板在使用时会遇到手动清除外部中断标志位的情况,比如为了防止误触,在attachInterrupt()函数前复位待使用的中断标志位。

        一个外部中断0发生时在中断函数内detachInterrupt另外一个中断1,执行程序过程中外部触发中断1,但是由于失能,不能响应。程序执行后attachInterrupt被失能的中断1,然后系统会响应中断1的中断函数。就是中断1的响应虽然失能了,但是再次使能时又会响应失能期间的中断。是这样的吗?现在做两个红外传感器的外部中断,它们都会被先后触发,先触发哪个就响应哪个的程序,不响应后触发的程序。出现这种现象是因为AVR底层是这样的,中断分为“请求”和“使能”两层结构。事件发生后“请求”被硬件置位,只要“使能”开启就会依优先级进行中断。 attach/detach 两个函数都是只操作了“使能”控制位,而请求被保持了,才会造成上数局面。非要清除请求的话,直接在 寄存器的层面是请求位写 1,即可清除“请求”。Arduino UNO设置两个外部中断的问题-Arduino中文社区 - Powered by Discuz!

        Arduino UNO直接操作EIFR寄存器就可以:

EIFR= _BV(INTF0);               // Clear INT0 Request//清除UNO中断0请求
EIFR= _BV(INTF1);               // Clear INT1 Request//清除UNO中断1请求

        Arduino UNO只有两个中断,有些项目会使用Arduino MGEA 2560控制器(有6个中断中断0~5)。Arduino MEGA 2560操作EIFR寄存器有些不一样

EIFR = _BV(INTF4); //清除MEGA 2560中断0请求标志位//引脚2
EIFR = _BV(INTF5); //清除MEGA 2560中断1请求标志位//引脚3
EIFR = _BV(INTF0); //清除MEGA 2560中断2请求标志位//引脚21
EIFR = _BV(INTF1); //清除MEGA 2560中断3请求标志位//引脚20
EIFR = _BV(INTF2); //清除MEGA 2560中断4请求标志位//引脚19
EIFR = _BV(INTF3); //清除MEGA 2560中断5请求标志位//引脚18

        使用这种直接操作寄存器还是少数情况,改变程序结构也可以达到相同效果。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值