30~60秒に1回モーターを回したい
古いH8のマイコンが載った、(Beauto Chaserと呼ばれる)車型のロボットで30秒~60秒に1回ランダムにモーターを前後に回したいです。しかし、思うように動きません。
自分でC言語のコードを書いてHEWとFDTで読み込ませていますが、なぜかいつも32秒±1秒くらいまで待って動き始めます。しかも、プログラム上は前後の動きは30秒~60秒に1回しか無いはずなのに、8回とか10回とか繰り返してから、次の32秒±1秒のルーチンに入るようです。何がおかしいのでしょうか?
これが私のコードです:
#include<36064s.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "vs-wrc003.h"
void main(void)
{
const BYTE MainCycle = 60;
Init((BYTE)MainCycle); //CPUの初期設定
Mtr_Run(0,0,0,0); //モータを停止
LED(2); //オレンジのLED点灯
//ループ
while(1) { //メインループ
if(getSW()) { //スイッチが押されたら
int r = 30000;
while(1) {
Mtr_Run(-64,64,0,0); //前に進む
Wait(500);
Mtr_Run(64,-64,0,0); //後ろに下がる
Wait(500);
Mtr_Run(0,0,0,0); //モータを停止
srand(r);
r = rand() % 30000; //0~29,999の乱数を生成する…はず
Wait(30000 + r); //30~60秒待つ…はず
}
}
}
}
…これを10~20秒に設定すると正確に動きます。
8回くらいテストしましたが、12~20秒の間でランダムに動きました。しかも、前後の動きは必ず1回だけです。
なぜ30~60秒にするとダメなのでしょうか?
H8/36064のデータシートは見つけました:
http://robot.tamagawa.ac.jp:8080/cyber/H8cpp/rescue/rjj09b0049_h836064.pdf
ただ、タイマーが複数あって、どこを見たらいいのか分かりません。404ページもあって上限○秒みたいなのは書いてないんですよね…見つけられてないだけかもしれませんが。
あれこれ試行錯誤する前に質問しようと思い、今、質問しています。
よろしくお願いします。
※<time.h>が使えないマイコンでの疑似乱数の生成方法については、次回質問します。今回は一応、動いているので気にしません。
お礼
ご回答ありがとうございます。 提示していただいたサイトのアルゴリズムを参考にしたら簡単にかつ手早く用意できました! ありがとうございました~。