2021年1月1日金曜日

PIC18Fで丸め処理を含む8除算

 内容が重い話を続けて書いてると気分転換したくなったので、
少しだけ違うことを書いてみます。

ビットシフト使って割り算を行い、端数を四捨五入する丸め処理を行う方法です。
もちろん他にも方法は有ると思うので、これが正解というわけではありません。

ターゲットの石はPIC18F47K40等のPIC18Fシリーズとします。
16Fシリーズだと命令が異なる為、そのまま使えません。

16ビット長のデーターを8で割る例です。
上位がDATA-H、下位をDATA-Lと仮定。

1)    RRCF    DATA-H,1,0
2)    RRCF    DATA-L,1,0
3)    RRCF    DATA-H,1,0
4)    RRCF    DATA-L,1,0
5)    RRCF    DATA-H,1,0
6)    RRCF    DATA-L,1,0
7)    CLRF    WREG,0
8)    ADDWFC    DATA-L,1,0
9)    ADDWFC    DATA-H,1,0
10)    MOVLW    
0x1F
11)    ANDWF    DATA-H,1,0

説明しやすいように、頭に行番号をつけておきました。

まず、1行目~6行目でビットシフトを使って8除算。

7行目~9行目が丸め処理です。
4行目まででデーターが奇数だった場合、
6行目の処理後にキャリービットが立っているわけです。
このキャリービットが端数と見なせるので、キャリービットが寝てれば切り捨て、
ビットが立っていれば切り上げすればいいわけです。
それを7行目と8行目で実行しています。
DATA-Lの切り上げ処理の結果、繰り上がりが発生する場合もあるので、
9行目で繰り上がりの処理を行っています。

最後、DATA-HのMSB側3ビットには不要データーが入るので、
10行目と11行目でそれを除去しています。


2021/1/25 追記
上記のコードだと問題有る点を発見。
元DATAがか0xFFFFの場合、処理後のDATAが0x2000になってしまいます。
(正しくは0x1FFF)

DATAがフルスケール値の場合のみ、繰り上げをスルーする処理が必要ですね。

0 件のコメント:

コメントを投稿