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