【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

c言語初心者です。

ライントレーサーを作っています。

とりあえず前進して後進してを繰り返しそうと思って、以下のプログラムを立てました。



#include <pic.h>
__CONFIG(HS&WDTDIS&PWRTEN&UNPROTECT);

int wait(long);

void main(void)
{
int motor;
TRISB=0x00;

while(1)
{
motor=0x90;
wait(1000);

motor=0x60;
wait(1000);

PORTB=motor;
}
}

int wait(long a)
{
long i;
for (i = 0; i < a; i++);
return 0;
}


motor=0x90が前進で
motor=0x60が後進です。


これで動かしたところ、後進しかしませんでした。

どこに原因があるのでしょうか。

ご教授おねがいします。

A 回答 (4件)

motorはmainで定義した自動変数ですから、これに何を書き込んでもプログラムの外部へは何も反映されません。


質問ではTRISBやPORTBが何か記載がありませんが、質問のプログラムで後退だけでもモータが動くことを考えると、これらの変数がモータの制御ポートを表しているのでしょう。

無限ループの中を
PORTB=0x90;
wait(1000);
PORTB=0x60;
wait(1000);
にしてどうなるか確認してみましょう。
    • good
    • 0
この回答へのお礼

おおおぉ!

動きました!

No.3のお礼のように、motorの値をPORTBに代入させていたのですが、これだとしっかりと動きました。

motorをPORTBに代入させるとだめなんですかね。。。

ともかく、ありがとうございます!

お礼日時:2011/06/29 13:40

#2でも言われてますが「前進の命令が送られてないから」ですね。


motor=0x90だけではモーターへの指令になりません。
    • good
    • 0
この回答へのお礼

>motor=0x90だけではモーターへの指令になりません。


TRISB=0x00;
でpicマイコンのポートBを出力と設定し、
PORTB=motor
でポートBにmotorの値を代入しています。

後退はするので、その設定自体はあっていると思うんです。
(自信はありませんが・・・)

後退するということは、何らかの理由でmotor=0x90という指令がスキップされてしまっているのでしょうか?

お礼日時:2011/06/29 13:27

> PORTB=motor;



これで命令送ってるんだと思いますが
実際に送られる命令がどうなっているか、自分がマイコンになったつもりでプログラムを追ってみたらどうです?
    • good
    • 0
この回答へのお礼

別に問題ないと思うのですが…(泣

お礼日時:2011/06/29 12:51

最適化で、forがまるまる削除されてたりしませんか?


それか、実行時間が短かすぎてウェイトの役目をはたしてないか。
    • good
    • 0
この回答へのお礼

最適化はしてませんので、問題ないと思います。

試しにwaitの値を一ケタ増やしてみました。

すると、スイッチを入れた後にほんの少し間をあけてから後進しました。

ということはwaitされている?のでしょうか。

それはともかく、なぜ後退するんですか??

プログラム的には前進と後退を無限ループさせているので、後退しかしないというのはおかしいと思うのですが。。。

結局何が違うのでしょうか。。。

お礼日時:2011/06/28 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!