denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

オシロジの描画に不具合が見つかった

(2015.11.16)
オシロジの開発が佳境に入りました。

オシロジの構想が(スペックはダウンしましたが)ようやく実現しつつあります。
念願のオシロジ動作(オシロ4CHとロジアナ10chの同時サンプリング)も無事達成・・・
と喜んだのも束の間、問題が見つかりました。

f:id:denshikobo:20151116171919p:plain

同じ信号を計測しているのに、オシロとロジアナの表示が微妙にずれています。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)

f:id:denshikobo:20151116172025p:plain

割込フラグの操作を書き換えたところオシロとロジアナの表示が一致するようになりました。上はオシロ2kHz、ロジアナ5kHzでサンプリングした結果を表示しています。JAVA側で行っているX軸のスケーリングも上手く機能しています。

パチパチパチ~

どうやら不具合対処は成功したようです。
やれやれ