ついに10回目、暖かくなってきたので、プログラム作りを終わり、ハード工作に移りたい気持ちが。
DIRとDITのインタラプト出力の実験結果を記録しておく。
1 INT出力は、ステータスレジスターを読み取るまで、アクティブなまま。
よって、INTのアクティブ時間は、
・ INT出力によりAVRがレジスターをクリアし、
・ それがINT出力に反映されるまでになる。
上の写真は、DITのEFTC(CSデータ送出)インタラプト出力。
入力Fs48k、時間軸1mS、電圧軸2V/スケール。
DITの設定は、以下のとおり。
Open drain, active low.
(Requires an external pull-up resistor on the INT pin.)
Falling edge active.
(INT pin becomes active on the removal of the interrupt condition.)
インタラプト出力間にLRクロックが192個なのでブロック毎出力。
アクティブ時間が約0.5mSなので、これがAVRからDITへのアクセス時間。
2 DIRのINTの動作が結構微妙
入力信号(SPDIF)の状態を見るのに、ループ動作で常時レジスターにアクセスするのは精神的に気持ち悪い。オーディオはオカルトみたいなもんだし。
状態が変化したときだけ、インタラプトを受けてLCD表示を変えようと思ったが。
入力Fs48k、時間軸10mS、電圧軸100mV×10/スケール。
ピン設定は前のDITのときと同じ、動作はRising edge active。
上の画像は、信号投入時のDIRのINT出力。
なお、画像は最新のものだが、見やすいように加工してある。ww
ステータスは、読み取りルーチンを作り、LCD表示で得たもの。
Hレベルが低いのは、チップのGPO0ピンの不良のためで、ノイズが乗っている。この後、GPO1に変更しての測定では規定値だった。
CS8416は結構繊細で弱い。
3 CCHの2連発
Fs48kで5mS弱の間隔なので、Fs192kでは1mS程度になり、インタラプト処理ルーチンが追いつかない可能性が高い。
ただ、2連発なので2発目は無視できる、と言うか無視すべき。
4 信号検出はどれで?
信号切断では、必ずエラー(アンロック)が出る。この時FDSへの反映が間に合ってなく、PCMビットが立ったままなのでFDSは使えない。
FDSは検出時にINT発生だが、無信号への変化はそのままとデータ・シートにもある。 ただし、デジタル・サイレンスと96k以上を検出するので、何かの役に立つかも。
信号投入では、前の画像のようにCCHとFCHが出るが、CCHのタイミングが早い。エラー系はV(バリディティ)が出ることもあるが確定ではない。
割込みによって、I2C通信・LCD制御に不具合がおきるので、割込みが発生しそうなタイミングの時は、割込み禁止が必要。
5 結局
アンロックが起きた時は、割込み禁止にして、通常ルーチンでPLLのロックを待つ。DIRにPLLロックのフラグが欲しかった。
・ PLLがロック(アンロック終了)で、信号状態を表示し割込み許可。
・ 受信中でのCS変更・フォーマット変更・エラーへは割込みで対応。
というところで、プログラムのバグ取りへ進む。

