我正在尝试在我的 Arduino 上实现Charlieplexing 。目前我使用 3 个输出来控制 6 个 LED,并且工作正常。问题是我有这个重新出现的错误,当我在我的一个功能中放置延迟时,它似乎来来去去。如果我在一个或多或少不相关的功能中放置一些延迟,该错误会导致我的串行输入(通过 Arduino USB 电缆)混乱。我通过串行端口发送 1 到 6 之间的数字来控制 Charlieplexing 阵列。
if(Serial.available() > 0)
{
tempChar = 0;
char temp = char(Serial.read());
tempChar = atoi(&temp);
Serial.println(tempChar, DEC);
}
然后将其转换为整数,然后由函数解释并转换为三个输入/输出端口中的每一个的正确端口状态。
void Charlie(byte input)
{
if(input == 1)
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
digitalWrite(2, 1);
digitalWrite(3, 0);
digitalWrite(4, 0);
}
else if(input == 2)
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
digitalWrite(2, 0);
digitalWrite(3, 1);
digitalWrite(4, 0);
}... (continues to input == 6)
以上工作非常好,但一次只会打开一个LED。要打开更多,我将不得不在 LED 之间切换 Arduino,以使其看起来一次打开更多。为此,我创建了一个新函数:
void Range(byte input)
{
if(input == 1)
{
Charlie(1);
}
else if(input == 2)
{
for(byte i = 1; i < 3; i++)
{
Charlie(i);
}
}
else if(input == 3)
{
for(byte i = 1; i < 4; i++)
{
Charlie(i);
delay(4);
}
}... (Continues to input == 6
这就是问题出现的地方。如果我在调用 Charlie() 函数后不包含 delay(),则串行输入中断。现在真正奇怪的是延迟不一定是任何东西,也就是延迟(0)会解决我的问题。
当我通过串行接口发送一些输入时,Arduino 会再次将其吐出。因此,如果我发送数字 1 到 6,它在串行控制台中将如下所示:
1 2 3 4 5 6
这是预期的。现在,如果我在没有正确延迟的情况下引入 Range() 函数,输出将如下所示:
15 25 35 45 55 65
这会破坏程序。
我知道这有点模糊,但我觉得很难解释。希望它对你有意义。
完整的代码可以在这里找到:http: //pastebin.com/t7tdtfid
更新
我尝试通过 AVR Studio 5 运行我的程序,但它没有受到问题的影响。