- ベストアンサー
マイコンH8-3664走行カー改良プログラムの要約
- マイコンH8-3664走行カーのC言語プログラムを改良する方法について解説します。
- 元のプログラムでは、SW0がONで3秒間前進して停止し、OFFの後再度ONで3秒間前進して停止します。
- 改良版のプログラムでは、3秒間前進後、3秒右旋回を繰り返し、元の位置に戻るようにします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
一寸突っ込みいれると無反応になるのが多い中予想外に補足が入ったので また出てきました #2で書いた 動くような気がする はやっぱり間違い冷静に考えれば 元の位置に戻るわけが無い (3秒で180度回転するなら戻るけど直進3秒の先で3秒回転させても180度回るとは思えない) >補足1、 3秒間 左旋回 1回で、90度 向きを変えます! つまり 直進、左旋回、直進、左旋回、直進、左旋回、直進、すれば、元の位置に戻るということです。 一寸待ってください 上の動きじゃ元の位置に戻らないです (後一回左旋回と直進が不足してます) でもって更にコードも書いてみる気になりました ただ全文書く気にはならないので変更部のみ書き込みます 1. >if( count == 300 ) { > x = 1 ; if( count >= 300 ) { // ==でもいいが安全を考えて>=に変更 x ++; //処理ステップ変更 2. >while(1){ > a = PDR8 >> 4 ; > if( x == 0 && a == 0x0e ) { > PDR8 = 0x0a ; > _ei( ) ; > } > else if( x == 1 ) [ > PDR8 = 0x00; > _di( ) : > if (( PDR8 >> 4) == 0x0f) { > x = 0 ; > } > } >} _ei( ) ; //割り込み有効(開始) while(1){ //永久ループ switch( x ) { //処理ステップ番号 case 0: PDR8 = 0x0a ; //直進 break; case 1: PDR8 = 0x0e ; //左旋回 break; default: //処理ステップを初期化 x = 0; break; } } ※ 延々と直進と左旋回を繰り返します コードはネストのため全角文字(主にスペース)を含んでいます (そのまま貼り付けてコンパイルしてもエラーになります) コンパイルテストなどはしてませんのでエラーになったら適当に直してください きっちりやりたいなら一旦停止させるとか 割り込みの制御もちゃんとやるとかもう一工夫した方がいいでしょう そこらへんは自分で治してください 上の修正(変更)で最低限の動きはする・・・・はずです (最初に書いたように持ってもいないし使ったこともないので) 後忠告として もしこれは何かの課題であるのなら あなたの質問は自分に与えられた課題を人に丸投げしていることになります (時々そんな人を見受けますが) 自分にとって何の力にもなりません できないながらにも(自分で試行錯誤して)作ったうえで動かないどこが悪いんでしょう ならまだ救いがありますが 質問するに当たっても独自環境持ってる人限定で質問するなら かまいませんが(回答してくれる人は比例して少なくなるでしょう) 広く回答を求めたいなら質問方法にも気をつけるべきです 特に今回のようなハードが絡むプログラムなんか手元に 同じ環境を持っている人かハード制御ソフトなど作った人で無いと ほとんど意味が分かりません
その他の回答 (4)
- koi1234
- ベストアンサー率53% (1866/3459)
補足 先回の回数についてはなた間違えて書いたみたいだけど そこはもうおいといて 私が書いたコードでは(元々のコードも似たようなもんですが) 直進や回転動作を行っているときに常に同じコマンドを書き直してます 本来動作コマンド(PDR8へ)の書き込みは動作が切り替わる 一回だけやればいいはずです その点も改善した方がいいでしょう(自分で考えてください) 元々のコードはスイッチの状態によっては_ei()関数 何回もコールするけどそれって問題ないのかな? ってところが一番気になるところ
- koi1234
- ベストアンサー率53% (1866/3459)
#3また訂正 >>補足1、 3秒間 左旋回 1回で、90度 向きを変えます! つまり 直進、左旋回、直進、左旋回、直進、左旋回、直進、すれば、元の位置に戻るということです。 >一寸待ってください 上の動きじゃ元の位置に戻らないです >(後一回左旋回と直進が不足してます) なんか頭おかしくなってる これで戻りますね どちらにしても書いたコードは延々と繰り返すんで 適当に変えてください
- koi1234
- ベストアンサー率53% (1866/3459)
>大体この動きで元の位置に戻らないだろ って思うのは私だけ? 失礼 よくよく考えたら戻る気がしてきました
- koi1234
- ベストアンサー率53% (1866/3459)
実際そのマイコンボードを使ったことはありません 書かれてるソースコード見ての判断だけで書いています ソースを軽く眺めた限りは確かに >SW0がONで3秒間前進して停止 >SW0がOFFの後、再度ONで3秒間前進して停止 するプログラムです! らしきことをやっているかなと思えますがだから何だというのでしょうか? >3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ!というのですが? を作ってくださいということですか? 私にはそんな気はありませんが仮にそんな奇特な人がいるとして そもそもIOがどのように配線されてるかも分からないのでは まともなアドバイスもできないでしょう 書かれてるプログラムの他に >3秒右旋回(右モーターのみ回転) させるためにPDR8に何を書けばいいのか(どこのビットが右旋回に該当するのか) が分かりません (実際配線次第でどうにもなるといえばなりますが) もしかしたら直進が0x0a書いてるので0x8と0x02で右と左のモータ制御に 分かれてるんでしょうか? >3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ! 大体この動きで元の位置に戻らないだろ って思うのは私だけ?
お礼
大変、考えくださった様で、ありがとうございました。 参考になりました。 おしゃられたように、これから、じぶんで苦慮し考えるようにします。 マシン(走行カー)も私の所にあるのですから! どのような、マシン(走行カー)、どのように配線されているのかも解らないのに よく回答をくださいました。 大変失礼な質問だったと、反省しています。 無事、走行するようになりました。 本当に、『ありがとうございました!』
補足
ありがとうございます! (質問者 raccoon_7 です。) 後で、質問を見て訂正と補足ですが、 まず訂正、 「右旋回「右モータのみ回転」としましたが、 左旋回(右モータのみ回転)」の間違えでした。 補足1、 3秒間 左旋回 1回で、90度 向きを変えます! つまり 直進、左旋回、直進、左旋回、直進、左旋回、直進、すれば、元の位置に戻るということです。 補足2、 質問のビット、 0x0a が直進、 0x0e が 左旋回(右モータが回転)、 0x0b が 右旋回(左モータが回転)、とモータ制御されております!