16F84A アセンブラに関する質問です。
使用環境はWindows10(64bit)、統合開発環境MPLAB X IDE v3.26、MPASMX v5.66,16F84Aによるアセンブルプログラムです。TIM0、TIM1、TIM2はGPRの初めのレジスタ3つ(0CH~0EH)に割り当ててあります。
; ----- WAIT 0.1Sec
WAIT_01S ; {4x(y+1)+3}*0.4*(10/f) [uS] OSC:f=10MHz
MOVLW 0FAH ; x=250(FAH) y=249(F9H) => 100001.2uSec(=0.1Sec)
MOVWF TIM1
W1S_1 MOVLW 0F9H
MOVWF TIM2
W1S_2 NOP
DECFSZ TIM2,F
GOTO W1S_2
DECFSZ TIM1,F
GOTO W1S_1
RETURN
1.NOPを外して、TIM2を0FAHとすることはできないのでしょうか。
2.”DECFSZ TIM1,F" は、TIM1 を一つずつ減らしていきその結果を TIM1 に格納し、TIM1 がゼロになったら次の行の”GOTO~”を飛ばし( NOP に強制的に読み替え)、次の行の"RETURN"へ進む、という意味だと思いますが、 DECFSZ の第2パラメーターの F はファイルレジスタを示す F なのでしょうか。この F が W だとワーキングレジスタに関して同じ処理をする、という意味になるのでしょうか。検索して出てきた書式がいまいち理解できません。
3.ラベル WAIT01_S の2重ループですが、 10MHz で作動させこの逆数の周期×4の長さを1サイクルとしたとき、内側のループのTIM2に初期値249を与え、このTIM2を一つずつ減らしていく過程で249サイクル消費し、TIM2がゼロとなった時点でもう1サイクル、それとNOPが1サイクルの合わせて251サイクルを、この内側のループで消費すると考えたのですが、コメントを読む限りどうも違うようです。いったいこのルーチンで消費するサイクル数をどう数えるべきなのでしょうか。コメントも違うような気がします。
4.最後のRETURNはどの行に対応しているのでしょうか。()などと同じように階層的ネスティングを構成するとすれば、最も手前にあるラベルW1S_2に対応しそうですが、それでは無限ループに落ちいてしまうと思います。それとも一行を丸々ラベルだけ使ったWAIT01_Sに対応するとかの何らかのルールが存在するのでしょうか。
5.シミュレータを指定してデバッグモードで走らせたときストップウォッチで模擬的に測定してみたのですが、仮想の動作周波数が1MHzであるにもかかわらず、どこにブレークポイント行にしても表示サイクルが1uSの4倍の4uSの整数倍になりません。ブレークポイントを示す行頭の四角の真ん中にひびが入っているマークも理解できません。
もしよろしかったらお分かりのところだけでも結構です。どなたかお教えくださいませんでしょうか。よろしく願いします。
お礼
やはりそうなんですね。 ありがとうございました^^