Arduino Mega2560 在连续两次调用 analogWrite 后重启
Arduino Mega2560 reboots after two consecutive calls to analogWrite
为什么这段代码导致Arduino Mega2560不断复位?
void setup() {
Serial.begin(9600);
Serial.println("SETUP");
delay(500); //without this line Serial prints "SESESESESE"
analogWrite(10, 100);
analogWrite(11, 50); //reboots after this line
}
void loop() {
Serial.println("LOOP"); //doesn't reach here
}
Arduino 串口输出如下:
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
注意事项:
1) 如果我将引脚 10 和 11 替换为其他引脚(例如 8 和 9),Arduino 不会重启,但它也会使用引脚 12 和 13 重启(我猜引脚 10-13 在某种程度上是特殊的) .
2) 如果我在对 analogWrite
的调用中使用相同的值(例如 100 和 100),Arduino 不会重启。
如果您将引脚设置为:
,则不应发生这种情况
void setup() {
pinMode(10, OUTPUT); // sets the pin as output
pinMode(11, OUTPUT); // sets the pin as output
此类重置通常是电源不良、噪音或连接不良(原型板不良)或 LED 引脚不良(例如,电阻器太小或损坏,或引脚损坏等)。
如果您的 mega 没有硬件缺陷并且有足够的电源或附加的硬件导致此缺陷,它应该按预期工作。
显然,编译器的优化是罪魁祸首。在程序开头添加这两行后,它终于可以正常工作了:
void setup() __attribute__((optimize("-O1")));
void loop() __attribute__((optimize("-O1")));
为什么这段代码导致Arduino Mega2560不断复位?
void setup() {
Serial.begin(9600);
Serial.println("SETUP");
delay(500); //without this line Serial prints "SESESESESE"
analogWrite(10, 100);
analogWrite(11, 50); //reboots after this line
}
void loop() {
Serial.println("LOOP"); //doesn't reach here
}
Arduino 串口输出如下:
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
注意事项:
1) 如果我将引脚 10 和 11 替换为其他引脚(例如 8 和 9),Arduino 不会重启,但它也会使用引脚 12 和 13 重启(我猜引脚 10-13 在某种程度上是特殊的) .
2) 如果我在对 analogWrite
的调用中使用相同的值(例如 100 和 100),Arduino 不会重启。
如果您将引脚设置为:
,则不应发生这种情况 void setup() {
pinMode(10, OUTPUT); // sets the pin as output
pinMode(11, OUTPUT); // sets the pin as output
此类重置通常是电源不良、噪音或连接不良(原型板不良)或 LED 引脚不良(例如,电阻器太小或损坏,或引脚损坏等)。 如果您的 mega 没有硬件缺陷并且有足够的电源或附加的硬件导致此缺陷,它应该按预期工作。
显然,编译器的优化是罪魁祸首。在程序开头添加这两行后,它终于可以正常工作了:
void setup() __attribute__((optimize("-O1")));
void loop() __attribute__((optimize("-O1")));