我想在我的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