ファイルレジスタとそのコントローラを実装したので、簡単なテストをやってみました。
PICのプログラムを書かないと始まらないので、簡単なコードを書きました(最後に乗っけます)。
最初に、STATUSフラグをクリアして、Zフラグのみセットされるかチェック。
ここはうまく行っているようです。引き続き、addwf PCLでいわゆる「計算型GOTO」を使用してテーブル引きで、Wレジスタの値を4倍してます。
おっと、しくじってますね。ADDWF 02,1、flush信号が立って次のサイクルで強制的にNOPになってなければなりません。
インストラクションレジスタのフラッシュ制御に、PCLの書き込みの条件を忘れてました。修正後はこんな感じ。
OKのようです。
ところで、PIC16系のプログラムにおける分岐系の命令の出現率は実際のプログラムではどれくらいなんでしょうか?PICは原則1命令/1クロックですが、分岐系の命令の場合は、フラッシュサイクルのため2クロック必要な場合があります。仮に5命令に一回分岐が起きているとすると、全体では20%がフラッシュサイクルに費やされることになります。全部出来上がってから適当なプログラムでちょっと測ってみたいと思います。
----
本日の御託
いままでは、おおむね、「シンタックスエラーがとれれば、一発で正しく動く」という「天才プログラマ」モードだったのです(笑)がだんだんデバッグモード主体になりつつあります。
2007/08/10のステータスレジスタも(目視チェックで)バグを見つけました。そのまま晒しておきますので、ヒマな方は「ツッコミ」よろしく(笑)
include <P16f84.INC>
STARThere org 00
; checking behaviors of some special function regs
; STATUS Z flug must be set
clrf STATUS
clrf PCLATH
pagesel test_PCL
goto test_PCL
;;;;;
table_lookup
addwf PCL
retlw (4*0)
retlw (4*1)
retlw (4*2)
retlw (4*3)
retlw (4*4)
retlw (4*5)
retlw (4*6)
retlw (4*7)
retlw (4*8)
test_PCL
movlw 1
pagesel table_lookup
call table_lookup
movlw 3
pagesel table_lookup
call table_lookup
;
addlw 0
addlw 0
addlw 0
addlw 0
addlw 0
end