SSブログ

ADC10のチャネル・スキャンで悩む [oscilogi32]

(2014.07.13)
Oscilogi32の開発をぼちぼち進めています。

”ActionPerformedイベントハンドラで設定したスクロールバーの位置が、Swingによって上書きされている”という見立ては、正しかったようです。50msインターバルでスクロール・バーの位置をコンソールに表示する機能を組み込んだところ、ActionPerformedイベントハンドラからメイン・ループに戻って暫くしてから(500ms以内)スクロール・バーの位置が書き換わる様子が観測されました。(Swingでは500msインターバルで表示をコントロールするタスクが走っている?)

他にも時折”TextAreaの表示が壊れる”という症状も現われているのですが、操作し直せば復旧するので、ペンディングにしています。RaspiのJAVAは色々問題を抱えているようです。

なんとかコマンド送受が出来るようになったので、いよいよ計測動作を試すことにしました。
CH0だけ動かしてみると・・・(ムフフ)動きました。
DMAによるADC1BUFの読み取りも良さそうです。

CH1に変えると・・・・(ムフフ)先ほどとは少し異なる値に変わり、こちらも期待した通りの結果になりました。

で、2チャネル動作に切り替えると・・・?!駄目です。CH0の計測結果しか記録されません。
ここから長いデバッグ作業が始まりました。

JAVA側の送信コマンドが正しくないのか?
==> 不具合は見当たらない(しかし、大丈夫とも言えない)
PIC側の受信コマンド処理が正しくないのか?
==> 不具合は見当たらない(しかし、大丈夫とも言えない)
PIC側のADC設定が正しくないのか?
==> 不具合は見当たらない(しかし、大丈夫とも言えない)
(実はここに問題があった)
PIC側のDMA設定が正しくないのか?
==> そもそもADC1BUFにCH1の計測結果が記録されないのだから、DMA以前の問題な筈
(しかし、DMA設定が大丈夫とも言えない)

ADC10のチャネル・スキャン機能を試したことはあるので、どこかに問題が潜んでいる筈です。
う~ん何処だ?

一頻り悩んで、ADC_SAMPLES_PER_INT_1をADC_SAMPLES_PER_INT_2に代えて見ると・・・
ビンゴ~!
チャネル・スキャンが動きました。

”2チャネルをスキャンしてAD変換ごとに割り込みを掛ければ、ADC1BUF0にはCH0の変換結果が、ADC1BUF8にはCH1の変換結果が入り、2CHのDMAを使ってデータを転送できる”と目論んだのです。

何故、変換終了ごとに割り込みを発生させると、入力チャネルのスキャンが止まってしまうのか?
理由は判りませんが、そういう仕様のようです。お陰で親族SNS管理人の目論見が破綻してしまいました。

選択肢は三つ。
(1)チャネル・スキャンは止め、プログラムで入力CHとキックするDMAを切り替える。
(2)プログラムで2CH分の変換結果を4バイトのバッファ領域に書き込み、DMA(1CH)をキックする。
(3)ADC_BUF_8をADC_BUF_16に代えて、DMA(2CH)をADC割り込みでキックする。

プログラム処理負担が最も軽い三番目の案(<==実は選択肢三つと書いてから思いついた)が良さそうです。ただし、次のAD変換が始まっているので、まごまごしているとADC1BUF0が書き換わってしまいます。そのあたりのタイミングがどうなのか?

う~ん、悩ましい!

---------------------------------------------
<ご参考まで>
使用しているADCの設定パラメータは以下の通りです
#define PARAM1  ADC_FORMAT_INTG16 | ADC_CLK_TMR
                          | ADC_AUTO_SAMPLING_ON
#define PARAM2_SCAN_OFF ADC_VREF_AVDD_AVSS
                          | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF
                          | ADC_SAMPLES_PER_INT_1 | ADC_BUF_8
                          | ADC_ALT_INPUT_OFF
#define PARAM2_SCAN_ON  ADC_VREF_AVDD_AVSS 
                          | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_ON 
                          | ADC_SAMPLES_PER_INT_2 | ADC_BUF_8
                          | ADC_ALT_INPUT_OFF
#define PARAM3  ADC_CONV_CLK_PB | ADC_CONV_CLK_Tcy2
#define PARAM4 ENABLE_AN10_ANA | ENABLE_AN11_ANA
#define PARAM5_SCAN_OFF SKIP_SCAN_ALL
#define PARAM5_SCAN_ON   ~(SKIP_SCAN_AN10 | SKIP_SCAN_AN11)

SCAN設定の場合
  SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN10 );
  OpenADC10( PARAM1, PARAM2_SCAN_ON, PARAM3, PARAM4, PARAM5_SCAN_ON );
---------------------------------------------

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。