极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14583|回复: 4

【求助】使用外部中断的时候死机

[复制链接]
发表于 2014-3-3 19:58:37 | 显示全部楼层 |阅读模式
一个简单的演示实验:
在nRF24L01的RX端设置了一个低电平触发的0号中断。现在的问题是设置了中断之后连setup函数都跑不完就死机了
  1. #include "Mirf.h"
  2. #include "nRF24L01.h"
  3. #include "MirfHardwareSpiDriver.h"
  4. #include "SPI.h"

  5. int led = 3;

  6. void setup()
  7. {
  8.         attachInterrupt(0,gotData, LOW);
  9.         Serial.begin(9600);
  10.         Mirf.spi = &MirfHardwareSpi;
  11.         Mirf.init();
  12.         Mirf.config();
  13.         Mirf.payload =        4;
  14.         Mirf.setRADDR((byte *)"1clie");
  15.         Serial.println("init ok");
  16. }

  17. void loop()
  18. {
  19.         Serial.println("waiting");
  20.         delay(1000);
  21. }

  22. void gotData()
  23. {
  24.         if(Mirf.dataReady())
  25.         {
  26.           //Serial.println("...");
  27.           digitalWrite(led , HIGH);
  28.           delay(500);
  29.           digitalWrite(led,LOW);
  30.         }
  31. }
复制代码

即串口连init ok都不输出了。
为了找到故障,将所有与Mirf库相关的代码注释掉

  1. /*
  2. #include "Mirf.h"
  3. #include "nRF24L01.h"
  4. #include "MirfHardwareSpiDriver.h"
  5. #include "SPI.h"
  6. */
  7. int led = 3;

  8. void setup()
  9. {
  10.         attachInterrupt(0,gotData, LOW);
  11.         Serial.begin(9600);
  12.         /*
  13.         Mirf.spi = &MirfHardwareSpi;
  14.         Mirf.init();
  15.         Mirf.config();
  16.         Mirf.payload =        4;
  17.         Mirf.setRADDR((byte *)"1clie");
  18.         */
  19.         Serial.println("init ok");
  20. }

  21. void loop()
  22. {
  23.         Serial.println("waiting");

  24.         delay(1000);
  25. }


  26. void gotData()
  27. {
  28.   /*
  29.         if(Mirf.dataReady())
  30.         {
  31.           //Serial.println("...");
  32.           digitalWrite(led , HIGH);
  33.           delay(500);
  34.           digitalWrite(led,LOW);
  35.         }
  36. */
  37. }
复制代码


依然是没有办法输出init ok到串口,也就是说加上中断就死机了。
继续,将attachInterrupt(0 , gotData , LOW)这一句注释掉,一切正常。

敢问小弟这里的中断有什么不正确的地方吗?

或者大家来讨论一下Arduino 使用外部中断时需要注意的地方吧?
回复

使用道具 举报

发表于 2014-3-4 09:31:00 | 显示全部楼层
原则上,你的attachInterrupt应该放到setup的最后,即初始化完成后再打开中断
另外你选择低电平触发,在中断处理程序里的第一行就应该是关闭中断,以防中断重入,在返回前再打开中断

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-4 19:35:39 | 显示全部楼层
big8pie 发表于 2014-3-4 09:31
原则上,你的attachInterrupt应该放到setup的最后,即初始化完成后再打开中断
另外你选择低电平触发,在中 ...

感谢!!!!
回复 支持 反对

使用道具 举报

发表于 2015-5-27 11:19:44 | 显示全部楼层
问题解决了吗?我也遇到同样的问题了。。。。
回复 支持 反对

使用道具 举报

发表于 2015-5-27 14:17:59 | 显示全部楼层
1L的意思是,因为过早打开中断,而且一直被触发,因此cpu不断被占用的原因?

那,如果lz在硬件上改一下,从外部使得在复位一段时间后再使中断有触发,是不是就能解决init中显示的问题了?

中断程序一开始关中断,这我倒是没有想到。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 21:14 , Processed in 0.036721 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表