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の目次へ トップページへ |