ほぷしぃ

P-ROBO(ピーロボ)

始めに /  P-ROBOプログラミングの基本 /  レジスタの設定 /  割り込み処理 /  メイン関数 /  初期化 /  サブ関数群 /  実走行

メイン関数

ライントレースを行うにあたって作成したメイン関数を紹介します。

1.メイン関数

メイン処理の関数です。起動して電源がOFFされるまで動作する為に、内部の処理は無限ループとなっています。

  1. 初期化処理
  2. 割り込み許可
  3. ロータリスイッチ読み込み
  4. 赤外LEDセンサフラグオン
  5. 赤外LEDセンサオン
  6. 赤外LEDセンサ読み込み
  7. モータ動作選択
  8. モータ動作設定
  9. センサ状態のバックアップを行う

・メイン関数 流れ図



・メイン関数 プログラム

void main(void)
{
    init();             // 初期化処理

    IntrEnable();          // 割り込みスタート

    UserLedCtrl(LED_OFF);      // ユーザLED:OFF

/*** debug start ***/          // デバッグ用(目視にて動作確認を行う為に)
    UserLedCtrl(LED_ON);       // ユーザーLEDをONにする
    Wait(0, 100);          // 1秒待ち
    UserLedCtrl(LED_OFF);      // ユーザーLEDをOFFにする
/*** debug end ***/

  while(1){              // 電源が切られるまで動作(無限ループ)
    ReadSensor();          // 赤外LEDセンサデータ取得
    iSensorData &= 0x07;
    Wait(0, 1);           // 時間待ち(10ms)

    switch(iSensorData){       // センサー状態により判断
      case 0:           // センサー取得なし
        switch(iSensorBack){   // 前回の状態を参照して動作を決定する
          case 0:
          case 2:
          case 5:
          case 7:
            iMoveR = 0x03;
            iMoveL = 0x03;
            iSpeedR = 0;
            iSpeedL = 0;
            break;
          case 1:
            iMoveR = 0x01;
            iMoveL = 0x02;
            iSpeedR = 20;
            iSpeedL = 20;
            break;
          case 3:
            iMoveR = 0x02;
            iMoveL = 0x02;
            iSpeedR = 0;
            iSpeedL = 20;
            break;
          case 4:
            iMoveR = 0x02;
            iMoveL = 0x01;
            iSpeedR = 20;
            iSpeedL = 20;
            break;
          case 6:
            iMoveR = 0x02;
            iMoveL = 0x02;
            iSpeedR = 20;
            iSpeedL = 0;
            break;
          default:
            break;
        }
        break;
      case 1:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 10;
        iSpeedL = 25;
        break;
      case 2:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 20;
        iSpeedL = 20;
        break;
      case 3:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 15;
        iSpeedL = 20;
        break;
      case 4:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 25;
        iSpeedL = 10;
        break;
      case 5:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 15;
        iSpeedL = 15;
        break;
      case 6:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 20;
        iSpeedL = 15;
        break;
      case 7:
        iMoveR = 0x02;
        iMoveL = 0x02;
        iSpeedR = 25;
        iSpeedL = 25;
        break;
      default:
        break;
    }

    MoveMotorR(iMoveR ,iSpeedR);  // 右モータの制御を行う
    MoveMotorL(iMoveL ,iSpeedL);  // 左モータの制御を行う

    if(iSensorData != 0x00){    // 赤外LEDセンサデータチェック
      iSensorBack = iSensorData; // 赤外LEDセンサデータをバックアップする
    }

  }
}


前のページへ ページのトップへ 次のページへ