为什么delay()会导致我的arduino重置



我使用的是Arduino Uno,连接到USB屏蔽、RFID屏蔽(adafruit PN532)、LCD、EEPROM(24AA256)和RTC模块(DS1307)。我不会在这里发布我的代码,因为它太大了,并且被分隔在多个文件中。

在我的程序中,我意识到,如果我的程序进入某个函数,在进入一个又一个函数后,如果我在当前所在的函数末尾使用delay(),arduino就会重置。下面是我的意思的一个例子。

void a() { b(); }
void b() { c(); }
void c() { d(); }
void d()
{
lcd_string("Testing", 0x80);
delay(2000);      <---- Arduino resets at the delay here
}

起初,我认为这是因为我的动态内存为80%,当我编译时,他们说Arduino可能存在一些稳定性问题。所以我修改了我的代码,使得我的动态内存现在是57%。问题仍然存在。

我想delay()函数可能有溢出或其他什么,所以我尝试用下面的代码替换延迟。

unsigned long timing;
timing = millis();
timing += 2000;
while(millis() < timing);

Arduino仍然重置。

接下来,我想可能是因为我的arduino连接到了我的电脑,一些串行引脚可能导致了重置,所以我使用外部电源为arduino通电,并断开了USB连接。arduino仍然重置。

接下来,我想Timer1可能已经被delay()函数崩溃了,尽管delay函数使用了Timer0,所以我禁用了我的Timer1。arduino仍然重置。

还有其他我错过的可能性吗?我的程序存储空间为69%,我认为这不应该是个问题。

编辑

这是我的Timer1 ISR 代码

ISR(TIMER1_OVF_vect)
{
TCCR1A = 0;
TCCR1B = 0;
TCNT1  = 0;
OCR1A = 34286;// = (16*10^6) / (1*1024) - 1 (must be <65536)
TCCR1B |= (1 << CS12);  
// enable timer compare interrupt
TIMSK1 |= (1 << TOIE1);
triggered = 1;
}

所使用的任何其他标志中断都在库头文件中。我正在使用以下外部库
USB主机屏蔽库2.0
Adafuit PN532主

一个接近RAM损坏的小样本。。。

#define MEM_PER_LEVEL 50
#define TRY_TO_SURVIVE 10
void KillMe(int level) {
byte dummy[MEM_PER_LEVEL];
for ( byte  i = 0; i < MEM_PER_LEVEL; i++)
dummy[i]= i;
Serial.println(level);
delay(1000);  // not sure why this would hurt more than others
if (level < TRY_TO_SURVIVE) KillMe(level+1);
for ( byte  i = 0; i < MEM_PER_LEVEL; i++) {
if (dummy[i] != i) {
Serial.println(F("corruption happened")); 
while(1) {} // HALT
}
}
if (level == 0) 
Serial.println(F("survived"));
}
void setup() {
Serial.begin(9600);
KillMe(0);
}
void loop() { }

我也遇到了同样的问题——无论我在设置函数中设置了什么延迟,Arduino都会重新启动。

对我来说,问题是SoftwareSerial的一个实例的引脚号无效。

SoftwareSerial mySerial(30, 31);

任何其他回答这个问题的人都应该检查他们的密码是否适合他们所针对的董事会。不确定为什么只有在调用延迟时才会发生崩溃,如果有人对此有深入了解,我会感兴趣!

最新更新