Darkside(リンクエラー修正しました)

2018年6月25日(月) 21:11

作ればいい

 _Delay という文字列は、ソースのどこにも存在しない。
 しかし、Delay() という関数なら呼び出されている。これが、内部的には _Delay という名称でライブラリ参照している、というのは良くあるパターンだ。そこで Delay() という関数を検索すると、これは使用されている。
 しかしそれは2箇所ぐらいしかなく、ボタンが押されているのを待つループ内なので多分ミリ秒単位だろう。これなら、ソフトループ決め打ちでもそれなりに代替可能だ。

 ホンモノの delay.h というのは、クロックが異なっても汎用的に使えるようにするため複雑化している。40MHz 専用と割り切り、Delay() 関数を自分で用意すればいい。
 これでエラーは消滅し、リンクまで正常に通るようになった。
 十分だ。

 あとは、サンプルプログラムが想定しているピンアサインを調べ、こっちが希望するピンアサインへと書き換える。
 外部水晶が8Mhzなのを、10MHzで動くようクロック設定を書き換える。
 そんなあたりが重要作業となる。

 main() 関数スタート直後で、クロックを設定している。
CLKDIVbits.PLLPRE = 0;
PLLFBDbits.PLLDIV = 18;
CLKDIVbits.PLLPOST = 0;

 クリスタル8MHzから、40MHzを作っている。
 PLLPRE は0だと1/2 なので4MHz になる。
 PLLDIV は18だとx20なので、80MHz になる。
 PLLPOST は0だと、1/2なので40MHz になる。
 3段階を経て、確かに計算は合っている。だが、データーシートに違反している!

 PLLDIV 後は100〜200MHz でなければならない。80MHz は、範囲外である。MCCでクロック設定する場合は、範囲外の値は選択できないようになっている。だが、MCC無しではこの余りに複雑な設定を、中の人も見落としたようだ。
 こんなサンプルプログラムで、本当に大丈夫か?

 10MHz から 40MHz を作るのであれば、PLLPRE で1/5して、PLLDIVでx80して、PLLPOSTで1/4すれば良い。これで、完全に仕様を満たす。
CLKDIVbits.PLLPRE = 3;
PLLFBDbits.PLLDIV = 78;
CLKDIVbits.PLLPOST = 1;

・・・と書き換えれば 10MHz クリスタル対応化完了である。
 続いてピンアサインを変えればすぐだ、と思ったら甘い。実際にはまだまだやることが多い。

 サンプルでは、モーターの回転数を 60RPM から 6000RPM と想定している。最低 60RPM はともかくとして、上が 6000RPM では低過ぎて普通の540モーターの力を発揮できない。11000回転までキッチリ回しても、まだ足りないってのに。
 更に、戦車用だから逆回転も出来なければならない。ある程度サンプルの処理内容を理解しないと、どうにもならないだろう。

written by higashino [ドリル戦車] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4