楽天市場
[無料でホームページを作成] [通報・削除依頼]

ビット列の並び替え その1

ビット列の並べ替え その1

ビットデータを所定のポートへ所定のタイミングで連続出力したい場合など、
ビットデータをMSB-LSBの並びからデータアドレスの並びに変更したい場合があります。

例えば図1のようなデータが0x40から始まるRAM領域に存在する場合
これがa0,b0,c0,・・・h0,a1,b1,c1,・・・f7,g7,h7の連続した64ビットデータで
a0からh7までをくり返してPORTA,0から出力したい場合には
配列の行と列を入れ替えて図2のような並びに変換してから

img_20130526-232812.jpg img_20130526-232841.jpg
図1.(左) 図2.(右)


bcf     TRISA,0 ;PORTA,0を出力に設定
movlw 0x40       ;FSR=0x40
movwf FSR

rlf       INDF,w    ;キャリーセット
rlf       INDF,f     ;RAMデータ書き換え、キャリー再セット
rlf       PORTA,f ;キャリーをPORTA,0から出力
incf     FSR,f      ;FSR=FSR+1
bcf      FSR,3     ;FSRは0x40と0x47の間を循環する
goto  $-5        ;無限ループ

とプログラムするほうがより直感的で、データ出力間隔(サイクル数)の調整も容易となります。

以下に図1のビットデータを図2のように変換するプログラムを示します。
(FSREG0にRAMの先頭を指定してサブルーチンmatrixをコールする。)
使用レジスタ(ユーザー定義) FSRREG0、INDEX0

サブルーチンでは再帰的に置換処理を8回実施します。
FSRREG0の値は毎回1ずつ加算され、サブルーチンの出口では都合8が加算されます。
FSRの値はFSREG0と最終アドレスの間を移動します。
ビット置換の領域は最初の8x8から7x7、6x6、5x5,4x4,3x3,2x2、1と変化します。

(注意)0x48から始まる64ビットを置換する場合には
btfss FSR,3   の行を   btfsc FSR,3    に変更する必要があります。

img_20130526-234049.jpg