2019/01/27(SUN) 【Nチビ】すいおん!A
プログラムを考える

温度センサーは 6.25mV/℃ らしい。
では、
マイコン側で単純に電源の5Vをリファレンスとした時の
AD変換の粒度は、10ビットなので
5Vで、1023 = 3FFh だとすると

  5000mV ÷ 1023 = 4.9 mv/1bit

という粒度となる
いや、リファレンスする値を調整すれば
そこは調整つくんだけど
面倒なので電源電圧をリファレンスする。

センサーは0℃の時 424 mV らしいので
PICでAD変換すると

  424mV ÷ 4.9 mV/1bit ≒ 86(デジタル変換なので小数点以下切捨て)

100℃の時 1049 mv らしいので
PICでAD変換すると

  1049mV ÷ 4.9 mV/1bit ≒ 214

ということで

  y: 温度
  x: PICでのAD変換値

とすると温度(y)を求める式は以下のようになる。

  y = (25/32)(x - 86)

つまり
センサーから取得したAD変換値(X)から86引いた値を
25倍して32で割る。
32で割るということは

  32 = 2の5乗

なので
5bit右シフトすればOKなので簡単です。

25倍っていうのは

  25 = 11001b

なので
4bit左シフトした値と
3bit左シフトした値と
なにもしない値を足し算すれば
25倍したことになります。

PICのアセンブラでは
1bitシフトの命令しかないので
ループでシフトを繰り返すルーチンを作る

相変わらず、アセンブラで
まず変数
フォト

左シフトする関数。
フォト

PICマイコンのレジスタは8bitなんですが
8bitだと0〜255の値しか扱えないので
それだと今回の計算はできないので
16bitに拡張して計算しています。
今回は左シフトなんで単純です
左シフトして桁が溢れたら
キャリービットが立つので
上位側に+1すればOK

シミュレーターで動かしてみましょう
127 を 4 bitシフトしてみます。
結果は以下の通り
フォト

赤枠で囲ったところが
上位と下位となるので

  00000111 11110000b

つまり
10進数でいうと

  2032

127 を 4 bitシフトするというのは
127 を 16倍することなので

  127 × 16 = 2032

合っていそうですね。
今日はここまで。