stlと申します。
タッチセンサの測定値を任意の値に変更したいのですが、どの変数で変更が可能でしょうか?
「変更」=スケーリングですか?(「変更」の解釈が合ってないかも知れませんが…)
(CTSUは、端子の容量値を算出する周辺機能です。端子の容量値が16bitレジスタに入る仕組みです。)
タッチセンサの測定値が格納されるレジスタは、
R_CTSU->CTSUSC
です(16bit値)。
例えば、任意の値→0~100に変換したい場合は
float a;
a = (float) CTSUSC;
a /= 65535.0f;
a *= 100.0f;
などで変換出来るかと思います。
タッチセンサが自己容量タイプの場合は、測定回数=キーの数。
相互容量タイプ(行・列のマトリックスになっている配置)の場合は、測定回数=キーの数x2(同相、逆相)となります。
測定結果を格納するレジスタは1つのみで、
CTSUCRA.STAT=1(測定開始)
CTSUWR割り込み(*)
→1番目の測定対象端子のオフセット調整値をCTSUSOにセット
CTSURD 割り込み
→1番目の測定結果がCTSUSCに入る(ココで測定結果の読み出し)
以降、(*)に戻ってループ、最後に(全ての測定端子の測定終了時)CTSUFN 割り込みが入ります。
(上記は、マルチスキャンモードの場合。特定の1端子のみを測定するモードもあります。)
※CTSU2(RA2L1など)の場合
以上、マイコンの動作の話です。
(FSPのAPI関数をお使いの場合は、CTSUSCの値がどこにコピーされているかを確認すれば良いと思いますが、既に値の補正等が入っているかも知れないので、生の測定値を見たい時は、CTSUSCのレジスタ値を見るのが確実だと思います。)
CTSUSCの値をウォッチリストに入れても値を見ることが出来なかったのですが、なぜだか分かりますでしょうか?
> CTSUSCの値をウォッチリストに入れても値を見ることが出来なかったのですがレジスタなら「IO Registers」で見てください。
実行中に参照できないメモリは値が表示されないこともあります。
お二人ともお答えいただきありがとうございました。
レジスタの値を確認することが出来ました。
レジスタの値を見ると、7700くらいの値で、ステータスチャートのカウント値では15000くらいの値を表示していているのですが、値が異なるのはなぜでしょうか?
また、CTSUSCの値を直接変更することは出来るのでしょうか?例えば、CTSUSCをオーバフローさせた場合のタッチセンサAPIの挙動を確認してみたいです。
>値が異なるのはなぜでしょうか
QECapTouchのステータス・チャートで表示される値ですよね?
生の測定値を表示していると思っていましたが、昔作ったプログラムの実行結果を見ると、同じタッチパッドを使って、
自作プログラム 6,000程度(CTSUSCレジスタ値)
ステータス・チャート 15,000程度
と差がありますね。(オフセット調整値も違うはずなので単純比較はできませんが。)
ステータス・チャートは、何回か測定した積算値を表示しているかも?(スミマセン、明確な原因判りません。もしくは、オフセットを掛ける→「CTSUSC測定値のゼロ点をずらす」なので、オフセット補正も含めた、ゼロからの容量値に相当する数値を表示している?)
>CTSUSCの値を直接変更することは出来るのでしょうか
できません。
>CTSUSCをオーバフローさせた場合のタッチセンサAPIの挙動を確認してみたいです
タッチキーの静電容量は、30pF程度だと思います。220pFとか、いっそのこと0.1uFとかのコンデンサを、TSxx端子につなぐとオーバーフローしませんかね?(試していないので、その方法で上手く行くかは自信なし)
>>QECapTouchのステータス・チャートで表示される値ですよね?
そうです。ステータス・チャートで表示される値は、 R_CTSU_DataGetで取得できると思うのですが
この値を直接変更することは可能なのでしょうか?
やりたい事が、「テスト用にセンサに異常値なり特定値を入れて動作確認したい」の様なイメージかと思いました。「イカサマ」ちっくな方法でも良いでしょうか?
(1)CTSUSCレジスタの値を書き換える
r_ctsu.c内の ctsu_read_isr() 内の、レジスタ値を読んでいる所を書き換えれば、常にCTSUSCの値が特定値であるように出来ます。
(2)R_CTSU_DataGetでの取得値を変更する
r_ctsu.c内の R_CTSU_DataGet() 内の、引数にデータをコピーする所を書き換えれば、常に関数の(引数)戻り値は特定値に変更出来ます。
CTSUSCレジスタ値と、ステータス・チャートで表示される値は別でした。
*p_self_raw がCTSUSCの生のレジスタ値
int_dataがステータス・チャートで表示される値
です。測定値に色々計算を施したのが、ステータス・チャートで表示される値です。
あと、TSxxにコンデンサをつなぐ事も試しましたが、150pFでも0.1uFでもステータス・チャートで表示される値は65,535に張り付きました。
お答えいただきありがとうございました。
実際に試してみました。
CTSUSCレジスタの値を徐々に大きくしていくと、ステータス・チャートのカウント値が65535で止まりました。その後、数秒経過すると、カウント値がリセットされるようでした。リセットされる理由として、何か考えられることはありますでしょうか?
CTSUSC値の書き換えをやってみました。
volatile unsigned short g_ctsu_val = 5000;
→ctsu_read_isr() 内
p_instance_ctrl->p_self_raw[p_instance_ctrl->rd_index] = R_CTSU->CTSUSC;
↓
p_instance_ctrl->p_self_raw[p_instance_ctrl->rd_index] = g_ctsu_val ;
g_ctsu_val の値をデバッガで修正して、ステータス・チャートのカウント値をモニタ
→一度変数値を変えると、スキャンの度にp_self_rawに固定値が入る
普通に動かしている時に、CTSUSCのカウント値が約5,000で、ステータス・チャートのカウント値が11,000位でした。
CTSUSC値 ステータス・チャートのカウント値
5,000 10,924
10,000 23,587
10.500 37,948
20,000 54,188
23,000 ***,374
24,000以上 65,535
値は、上記の様にCTSUSCを増やすと、ステータス・チャートの値も増える。ステータス・チャートの値が上限まで達してもそのまま(上限張り付き)という動作でした。
私の試行では、ステータス・チャートのカウント値がリセットされるような現象は見られませんでした。何故でしょうかね?
徐々に大きくしていくというのは、このようにしました。CTSUSCの値が、65535でリセットされているのではないかなと思いました。
#if (CTSU_CFG_NUM_SELF_ELEMENTS != 0)
if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md))
{
p_instance_ctrl->p_self_raw[p_instance_ctrl->rd_index] = i; //iはint型
i += 13;
p_instance_ctrl->rd_index++;
}
CTSUSCの値が
0→65535→0→65535…
の様に、(上限(付近)まで増加して0(付近)に戻る、再度増加して上限から0に戻る)というのが、やりたい事ですか?
CTSUSCの値-ステータス・チャートの値 が比例している(単調増加 VS 単調増加)ですので、ステータス・チャートのカウント値も同じように推移する
(0→65535→65535→0→65535→65535→0…)
(65535をある程度の期間維持して0に戻る)(0ではないかも知れませんが、小さな値)
と思われますが。(提示されたコードだと、そうなるよね、と思います。)
(私の試行結果では、CTUSC=24000以上で65535になったので、CTSUSC値が24000~65535の間(一周期の約半分近く)は、ステータス・チャートの値は65535を維持する。)
単調増加のint型変数を16bitのunsignedの変数に代入しているので、入力側の変数は0に戻りながら増加するという変化を繰り返す。
すみません、やりたい事が判らないです。
変数がオーバフローしたあとに、0に戻るということをあまり理解していませんでした。
ステータス・チャートの値をじょじょに大きくしていったときの、挙動を確認したいということが目的だったため、それは達成できています。
質問にお答えいただきありがとうございました。