2012-03-22 9 views
0

私はArduinoにCharlieplexingを実装しようとしています。現時点では、3つの出力を使って6個のLEDを制御していますが、問題なく動作しています。問題は、私が自分の機能の1つに遅れを取るようになってきているように見えるこの再現性のあるバグがあることです。このバグは、私が多かれ少なかれ無関係な機能に遅延をかけると、私のシリアル入力が(Arduino USBケーブルを介して)混乱させてしまいます。 私はシリアルポートを介して1から6までの数字を送信してCharlieplexing配列を制御しています。Arduinoと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) 

上記はうまくいきますが、一度に1つのLEDだけが点灯します。もっと多くのことをするには、一度に多くの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を通して私のプログラムを実行しようと、それは問題の影響を受けていませんでした。

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

atoi機能がchar\0終わる配列をしたい:

+0

"AVRスタジオで実行中"とは何を意味するのですか?コードをプレーンCに調整していますか?その場合は、そのコードも貼り付けてください。 –

答えて

1

修正するための最初のものはこれです。あなたの場合、あなたの単一の文字の後ろに0バイトがある場合、あなたはラッキーになることができます。そして、コンパイラがあなたのtemp変数の後に何を入れているのかわからないので、この未知のものがその状態を変えるときは....

ので、代わりにこのコードを試してください。

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

その後、それが役立っている場合は報告しています。