オシロジの描画に不具合が見つかった
(2015.11.16)
オシロジの開発が佳境に入りました。
オシロジの構想が(スペックはダウンしましたが)ようやく実現しつつあります。
念願のオシロジ動作(オシロ4CHとロジアナ10chの同時サンプリング)も無事達成・・・
と喜んだのも束の間、問題が見つかりました。
同じ信号を計測しているのに、オシロとロジアナの表示が微妙にずれています。orz
最初はJAVAプログラムのバグを疑ったのですが、原因となりそうな不具合は見つかりませんでした。
そこで、PICの計測処理を調べたところ、DMAの転送回数に差を生じていることが判りました。
はて?
一体何が起きているのでしょうか?
TIMERはオシロもロジアナも同じ設定になっていることを確認しました。
となると、割込フラグの検出で問題が生じているに違いありません。
逆アセンブル・リストを調べてみると・・・
ビンゴ~
不具合発生箇所が見つかりました。
1634: if( IFS0bits.T4IF )
1635: {
1636: IFS0bits.T4IF = 0;
9D003F7C 3C02BF88 LUI V0, -16504
9D003F80 8C421030 LW V0, 4144(V0)
9D003F84 7C4204C0 EXT V0, V0, 19, 1
9D003F88 10400014 BEQ V0, ZERO, 0x9D003FDC
9D003F8C 3C02BF88 LUI V0, -16504
9D003F98 8C431030 LW V1, 4144(V0) <== IFS0を読み込んで
9D003F9C 7C039CC4 INS V1, ZERO, 19, 1 <== フラグ・ビットを0クリアして
9D003FA0 AC431030 SW V1, 4144(V0) <== 書き戻している
これでは、読み込んでから書き戻すまでの間に変化したIFS0のフラグが消えてしまいます。XC8では問題なかった記述がXC32では使えなかったのです。
PIC32で拡張されたCLRレジスタを使って、割込フラグの操作を以下のように書き換えました。
1635: IFS0CLR = ifs0_t4if_bit; // ifs0_t4if_bit = (1<<19);
9D003F9C 3C03BF88 LUI V1, -16504
9D003FA0 AC621034 SW V0, 4148(V1)
割込フラグの操作を書き換えたところオシロとロジアナの表示が一致するようになりました。上はオシロ2kHz、ロジアナ5kHzでサンプリングした結果を表示しています。JAVA側で行っているX軸のスケーリングも上手く機能しています。
パチパチパチ~
どうやら不具合対処は成功したようです。
やれやれ