我想在我的Arduino上实现Charlieplexing。目前我使用3个输出来控制6个LED,并且它工作正常。问题是我有这个重新出现的错误,似乎来来去去,因为我把延迟放在我的一个函数中。如果我在一个或多或少的无关函数中放置一些延迟,该错误会导致我的串行输入(通过Arduino USB电缆)混乱。 我通过串口发送1到6之间的数字来控制Charlieplexing阵列。Charlieplexing与Arduino
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会再次吐出。所以,如果我发送至6号码1它看起来像这样的串行控制台:
这就是预期。现在,如果我没有介绍的权利范围()函数延迟了放看起来是这样的:
这将打破该程序。
我知道这有点含糊,但我觉得很难解释。希望这对你有意义。
完整的代码可以在这里找到:http://pastebin.com/t7tdtfid
UPDATE
我试图通过了AVR Studio 5上运行了一个程序,它并没有受到影响的问题。
你对“运行AVR Studio”有什么意义?那么你是否将代码调整为纯C?如果是这样,请粘贴该代码。 – 2012-03-25 09:24:16