2018/7/4(WED) 【後方排気】SI:割り算で小数点
さて
ずっとYPVSインジケーター作りをしていたので
久々にシフトインジケータである。

どこまでやったのかも忘れかけていますが・・・
「エンジン回転数÷スピード」にて
今、何速で走っているかを表示しようとする
で、小数点の計算が必要ということで
仕事中にいろいろ考えてみた <ナイショだよ

70 ÷ 30 で考えてみる
小数点を考えなければ
↓こんな感じ
フォト

商が2で余りが10
で、商の小数点第一位を求めるとしたら
余りを10倍して、除数で割れば求まる
フォト

10を10倍して
除数30で割ると
フォト

商は3と。
つまり商の少数第一位は3ということ
よって、少数第一位まで求めると商は2.3ということになります。

ただ、ここで問題
8ビットで表現できるのは255まで。
今回、除数30とした場合
最大の余りは29となるわけで
それを10倍すると290となり
255を超える
つまり8ビットで計算できなくなるわけです。
なぜ8ビットじゃないといけないかというと
8ビットマイコンなんで、レジスタのサイズが8ビットなのだ。
まぁいろいろすれば8ビット以上の数値の計算もできるんですが・・・
面倒なので、8ビット内で計算したい。
ということで考えたのが
5倍して割り算して2倍する。
まぁ当然、誤差が出てきますが
それほど精度を求めていないので
大丈夫でしょう。

つまり先ほどの例でいけば
余り10を5倍します
フォト

除数30で割ります
フォト

商を2倍します。
つまり左に1ビットシフトします。
フォト

で、求まる解は2なので
商は2.2ということになります。
先ほどの2.3に比べると0.1の誤差が出ていますが
まぁこれくらいキャパでしょう <本当か???

さらに結果をBCD的な表現に変換します。
BCDってのは二進化十進表現のことね
えっと・・・Binary-coded decimalの略かな?
4ビット毎で数字0〜9を表現する方法です。
これをちょっと応用して
上位4ビットは整数部で
下位4ビットは少数部を表現することとすると
整数の商を4ビットシフトして
少数の商を足すとこんな感じになります。
フォト

というのを
アセンブラでテストプロを実装すると
以下の通り
フォト

割り算ルーチンは以前作ったのをコールします。
8行目と26行目で割り算ルーチンをコールしています。
15行目辺りは、一回目の割り算の余りを5倍しています
2回シフトして元の余りを足すことで5倍しています
う〜む。掛け算もメンドイ。
29行目は左シフトで2倍していることになっています。
てか、2回も割り算ルーチンをコールして大丈夫かな?
処理時間が結構かかります・・・計算してないけど・・・

で、実際に動くかシミュレーターで動かしてみると
フォト

計算結果が出たところでブレークしてみると
商は矢印のところね
「00100010」となっているので
4ビット毎にみると22となっています
つまり「2.2」ということで間違いないようです。

さて、バラバラにテストしてきたから
ボチボチまとめに掛からないと・・・
回路もボチボチと・・・
はたして完成することはあるのだろうか?