2013年8月4日日曜日

floatが使えないので計算結果を整数化して配列に入れて使う 今日のfirmware実験 USB (funny keyboard v2b) 前半

トラックボールモジュールが回転のパルスを出したら発生する外部割り込み関数内で、

Xp += 1;  のように
普通に考えれば、トラックボールモジュールが回転のパルスを出したらその回数を素直にホスト(PC)へのマウスカーソルの移動量として報告(Xp)するのだと思うのですが、

どうにも移動がゆっくりすぎて、とてもじゃないけど広い画面では実用に耐えそうにありません。

そこで、

Xp = (NCfm*(pow((xcip*1.0),2.0)+(xcip))+0.5);
ホスト(PC)から、マウスカーソルの移動量の報告依頼があるまでの間に、トラックボールモジュールが回転のパルスを何回出したか(xcip)によって指数関数的に、ホスト(PC)への報告量(Xp)を決める、ということを考えたのですが(NCfmは定数)、
Keil uVision2 試供版では、なんとfloatが使えない=pow()も使えないということが、昨日判明しました。

やりたいことは、マウスカーソルの移動量を増やしてやること。
永遠に増やし続けるなんてことはありません。
ホスト(PC)からのマウスカーソルの移動量の報告依頼の時間間隔内に、トラックボールモジュールが回転のパルスを何回出すことができるのかは、分かりません。

とりあえず、今回は実験のために、上の式のxcipが1から24までの24個の計算を外部で行い(表計算ソフトで簡単にできます)、結果を配列にハードコーディングしてしまいましょう。

#define MAXxyi 24 
char RC[MAXxyi] = {1,2,3,5,7,9,12,16,20,24,28,34,39,45,51,58,65,73,81,89,98,108,117,127};

if (xcip <= 23){
     Xp = RC[xcip];
} else {
     Xp = 127;
}
xcip += 1;

ただし、この方式では、どこかのタイミングで増やしたホストへの報告用の移動量を初期化(ゼロに戻す)する必要があり、今はホストが値を読み取ったら初期化しようと考えています。
しかし、考えられるのは、マウスカーソルの移動スピードがガクン、ガクン、と落ちて一定せずに、きっと気持ち悪いんだろうな、ということ。


上向きの短い矢印のところでホストへの報告が出る、と、移動量が初期化されるので、マウスカーソルが移動するスピード(グラフの傾き)が、ガクンガクンするだろう。。。。

0 件のコメント: