1 つの命令を実行するためにかかる時間(1 サイクル)は、クロックの周期(sec) * 4、あるいは、4 / クロックの周波数(Hz) となります。 具体的な値は次のようになります。
プログラムカウンタの値を変更する命令の場合は、2 サイクルの時間がかかります。 このような命令には CALL, GOTO, RETFIE, RETLW, RETURN があります。 また、DECFSZ, INCFSZ, BTFSC, BTFSS でスキップした場合も 2 サイクルかかります。
遅延を発生させるサブルーチンを作る場合は、次のような手順で作成します。
サブルーチンに必要なサイクル数は、遅延時間 / 1 サイクルにかかる時間で求めることができます。 例えば、10MHz (0.4μsec) で 100μsec の遅延を作りたい場合は、100 / 0.4 = 250 サイクルが必要になります。
ループ回数は、(1 で求めたサイクル数 - 6) / 3 で求められます(余りは NOP で調整します)。 -6 の部分は、MOVLW, MOVWF, DECFSZ(2), RETURN のサイクルで、/3 の部分は、DECFSZ(1), GOTO の部分の実行回数を求めています。 以下にいくつかの遅延時間発生ルーチンの例を示します。
1 秒などの長い遅延時間を作成する場合、ループ用カウンタのオーバーフローを避けるため、短い遅延時間のサブルーチンを何度も呼び出すことになります。 この時、ループのカウントに使用する変数は別のものを使用することに注意してください。
クロックの周波数と、作りたい遅延時間を入力して「作成」ボタンを押してください。 遅延時間を発生するためのサブルーチンが表示されます。 ただし、あまり大きな遅延時間は作成できません(カウンタ用の変数がオーバーフローするため)。