タグ「PIC」を含む投稿[30件](2ページ目)
LTC Generator のタイマーを修正してみました。
8時間経過で約1秒ズレていますが、以前より良くなっていますし、SMPTEが求める精度には十分収まっています。何よりも比較に使っている時計の精度がどこまでなのかわかりませんからこんなもんでしょう。
PICに与えている水晶発振子の精度は30ppmですから(ppmは100万分の1を表す単位なので比率だと0.00003)、1日(86,400秒)あたり±2.592秒の誤差がありえます。実測値は想定される誤差相当なのでソフトウェアは間違ってなさそうです。
現在値以上を求めるなら、ソフトウェアの修正ではなく個体差に対する補正となりそうですし、もっと精度の高い発振子を使うべき話です。
補正計算が無い25fpsでテストしていますが、補正計算が入る他のfpsも同等に収まればいいでしょう。
秋月電子通商さんで手に入る高精度な発振子は最高で1ppmです。高精度に越したことはありませんが、ここまで必要か、これで十分か、30ppmに比べてメリットがあるかは別問題です。
求めているのは数分間の音楽の時間座標を表す信号です。卓がエラーを出さない条件を満たし、目視でズレを感じない繰り返し精度があればいいのです。高精度の時計や放送用の基準を作っているワケではありませんから、無制限に高精度を求めても意味がありません。十分に使えて低価格も大切な精度です。
#PIC #タイムコード
8時間経過で約1秒ズレていますが、以前より良くなっていますし、SMPTEが求める精度には十分収まっています。何よりも比較に使っている時計の精度がどこまでなのかわかりませんからこんなもんでしょう。
PICに与えている水晶発振子の精度は30ppmですから(ppmは100万分の1を表す単位なので比率だと0.00003)、1日(86,400秒)あたり±2.592秒の誤差がありえます。実測値は想定される誤差相当なのでソフトウェアは間違ってなさそうです。
現在値以上を求めるなら、ソフトウェアの修正ではなく個体差に対する補正となりそうですし、もっと精度の高い発振子を使うべき話です。
補正計算が無い25fpsでテストしていますが、補正計算が入る他のfpsも同等に収まればいいでしょう。
秋月電子通商さんで手に入る高精度な発振子は最高で1ppmです。高精度に越したことはありませんが、ここまで必要か、これで十分か、30ppmに比べてメリットがあるかは別問題です。
求めているのは数分間の音楽の時間座標を表す信号です。卓がエラーを出さない条件を満たし、目視でズレを感じない繰り返し精度があればいいのです。高精度の時計や放送用の基準を作っているワケではありませんから、無制限に高精度を求めても意味がありません。十分に使えて低価格も大切な精度です。
#PIC #タイムコード
LTC Generator は24時間カウントの関数をPythonで書いてみました。限りなく本チャンに近いモノです。
期待通りの動作をします。卓への接続テストはまだですが、オシロスコープには波形が出ます。
ただ、24時間で約40秒の遅れが出ます。1時間あたり約1.7秒ですから無視出来ません。
時間のクリックカウントはPICで行っていますが、TMR1のコンペア値が1個多いと仮定すると辻褄が合います。そういえば、TMR2でコンペアと同様の機構と思われるPWMを作る場合は折り返しで1カウント余計にかかるハズ。データシートには記載が見受けられなかったけど、TMR1のコンペアモードでも同様なのかもしれません。
コンペアの定数値を変更して改めてテストしましょう。
#PIC #タイムコード
期待通りの動作をします。卓への接続テストはまだですが、オシロスコープには波形が出ます。
ただ、24時間で約40秒の遅れが出ます。1時間あたり約1.7秒ですから無視出来ません。
時間のクリックカウントはPICで行っていますが、TMR1のコンペア値が1個多いと仮定すると辻褄が合います。そういえば、TMR2でコンペアと同様の機構と思われるPWMを作る場合は折り返しで1カウント余計にかかるハズ。データシートには記載が見受けられなかったけど、TMR1のコンペアモードでも同様なのかもしれません。
コンペアの定数値を変更して改めてテストしましょう。
#PIC #タイムコード
今後のこともあり、移動時間にPICのI2Cを勉強し直してみました。
これまではイマイチ理解出来なかったのですが、ボチボチ使い方がわかってきました。わからなかったのはハードウェアとソフトウェアの棲み分けとソフトウェアの手順です。
I2Cの規格を頑張って説明するのはありがたいのですが、一番知りたいソフトウェアの手順がボンヤリした文書ばかり。ちょっと複雑な手順を踏むので突っ込んだ理解が望ましいのはわかるのですが、その説明で力尽きしまうのか、どとのつまりどうすればいいの?に応えてくれる資料が少ないように思います。特に、I2Cの特徴的な要素である「ACK」を扱うのがハードウェアなのかソフトウェアなのかが見えないのです。
正直、Pythonなどではライブラリを使うだけで済んでしまいますので、いくらPICマイコンでもそこまでローレベルの機構まで理解しないといけないのか不思議です。
わかったことは、設定さえしてしまえばソフトウェアの手順はUARTと大差ないことです。
マスタが送信する場合はスレーブアドレスを先頭にしたバイトリストをハードウェアモジュールに渡す(PICではバイト単位で渡す)。
マスタが受信する場合はスレーブアドレスを送り、返信されたバイトデータを取り込んだら取り込み済みのフラグを立てる。
スレーブは、自分のアドレスを設定しておけば自分向けの通信かハードウェアが判断してくれるので、マスターの要望に従って受信値を取り込むか返信値を投げる。
データの終りのストップコンディションは、マスター/スレーブ・送信/受信の立ち位置で違うけどフラグを立てるだけ。
波形をコマンド操作で作るワケじゃありませんし、前後関係で調整することもありません。規格はザックリ概要がわかっていれば十分なのに、ソフトウェアの手順の説明がボンヤリしているのはイマイチ理解不能なワケです。
#PIC
これまではイマイチ理解出来なかったのですが、ボチボチ使い方がわかってきました。わからなかったのはハードウェアとソフトウェアの棲み分けとソフトウェアの手順です。
I2Cの規格を頑張って説明するのはありがたいのですが、一番知りたいソフトウェアの手順がボンヤリした文書ばかり。ちょっと複雑な手順を踏むので突っ込んだ理解が望ましいのはわかるのですが、その説明で力尽きしまうのか、どとのつまりどうすればいいの?に応えてくれる資料が少ないように思います。特に、I2Cの特徴的な要素である「ACK」を扱うのがハードウェアなのかソフトウェアなのかが見えないのです。
正直、Pythonなどではライブラリを使うだけで済んでしまいますので、いくらPICマイコンでもそこまでローレベルの機構まで理解しないといけないのか不思議です。
わかったことは、設定さえしてしまえばソフトウェアの手順はUARTと大差ないことです。
マスタが送信する場合はスレーブアドレスを先頭にしたバイトリストをハードウェアモジュールに渡す(PICではバイト単位で渡す)。
マスタが受信する場合はスレーブアドレスを送り、返信されたバイトデータを取り込んだら取り込み済みのフラグを立てる。
スレーブは、自分のアドレスを設定しておけば自分向けの通信かハードウェアが判断してくれるので、マスターの要望に従って受信値を取り込むか返信値を投げる。
データの終りのストップコンディションは、マスター/スレーブ・送信/受信の立ち位置で違うけどフラグを立てるだけ。
波形をコマンド操作で作るワケじゃありませんし、前後関係で調整することもありません。規格はザックリ概要がわかっていれば十分なのに、ソフトウェアの手順の説明がボンヤリしているのはイマイチ理解不能なワケです。
#PIC
LTC Generator は入荷した修正基板を用いてプリアンプが完成。+4dB(1.23Vp-p)の波形を出しています。
まだPythonプロンプトのレベルですが、シリアルでデータを送ると波形が変化します。Pythonからデータを送る場合、バイト毎ではなく、配列にバイナリを格納してpyserialに渡すのが良さそうです。
タイミングが正しいかは確認出来ませんが、PICからの送信要求も受信出来ています。これを受けてデータを送る段取りです。
本業が詰まっていますのであまり長い時間は出来ませんが、1日0.5課題くらいの気持ちで少しずつ行きましょう。
明晩は仮のLTCデータを送出するPythonプログラムを書いてみます。
あらかじめ2-3秒分の配列データを作っておいて送信要求があれば1フレーム分送出する物ですが、卓に接続してLTCがカウントされれば最大の山場を越えます。
#PIC #タイムコード
まだPythonプロンプトのレベルですが、シリアルでデータを送ると波形が変化します。Pythonからデータを送る場合、バイト毎ではなく、配列にバイナリを格納してpyserialに渡すのが良さそうです。
タイミングが正しいかは確認出来ませんが、PICからの送信要求も受信出来ています。これを受けてデータを送る段取りです。
本業が詰まっていますのであまり長い時間は出来ませんが、1日0.5課題くらいの気持ちで少しずつ行きましょう。
明晩は仮のLTCデータを送出するPythonプログラムを書いてみます。
あらかじめ2-3秒分の配列データを作っておいて送信要求があれば1フレーム分送出する物ですが、卓に接続してLTCがカウントされれば最大の山場を越えます。
#PIC #タイムコード
今後はLTCをMTCに変換する方法も考えましょう。
LTCをバイトデータとして受信し、MTCのパケットに書き直して31,250bpsのUARTで送出すればMTCになります。
オレメモです。
PICには「変化割込み」と呼ばれるI/Oピンの入力が変化すると割込みが発生する機能があります。これとタイマーを組み合わせれば波長の計測が可能です。
PICのクロックを32MHzにした場合、LTCの波長は命令ステップ(Fosc/4)換算でビットが1なら1,666から2,083、0なら倍の3,332から4,166です。誤差10%としても1の最大値(2,291)と0の最小値(3,029)は被りませんしグレーゾーンも広いので、波長の判別はfpsの種類に関係なく可能です。fpsやフォーマットの種類はLTCのデータに書かれているので計測した波長から判断する必要はありません。
差動バイフェーズのビットは短い波長が2つ続けば1、長い波長が1つで0です。ビットデータが取れたら80bitのシフトレジスタに入れていきます。短い波長は必ず2回続きますから、長い波長の直前の短い波長が奇数回ならエラーとして仕切り直しです。80bitのシフトレジスタの末尾16bitにシンクワードが認められれば正常なLTCパケットが取得できたことになります。
LTCパケットが取得出来ればMTCパケットを作り、入力されたLTCに基づいたタイミングで31,250bpsに設定したPICのUARTから送出します。後は電気的にMIDIにすればMTCです。
必ず3フレーム遅れますが、欲しいのは絶対値ではなく相対値ですからいいかなと。
プログラムが求めるメモリサイズ次第ですが、8pinの12F1822で作る予定です。
追記
LTCにはfpsフォーマットを記載する領域はありません。訂正します。NDF/DFは記載されます。
fpsフォーマットをデータに記載するのはMTCです。
ですので、LTCの場合は波長からfpsフォーマットを推測します。
#PIC #タイムコード
LTCをバイトデータとして受信し、MTCのパケットに書き直して31,250bpsのUARTで送出すればMTCになります。
オレメモです。
PICには「変化割込み」と呼ばれるI/Oピンの入力が変化すると割込みが発生する機能があります。これとタイマーを組み合わせれば波長の計測が可能です。
PICのクロックを32MHzにした場合、LTCの波長は命令ステップ(Fosc/4)換算でビットが1なら1,666から2,083、0なら倍の3,332から4,166です。誤差10%としても1の最大値(2,291)と0の最小値(3,029)は被りませんしグレーゾーンも広いので、波長の判別はfpsの種類に関係なく可能です。
差動バイフェーズのビットは短い波長が2つ続けば1、長い波長が1つで0です。ビットデータが取れたら80bitのシフトレジスタに入れていきます。短い波長は必ず2回続きますから、長い波長の直前の短い波長が奇数回ならエラーとして仕切り直しです。80bitのシフトレジスタの末尾16bitにシンクワードが認められれば正常なLTCパケットが取得できたことになります。
LTCパケットが取得出来ればMTCパケットを作り、入力されたLTCに基づいたタイミングで31,250bpsに設定したPICのUARTから送出します。後は電気的にMIDIにすればMTCです。
必ず3フレーム遅れますが、欲しいのは絶対値ではなく相対値ですからいいかなと。
プログラムが求めるメモリサイズ次第ですが、8pinの12F1822で作る予定です。
追記
LTCにはfpsフォーマットを記載する領域はありません。訂正します。NDF/DFは記載されます。
fpsフォーマットをデータに記載するのはMTCです。
ですので、LTCの場合は波長からfpsフォーマットを推測します。
#PIC #タイムコード
困ったことに LTC Generator が一発で動いてしまいました。デバグのために本業を途中で切り上げ、午前様を覚悟していたのに実作業15分で終わってしまいました。ここまでデバグせずに進んだのは初めてかもしれません。
何をしたかと言うと、Pythonからシリアルでデータを送り、それに則した波形を出し、コマンドコードで波長を切り替えるというもの。実験用に一部書き換えましたが、どうやっても想定の結果が出ます。
予想より早いですが、実際にタイムコードを出してみる段階になってしまいました。プリアンプの改修基板は明日入荷なのでいいか。
仕方ないのでPythonのプログラムの構想を始めましょう。まずは固定値のリストで2-3秒出すところからです。
そりゃ嬉しいけど、機械たちにスルーされているみたいでなんだか寂しい。
こんなにすんなりいくと何かありそうで怖い。
#PIC #タイムコード
何をしたかと言うと、Pythonからシリアルでデータを送り、それに則した波形を出し、コマンドコードで波長を切り替えるというもの。実験用に一部書き換えましたが、どうやっても想定の結果が出ます。
予想より早いですが、実際にタイムコードを出してみる段階になってしまいました。プリアンプの改修基板は明日入荷なのでいいか。
仕方ないのでPythonのプログラムの構想を始めましょう。まずは固定値のリストで2-3秒出すところからです。
そりゃ嬉しいけど、機械たちにスルーされているみたいでなんだか寂しい。
こんなにすんなりいくと何かありそうで怖い。
#PIC #タイムコード
LTC Generator のPICはFIFOにデータを突っ込んで波形が出力するまでまとまりました。
内部のテストルーチンによるものですが、データのリレーはシュミレーターで、波形はオシロスコープで確認出来たので、最も面倒な部分が成立した模様です。
昨日一見動いたものの波形が安定せず悩みましたが、バグを手直しして今は期待した波形が出ています。0x00や0xFFはもちろん他の数値もOK。オシロスコープのトリガが引っかからず波形が読み取れない数値もありますが、この値が確認出来ればいいでしょうって値はいけたので、デバイスドライバ的なところが終わったと言えます。
今後の課題はパソコンとの通信です。PIC側は過去実績、パソコン側はライブラリに頼れば左程難しくないハズ・・です。パソコンから受信した値をFIFOに突っ込んで期待した波形が出れば重要な機能は完了です。
完成に至るには、PICからパソコン側にデータ送信の要求を送ったり、コマンドでfpsのモードを切り替えたりと課題は残っていますが、ハードウェアとデバイスドライバ的な部分がまとまればハードルは低くなります。
ちなみに、今作っているのはシリアルで受信したバイトデータを差動バイフェーズで出力するだけの物ですから、TASCAMのプレーヤーのリモコンと組み合わせることも可能(正しくは不可能ではない)です。曲ごとのタイムコードをユニークする方法を考えなければなりませんが、これはこれで欲しい一品です。
当然リモコンはフルスクラッチとなりますが、出来るだけ音響さんの環境を変えないためにこういった発想もありかなと。
#PIC #タイムコード
内部のテストルーチンによるものですが、データのリレーはシュミレーターで、波形はオシロスコープで確認出来たので、最も面倒な部分が成立した模様です。
昨日一見動いたものの波形が安定せず悩みましたが、バグを手直しして今は期待した波形が出ています。0x00や0xFFはもちろん他の数値もOK。オシロスコープのトリガが引っかからず波形が読み取れない数値もありますが、この値が確認出来ればいいでしょうって値はいけたので、デバイスドライバ的なところが終わったと言えます。
今後の課題はパソコンとの通信です。PIC側は過去実績、パソコン側はライブラリに頼れば左程難しくないハズ・・です。パソコンから受信した値をFIFOに突っ込んで期待した波形が出れば重要な機能は完了です。
完成に至るには、PICからパソコン側にデータ送信の要求を送ったり、コマンドでfpsのモードを切り替えたりと課題は残っていますが、ハードウェアとデバイスドライバ的な部分がまとまればハードルは低くなります。
ちなみに、今作っているのはシリアルで受信したバイトデータを差動バイフェーズで出力するだけの物ですから、TASCAMのプレーヤーのリモコンと組み合わせることも可能(正しくは不可能ではない)です。曲ごとのタイムコードをユニークする方法を考えなければなりませんが、これはこれで欲しい一品です。
当然リモコンはフルスクラッチとなりますが、出来るだけ音響さんの環境を変えないためにこういった発想もありかなと。
#PIC #タイムコード