実験の目的
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の実測結果と比較せよ。