こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PICで小数点の演算

PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、

v = x * 5 / 1023  ・・・(1)
ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。
y = 218.5 - v / 0.008  ・・・(2)
又は
y = 218.5 - 125 * v  ・・・(3)

上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。
どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。

投稿日時 - 2008-11-02 21:36:29

QNo.4449094

困ってます

質問者が選んだベストアンサー

y0=(21850-12500*v)/100;
y1=((21850-12500*v)%100+5)/10;

y0は整数部、y1は小数点第1位の値となります。
乗算は、左シフトとANDと加算があればできます。

例えば、0110×0101であれば、

 (00110000(←被乗数を3ビット左シフト) AND 0(←乗数のビット3))
+(00011000(←被乗数を2ビット左シフト) AND 1(←乗数のビット2))
+(00001100(←被乗数を1ビット左シフト) AND 0(←乗数のビット1))
+(00000110(←被乗数を0ビット左シフト) AND 1(←乗数のビット0))

となります。

値のビット数は、12500が16ビットなので、vが8ビットであっても16ビット×16ビット(ビット数の拡張が必須)=32ビットが必要になります。

プログラムは、自分の力でコーディングしてください。

投稿日時 - 2008-11-02 22:11:09

お礼

回答ありがとうございます。
アセンブラはほとんど書いたことがなく初めてに近かったので、実際のソースと見比べてどのようになっているのかを一行ずつ理解していこうと考えていたのでついソースを要求するような質問になってしまいました。
もう少し時間をかけて考えてみたいと思います。

投稿日時 - 2008-11-03 23:52:03

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問