実験の目的

PICはRISC(Reduced Instruction Set Computer)アーキテクチャのマイクロコンピュータであり、基本的に1つの命令を1命令サイクル(=4クロック)で実行する。また条件分岐などのジャンプ命令は、2命令サイクルで実行する(PICのアセンブラ命令一覧を参照)。このため、実行する命令数を数えることで、正確に実行時間を求めることが可能である。

実験4および6において、命令のサイクル数を数えることにより、プログラムの実行速度(ステッピングモータの回転数、圧電ブザーの音の高さ)を求めることができる。ここでは、実験6のプログラム(List.4)を例に、実行速度を算出してみる。

サブルーチンWAIT1の実行サイクル数

サブルーチンWAIT1は、呼び出されると以下の順に命令を実行していく。

ラベル オペコード オペランド 命令
サイクル数
備考
WAIT1 MOVLW n 1
MOVWF COUNT2 1
:
LOOP2 NOP 1
DECFSZ COUNT2,F 1 n - 1回繰り返す
GOTO LOOP2 2
:
LOOP2 NOP 1
DECFSZ COUNT2,F 1
GOTO LOOP2 1 COUNT2が0なのでNOPに置き換わる
RETURN 2

したがって、WAIT1の実行サイクル数w1は、以下のようになる。

w1 = 1 + 1 + (1 + 1 + 2) (n - 1) + 1 + 1 + 1 + 2 = 7 + 4 (n - 1) [cycle]

サブルーチンWAITの実行サイクル数

サブルーチンWAITは、呼び出されると以下の順に命令を実行していく。

ラベル オペコード オペランド 命令
サイクル数
備考
WAIT MOVLW m 1
MOVWF COUNT1 1
:
LOOP1 CALL WAIT1 2 + w1
DECFSZ COUNT2,F 1 |m - 1回繰り返す
GOTO LOOP1 2
:
LOOP1 CALL WAIT1 2 + w1
DECFSZ COUNT1,F 1
GOTO LOOP1 1 COUNT2が0なのでNOPに置き換わる
RETURN 2

したがって、WAITの実行サイクル数wは、以下のようになる。

w = 1 + 1 + (2 + w1 + 1 + 2) (m - 1) + 2 + w1 + 1 + 1 + 2 = 3 + 8m + 4nm [cycle]

Bポート最下位ビット出力1周期のサイクル数

Bポート最下位ビット出力1周期の間に、以下の命令が実行される

ラベル オペコード オペランド 命令
サイクル数
備考
LOOP0
INCF PORTB,1 1
CALL WAIT 2 + w |2回実行して1周期
GOTO LOOP0 2

したがって、Bポート最下位ビット出力の1周期Tcは、

Tc = ( 1 + 2 + W + 2 ) × 2 = 16 + 16m + 8nm [cycle]

List.4では、n=2、m=127(0x7F)であるので、これを上式に代入すると、

Tc = 4080 [cycle]

となる。ここで、PICの1命令周期は4クロック周期である。したがって、例えば、クロック周波数が8MHzの場合、1命令サイクルに要する時間は、

4 / 8 = 0.5 [μs]

であり、Bポート最下位ビット出力の1周期T

T = 4080 × 0.5 = 2040 [μs] = 2.040 [ms]

となる。また周波数f

f = 1/T = 1/2.040 = 0.4902 [KHz] = 490.2 [Hz]

となる。


結果の算出と比較

各自、実験2で測定した自班のクロック周波数より、出力の周波数を算出し、これと実験6の実測結果と比較せよ。

また、実験4のステッピングモータの回転数の理論値をプログラム(List.2)より算出し、実験4の実測結果と比較せよ。