PIC アプリケーションで任意の時間またはプログラム サイクル数のウェイトが必要になった場合、NOP
などの無駄な命令を必要なだけループで回して時間を稼ぐ方法があります。動作クロックが 10 MHzであった場合、一段のループで稼げるのは高々 2,000 サイクル 900 μ秒程度です。更に長い時間を稼ぐには、このループを二段、三段と入れ子にする必要がありますが、そうすると、所望するウェイトに対して各ループ段に必要なループ回数を正確に求めることが困難になります*1。
そこで、複数段のループで構成されるウェイト処理について、最適なループ回数を簡単に計算できる Excel シートを作ってみました。所望するウェイト時間またはサイクル数を入力して、Excel のソルバー アドオンで最適解を見つけられます。また、GUI で数値を増減させて、手作業で近似解を求める作業をお手伝いします。
WAIT: ;--- LOOP3>>> --- movlw D'86' ; 1 cycle movwf CNT3 ; 1 LOOP3: ;--- LOOP2>>> --- movlw D'86' ; 1 movwf CNT2 ; 1 LOOP2: ;--- LOOP1>>> --- movlw D'86' ; 1 movwf CNT1 ; 1 LOOP1: <NOP> ; nop decfsz CNT1, F ; 1 goto LOOP1 ; 2 <NOP1> ; nop1 ;--- <<<LOOP1 --- decfsz CNT2, F ; 1 goto LOOP2 ; 2 <NOP2> ; nop2 ;--- <<<LOOP2 --- decfsz CNT3, F ; 1 goto LOOP3 ; 2 <NOP3> ;--- LOOP3>>> ---
NOP
で 1 サイクル、GOTO $+1
で 2 サイクル稼げますが、そもそも稼げる無駄時間が少ないので、これを必要回数だけループで回す必要があります。しかも、このループの終了判定や繰り返し自体にも数サイクルを要するので、無駄命令を増やしてウェイトを稼ぐよりも、ループ回数を増やした方が楽ちんです。そのため、あってもなくても構いません。GOTO LOOPx
でループを繰り返します。この処理だけでも 3 サイクルを要してしまうので、先述のように場合によっては 14 行目はなくても良いのです。LOOP1
の実行サイクル数; LOOP1LOOP2
の実行サイクル数; LOOP2LOOP3
の実行サイクル数; LOOP3…とまぁ、こんな感じで上記計算のように、二段目以降になると前段のループ回数が入れ子で乗算に係ってくるため、サイクル数を正確に求めることが難しくなります。
例えば、2 段のループで 10,000 サイクルのウェイトを構成したい場合、CNT1 と CNT2 は幾つにすればよいでしょうか? 大ざっぱに計算すると、1 段目のループで 100 サイクル稼いで、これを 2 段目のループで 100 回回せば良さそうなので、これを土台にして、CNT1=33, CNT2=98 を計算すると 10,095 サイクル、CNT1=33, CNT2=97 であれば 9,992 サイクルを求められます。
大ざっぱなウェイトであればこれで十分ですが、もうちょっと正確に求められないでしょうか? 例えば、1 段目で 50 サイクル稼いだ上で、2 段目のループでこれを 200 回回してみるとか… つまり (1 段目)×(2 段目)=10,000 となるような計算になるのですが、各変数が 0 から 255 の整数値しか取れないという制約があるので、良い答えを見つけるために試行錯誤が必要になるのです。
ちなみに、後述の計算用シートを用いて求めた値では、CNT1=132, CNT2=25 で 10,001 サイクルを得ることができます。
シート内でイタリック体で書かれている数字はユーザが入力します。
nop
命令で 1 サイクル、goto $+1
で 2 サイクル浪費できます。多くすれば 1 段ループあたりの最大ウェイトを大きくでき、かつソルバー利用で最適解を求められる幅が広がりますが、その分プログラムメモリを消費しますので、微調整目的で。NOPx
、CNTx
LOOPx
)と実行時間(Tx
)を求められます。また、その下の +/- ボタンを押すと数値を増減できます。LOOPx
または Tx
に所望する値を入力して、Microsoft Excel の ソルバー アドオンを利用すれば、各段の NOPx
、CNTx
について最適な設定値を計算してくれます。ソルバーの設定内容は、ページ下段のソルバー用設定内容ストアのセル内容を、ソルバー ダイアログから読み込んでから利用してください。
Microsoft Excel 以外、例えば LibreOffice などのオフィス スートでも、このシートを読み込んで利用できますが、ソルバーを用いて最適解を求めることができません。非線形問題に対応したソルバー エンジンが必要ですが、LibreOffice には線形アルゴリズムのエンジンしか搭載していないためです。*3