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の値をウォッチリストに入れても値を見ることが出来なかったのですが、なぜだか分かりますでしょうか?
自己容量タイプを使用しています。
測定結果を格納するレジスタは1つだとしたら、ボタンが3つある場合、例えば1つめのボタンの測定値を変更したい場合はどのようにすればよいのでしょうか?
CTSUWR割り込みの回数を数えるという方法で出来るでしょうか?
変数値が見えないのは、最適化で見ようとしているタイミングでメモリの中に居ないなどでしょうか。
volatile unsigned short g_ctsusc_val; //main()の外で定義
g_ctsusc_val = R_CTSU->CTSUSC; //CTSURD 割り込みの中
上記の様にしておけば、最適化オプションがデフォルト(-O2)でも見られるのではないでしょうか。
(もしくは、プロジェクトのプロパティでC/C++ビルド-設定 Optimization -O0に変える)
CTSUSCは、CTSURD 割り込みのタイミングで測定された値が入るので、CTSUWRではなくCTSURDが何回入ったかで観測してください。マルチスキャンモードの場合は、TSxxのxxの数値の小さい方からスキャンされるはずなので、「1つめのボタン=使用している端子の内一番xxの値が小さい」であれば、1回目のCTSURDのタイミングで、測定結果がレジスタ値に格納されます。
> 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で止まりました。その後、数秒経過すると、カウント値がリセットされるようでした。リセットされる理由として、何か考えられることはありますでしょうか?