2012-03-22 55 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'; 

如果已經幫助隨即報案。