【求助】使用外部中断的时候死机
一个简单的演示实验:在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 使用外部中断时需要注意的地方吧? 原则上,你的attachInterrupt应该放到setup的最后,即初始化完成后再打开中断
另外你选择低电平触发,在中断处理程序里的第一行就应该是关闭中断,以防中断重入,在返回前再打开中断
big8pie 发表于 2014-3-4 09:31 static/image/common/back.gif
原则上,你的attachInterrupt应该放到setup的最后,即初始化完成后再打开中断
另外你选择低电平触发,在中 ...
感谢!!!! 问题解决了吗?我也遇到同样的问题了。。。。 1L的意思是,因为过早打开中断,而且一直被触发,因此cpu不断被占用的原因?
那,如果lz在硬件上改一下,从外部使得在复位一段时间后再使中断有触发,是不是就能解决init中显示的问题了?
中断程序一开始关中断,这我倒是没有想到。
页:
[1]