2018年06月12日

Open.Theremin@attatchInterruptの項目を追加する

DACの読み出しを行うタイミングの制御に関して思いついたこと。

プログラムの基本的な構造は、アンテナのセンシングやロータリーエンコーダーの読み出しを行っているメインループと、そこにWCKが立ち上がるタイミングでDACへのデータ送信を行った後に波形データを読みだす一連のタスクが割り込む仕組み。

現状ではadat等のWCKの表裏でデータを扱うタスクの実現は難しく、当初はその対策としてメインループの先頭に音声データをDACに出力する仕掛けを追加していたが、データラインの波形を観測した結果、インターラプトからの復帰後に行われる筈のデータ転送のタイミングが安定していないことが判った。

当初、ズレの原因は波形読み出しのタスクの重さから発生する遅延の影響と仮定していたのだが、インターラプトから復帰するタイミングによってズレのバラつきが生じる可能性に思い至った。

この変動するズレの問題を解決するには、WCKの立ち下がりで発動する別のインターラプトを追加して強制的にDACにアクセスするタイミングを固定する方法が有効と思える。(波形を読み出す際のタスクの重さは無視して)とりあえずはこの機能を実装してみたところ、コンパイルだけは通せたのが現時点での状況。

前述したように、この機能はタスクの重さに因って破綻する可能性があり、まずは実験による観測が必要だ。

adatフォーマットの取り扱いに関しては、外部にFPGAによるデータラッチを追加し、WCKの裏面でバースト信号を受信/表でフォーマットに準拠したタイミングで送信を行わせている。

基板にadat系のチップを実装してはいるが、データのハンドリングを行うFPGAの有効性は実証されていない。データ送りのタスクに要する時間(1サイクルでクロックを40余りも消費する)の制限は大きく、実質的には4〜5chの送信が限界と思われる。

既に波形の観測によってattatchInterruptによる遅延が可視化されているが、タイミング的にはWCKに同期していれば問題はない。ただし、この遅れによってシステム全体の処理に要する時間的余裕が削られてしまうのはマズいので、直接的にピンの状態を参照する仕掛けを探る必要がある。

ダイレクトアクセスのアドレスとして既にSAMPCLK_STATEを仕込んであるので、ひとまずattatchInterruptにこれをアサインしてみよう。
posted by Yasuski at 10:42| open.Theremin