1

私はロボットをプログラミングしていますが、残念ながら自律モードではいくつかの問題が発生しています。ボタンが押されたときに整数を1に設定する必要がありますが、プログラムがボタンを認識するためには、whileループ内にある必要があります。ご想像のとおり、プログラムは無限ループになり、整数値は4,000近くになります。

 task autonomous()
   {
    while(true)
        {
    if(SensorValue[positionSelectButton] == 1)
        {
            positionSelect = positionSelect + 1;
            wait1Msec(0350);
        }
        }
   }

待機を使用して値を取得できましたが、これは実行したくありません。これにアプローチする他の方法はありますか?

4

4 に答える 4

1

SensorValuewhile ループとは非同期で、プッシュ ボタン (つまり、トグル ボタンではない) である物理コンポーネントからのものであると仮定します。

task autonomous()
{
    while(true)
    {
        // check whether 
        if(current_time >= next_detect_time && SensorValue[positionSelectButton] == 1)
        {
            positionSelect = positionSelect + 1;

            // no waiting here
            next_detect_time = current_time + 0350;
        }

        // carry on to other tasks
        if(enemy_is_near)
        {
            fight();
        }

        // current_time 
        current_time = built_in_now()
    }
}

組み込み関数または整数をインクリメントして現在の時刻を取得し、最大値に達するとラップアラウンドします。

または、別の状況にある場合:

task autonomous()
{
    while(true)
    {
        // check whether the flag allows incrementing
        if(should_detect && SensorValue[positionSelectButton] == 1)
        {
            positionSelect = positionSelect + 1;

            // no waiting here
            should_detect = false;
        }

        // carry on to other tasks
        if(enemy_is_near)
        {
            if(fight() == LOSING)
               should_detect = true;
        }
    }
}
于 2013-01-25T03:58:48.627 に答える
0

ボタンの現在の位置を覚えて、その状態がオフからオンに変わったときにのみアクションを実行してみてください。

ハードウェアによっては、1ミリ秒に数回前後に反転したかのような信号を受信する場合もあります。それが問題である場合は、ボタンが最後にアクティブ化されたときのタイムスタンプも保存し、その後の短いウィンドウでの繰り返しイベントを無視することをお勧めします。

于 2013-01-25T02:36:25.947 に答える
0

あなたの質問は少し漠然と
しています。なぜこの変数をインクリメントする必要があるのか​​ 、どのように機能するのかわかりません...しかし、試してみます.ロボットが動くためにどのように機能するかをもう少し説明してください.もっと助けられるように。

task autonomous()
{
    int buttonPressed=0;
    while(true)
    {
        if(SensorValue[positionSelectButton] == 1)
        {
            positionSelect = positionSelect +1;
            buttonPressed=1;
        }
        else{
            buttonPressed = 0;
        }


        //use your variables here 
        if( buttonPressed  == 1){
            //Move robot front a little
        }

    }
}

一般的な考え方は次のとおりです。
まず、押されたすべてのボタンを検出し、それらに従って処理を実行し
ます。これらはすべてwhileループに入ります...それは永遠に実行されます(少なくともロボットが生きている限り:))
お役に立てれば!

于 2013-01-25T02:57:55.827 に答える
0

ボタンを割り込みに接続してから、割り込みハンドラーで必要な変更を行うことができます。

これは最善の方法ではないかもしれませんが、最も簡単です。


The Vex Robotics カタログから:

(12) 割り込みとして使用できる高速デジタル I/O ポート

したがって、おそらく、使用している Vex のどのマイクロコントローラーでも割り込みをサポートするでしょう。

于 2013-01-25T03:00:20.313 に答える