PIC18F452 の Lookup Table(1)
ADDWF PCL による方法

不具合

PIC16F877 
のプログラムを PIC18F452用に書替えました。モノを買ったら説明書などを詳しく読む前に、まず使ってみるのが大好きですから早速プログラムからページ切替やバンク切替のコマンドを削除して走らせてみました。

ADDWF PCL を使ったテーブルで問題が発生しました。
返って来るデータが RETLW 0xnn データテーブル1個飛びになっているのです。
これでは1バイトで扱える最大256個のデータの半分しか取出せません。

原 因

このときはじめてPIC18F452 ではプログラムカウンタが2つづつカウントすることを知りました。これが原因でした。
(2つづつカウントすることは DATA SHEET にはっきり書いてありました。)


解 決
データテーブルを呼出すときの Wレジスタの値について、偶数用のテーブルと奇数用のテーブルを用意して、テーブルを呼出すとき Wレジスタの値が偶数か奇数かチエックしてから相当のテーブルを CALL することにしました。

テストしたプログラムの主な部分を下に示します。

なお、PIC18F452ではテーブルポインタによる方法でデータテーブルを呼出すこともできます。

                                              2002.11.20
TABLE MOVLW H'nn' ;取出したいデータの番地を
MOVWF BANCHI,0 ;番地レジスタに入れる
MOVF BANCHI,0,0 ;番地が偶数か奇数か調べる
ANDWF B'00000001'
MOVWF TEMP,0
BTFSC TEMP,0,0
BRA ODD_DTA

EVEN_DTA MOVF BANCHI,0,0 ;偶数のときはここに分岐してくる
BSF PCLATH,4 ;データテーブルのあるアドレス H’1000’
CALL DTATBL_0
BCF PCLATH,4
MOVWF WORD_OUT,0 ;データをWORD_OUTレジスタに入れる
BRA DTA_OUT ;

ODD_DTA MOVF BANCHI,0,0 ;奇数のときはここに分岐してくる
BSF PCLATH,4 ;データテーブルのあるアドレス H’1100’
BSF PCLATH0
CALL DTATBL_1
BCF PCLATH,4
BCF PCLATH,0
MOVWF WORD_OUT,0 ;データをWORD_OUTレジスタに入れる

DTA_OUT RETURN ;データを持ち帰る

ORG H'1000' ;データテーブル 0
DTATBL_0 ADDWF PCL,1
RETLW 0
RETLW 2
RETLW 4
RETLW 6
RETLW 8
RETLW H'0A'
RETLW H'0C'
RETLW H'0E'

ORG H'1100' ;データテーブル 1
DTATBLE_1 ADDWF PCL,1
RETLW 1
RETLW 3
RETLW 5
RETLW 7
RETLW 9
RETLW H'0B'
RETLW H'0D'
RETLW H'0F'
END
PICの目次へ        トップページへ