内容が重い話を続けて書いてると気分転換したくなったので、
少しだけ違うことを書いてみます。
ビットシフト使って割り算を行い、端数を四捨五入する丸め処理を行う方法です。
もちろん他にも方法は有ると思うので、これが正解というわけではありません。
ターゲットの石は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 件のコメント:
コメントを投稿