2012-03-22 57 views
0

我想在我的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上运行了一个程序,它并没有受到影响的问题。

+0

你对“运行AVR Studio”有什么意义?那么你是否将代码调整为纯C?如果是这样,请粘贴该代码。 – 2012-03-25 09:24:16

回答

1

以固定的第一件事情是这样的:

char temp = char(Serial.read()); 
/*byte*/ tempChar = atoi(&temp); 

atoi的功能要的char一个\0终止阵列。在你的情况下,如果在你的单个字符后面有一个0字节,你可能会很幸运。因为你不知道编译器在你的temp变量后面放了什么,当这个未知事物改变它的状态时,你是......

所以请尝试这个代码,而不是:

char temp = char(Serial.read()); 
tempChar = temp - '0'; 

如果已经帮助随即报案。