プロが教える店舗&オフィスのセキュリティ対策術

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は少数第二位を四捨五入したいと思っています。
どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。

A 回答 (1件)

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ビットが必要になります。

プログラムは、自分の力でコーディングしてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/03 23:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!