Rayne_Hwang 发表于 2014-3-3 19:58:37

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

一个简单的演示实验:
在nRF24L01的RX端设置了一个低电平触发的0号中断。现在的问题是设置了中断之后连setup函数都跑不完就死机了
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
#include "SPI.h"

int led = 3;

void setup()
{
      attachInterrupt(0,gotData, LOW);
        Serial.begin(9600);
        Mirf.spi = &MirfHardwareSpi;
        Mirf.init();
        Mirf.config();
        Mirf.payload =        4;
        Mirf.setRADDR((byte *)"1clie");
      Serial.println("init ok");
}

void loop()
{
        Serial.println("waiting");
        delay(1000);
}

void gotData()
{
        if(Mirf.dataReady())
        {
          //Serial.println("...");
          digitalWrite(led , HIGH);
          delay(500);
          digitalWrite(led,LOW);
        }
}
即串口连init ok都不输出了。
为了找到故障,将所有与Mirf库相关的代码注释掉

/*
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
#include "SPI.h"
*/
int led = 3;

void setup()
{
      attachInterrupt(0,gotData, LOW);
        Serial.begin(9600);
      /*
        Mirf.spi = &MirfHardwareSpi;
        Mirf.init();
        Mirf.config();
        Mirf.payload =        4;
        Mirf.setRADDR((byte *)"1clie");
      */
      Serial.println("init ok");
}

void loop()
{
        Serial.println("waiting");

        delay(1000);
}


void gotData()
{
/*
        if(Mirf.dataReady())
        {
          //Serial.println("...");
          digitalWrite(led , HIGH);
          delay(500);
          digitalWrite(led,LOW);
        }
*/
}


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

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

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

big8pie 发表于 2014-3-4 09:31:00

原则上,你的attachInterrupt应该放到setup的最后,即初始化完成后再打开中断
另外你选择低电平触发,在中断处理程序里的第一行就应该是关闭中断,以防中断重入,在返回前再打开中断

Rayne_Hwang 发表于 2014-3-4 19:35:39

big8pie 发表于 2014-3-4 09:31 static/image/common/back.gif
原则上,你的attachInterrupt应该放到setup的最后,即初始化完成后再打开中断
另外你选择低电平触发,在中 ...

感谢!!!!

m.mm 发表于 2015-5-27 11:19:44

问题解决了吗?我也遇到同样的问题了。。。。

pumpitup 发表于 2015-5-27 14:17:59

1L的意思是,因为过早打开中断,而且一直被触发,因此cpu不断被占用的原因?

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

中断程序一开始关中断,这我倒是没有想到。
页: [1]
查看完整版本: 【求助】使用外部中断的时候死机