- ベストアンサー
waitしない!C言語初心者のライントレーサー作成方法
- C言語初心者の方が作成したライントレーサーですが、後進がうまくいかない問題が発生しています。
- プログラムの中でmotor=0x60となっている箇所が後進の処理をしている部分ですが、何らかの原因で後進ができていないようです。
- 原因として、プログラム中のwait関数の処理がうまく動作していない可能性が考えられます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
motorはmainで定義した自動変数ですから、これに何を書き込んでもプログラムの外部へは何も反映されません。 質問ではTRISBやPORTBが何か記載がありませんが、質問のプログラムで後退だけでもモータが動くことを考えると、これらの変数がモータの制御ポートを表しているのでしょう。 無限ループの中を PORTB=0x90; wait(1000); PORTB=0x60; wait(1000); にしてどうなるか確認してみましょう。
その他の回答 (3)
- D-Matsu
- ベストアンサー率45% (1080/2394)
#2でも言われてますが「前進の命令が送られてないから」ですね。 motor=0x90だけではモーターへの指令になりません。
お礼
>motor=0x90だけではモーターへの指令になりません。 TRISB=0x00; でpicマイコンのポートBを出力と設定し、 PORTB=motor でポートBにmotorの値を代入しています。 後退はするので、その設定自体はあっていると思うんです。 (自信はありませんが・・・) 後退するということは、何らかの理由でmotor=0x90という指令がスキップされてしまっているのでしょうか?
- kmee
- ベストアンサー率55% (1857/3366)
> PORTB=motor; これで命令送ってるんだと思いますが 実際に送られる命令がどうなっているか、自分がマイコンになったつもりでプログラムを追ってみたらどうです?
お礼
別に問題ないと思うのですが…(泣
- kmee
- ベストアンサー率55% (1857/3366)
最適化で、forがまるまる削除されてたりしませんか? それか、実行時間が短かすぎてウェイトの役目をはたしてないか。
お礼
最適化はしてませんので、問題ないと思います。 試しにwaitの値を一ケタ増やしてみました。 すると、スイッチを入れた後にほんの少し間をあけてから後進しました。 ということはwaitされている?のでしょうか。 それはともかく、なぜ後退するんですか?? プログラム的には前進と後退を無限ループさせているので、後退しかしないというのはおかしいと思うのですが。。。 結局何が違うのでしょうか。。。
お礼
おおおぉ! 動きました! No.3のお礼のように、motorの値をPORTBに代入させていたのですが、これだとしっかりと動きました。 motorをPORTBに代入させるとだめなんですかね。。。 ともかく、ありがとうございます!