PIC18F452 の Lookup Table(2)
テーブルポインターによる方法
テーブルポインター読出し

ADDWF PCL を使ってデータを読み出す方法とは別の方法でデータテーブルからデータの読出しができます。

データが入っているプログラムアドレスをテーブルポインタ(TBLPTR)
TBLPTRU TBLPTRH TBLPTRL に入れてテーブル読出し命令TBLRD を実行すると テーブルラッチTABLAT(8ビット)からテーブルポインタに指定したデータが取出せます。
テーブル読出し命令の TBLRD はオペコードの付け方で命令の動きが変ります。

  オペコード      動作内容
 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
    *        TBLPTR は変化しない
    *+      TBLPTR は読出し後インクリメントされる
    *-      TBLPTR は読出し後デクリメントされる
    +*      TBLPTR は読出し前にインクリメントされる

 (注:書込み命令に TBLWT がありますが、オペコードは上と同じ動作です。)

ここでは TBLRD*+ を使い DATAに入れた値を読取って PORTB に入れた 8個のLEDを数値に応じて点灯するプログラムをテストしてみました。

PIC18F452のプログラムカウンタは+2づつ進みますが、TBLRD*+はポインタを +1づつ進めて2バイトのデータを下位バイト、上位バイトの順に1バイトごとの読出しをします。

H’00’ から H’0F’ までのデータを H’1000’ 番地から2バイトづつ入れておき、順次取出して LEDを点灯します。最初のデータ H’00’は点灯しません。

プログラムの主要部分は次の通りです。 
プログラム中 DLY300M は 300mSecタイマーのサブルーチン(記述省略)です。

下のプログラムは アクセスバンクによる方法で書いてあります。
MOVWF F,a などのオペコード a=0 は全部省略しています。
                                       2002.11.23
                                       2003. 2.24 改定
                                       2004.10.12 修正
   
MAIN MOVLW H'08' ;データを順次16文字取出す
;データはH'1000' 番地から
MOVWF BANCHI ;番地レジスタに入れる
MOVLW B'00000000' ;TBLPTRU は H'00'
MOVWF TBLPTRU
MOVLW B'00010000' ;TBLPTRH は H'10'
MOVWF TBLPTRH
MOVLW B'00000000' ;TBLPTRL は H'00'
MOVWF TBLPTRL
READ_WORD TBLRD*+ ;データを読込したら ポインタ+1
MOVF TABLAT,W ;下位バイトデータを読む
MOVWF WORD_EVEN ;偶数用レジスタに入れる
MOVF WORD_EVEN,W ;下位バイトのデータでLED点灯
MOVWF PORTB
CALL DLY300M ;300mSec 遅延サブルーチンへ
TBLRD*+ ;データを読込したら ポインタ+
MOVF TABLAT,W ;上位バイトデータを読む
MOVWF WORD_ODD ;奇数用レジスタに入れる
MOVF WORD_ODD,W ;上位バイトのデータでLED点灯
MOVWF PORTB
CALL DLY300M ;300mSec 遅延サブルーチンへ
DECFSZ BANCHI,1 ;BANCHI - 1
BRA READ_WORD ;ゼロでなければ READ_WORD へ
GOTO MAIN ;ゼロなら繰り返す
ORG H'1000'
DATA H'0100' ;取出順 [n] は [1]H'01' [0]h'00'
DATA H'0302' ;[3]H'03' [2]h'02'
DATA H'0504' ;[5]H'05' [4]h'04'  ・・・ となる
DATA H'0706'
DATA H'0908'
DATA H'0B0A'
DATA H'0D0C'
DATA H'0F0E'
END
PIC目次へ         トップページへ