タグ「PIC」を含む投稿[30件](3ページ目)
FIFOなど、諸々書き加えたファームウェアも正常に動きました。
自分で書いた送出停止処理の扱いを間違えて信号が出ないことに悩んでしまいましたが、テストプログラムが間違っていただけでした。肝心のモジュール本体は一発OKです。
今回のPICはパソコンから送られてきたデータを淡々と差動バイフェーズで送り出すだけです。難しいことはパソコンでやれと、PICの名前の由来を考えろと。そんな作りです。
データを差動バイフェーズで送出することは出来た。データのタイミング緩衝となるFIFOもどうやら正常に動く。残るはパソコンとの通信です。FT232RLを経由したシリアル通信ですが、PIC側はDMXで散々やったことですし、パソコン側はPythonなのでほんの数行で書けます。10分の空き時間で進められるものでもありませんけどね。
あとはラインセレクタも必要です。
音響さんからもらう本線LTCと自分のパソコンから送るチェック用LTCの2系統を切り替える必要があるからです。
セレクタにはJRCさんのNJM2750が良さそうです。単電源で動く電子ロータリースイッチってイメージですね。
NJM2750はアンバランスのLRを4系統から1つ選ぶって構成ですが、バランスのモノ4系統として使っても良さそう。
今回はそこまで使わないけど、4系統のラインセレクタ基板を作っておけばいいかな?
#PIC #タイムコード #電子工作
自分で書いた送出停止処理の扱いを間違えて信号が出ないことに悩んでしまいましたが、テストプログラムが間違っていただけでした。肝心のモジュール本体は一発OKです。
今回のPICはパソコンから送られてきたデータを淡々と差動バイフェーズで送り出すだけです。難しいことはパソコンでやれと、PICの名前の由来を考えろと。そんな作りです。
データを差動バイフェーズで送出することは出来た。データのタイミング緩衝となるFIFOもどうやら正常に動く。残るはパソコンとの通信です。FT232RLを経由したシリアル通信ですが、PIC側はDMXで散々やったことですし、パソコン側はPythonなのでほんの数行で書けます。10分の空き時間で進められるものでもありませんけどね。
あとはラインセレクタも必要です。
音響さんからもらう本線LTCと自分のパソコンから送るチェック用LTCの2系統を切り替える必要があるからです。
セレクタにはJRCさんのNJM2750が良さそうです。単電源で動く電子ロータリースイッチってイメージですね。
NJM2750はアンバランスのLRを4系統から1つ選ぶって構成ですが、バランスのモノ4系統として使っても良さそう。
今回はそこまで使わないけど、4系統のラインセレクタ基板を作っておけばいいかな?
#PIC #タイムコード #電子工作
FIFOの動作チェックをしました。
バク無し・・・嬉しいような怖いような。
FIFOはループメモリです。例えば10個のメモリを使うなら10個目を書いた後は1個目から書きます。これを続けます。読出しも同じ。
ただ、読出しと書き込みはタイミングがシンクしませんので、読出しが書き込みを追い越さないこと、書き込みは一周以上先行しないことが重要です。これらの確認も出来ました。
処理のタイミングとしては、読出しはLTCの送出に合わせてになりますが、書き込み(パソコンへのデータ要求とも言う)はメモリが空いたら行います。
パソコンとの通信速度がLTCの送信速度より十分に速く、パソコン側のレスポンスも十分に早ければタイミングがズレることはありません。たぶん。
読出しが書き込みに追いついてしまえばデータが無いことになりますので、新しいデータが入るまでLTCを送出しないだけです。
#PIC #タイムコード
バク無し・・・嬉しいような怖いような。
FIFOはループメモリです。例えば10個のメモリを使うなら10個目を書いた後は1個目から書きます。これを続けます。読出しも同じ。
ただ、読出しと書き込みはタイミングがシンクしませんので、読出しが書き込みを追い越さないこと、書き込みは一周以上先行しないことが重要です。これらの確認も出来ました。
処理のタイミングとしては、読出しはLTCの送出に合わせてになりますが、書き込み(パソコンへのデータ要求とも言う)はメモリが空いたら行います。
パソコンとの通信速度がLTCの送信速度より十分に速く、パソコン側のレスポンスも十分に早ければタイミングがズレることはありません。たぶん。
読出しが書き込みに追いついてしまえばデータが無いことになりますので、新しいデータが入るまでLTCを送出しないだけです。
#PIC #タイムコード
気分転換にFIFOを書いてみました。初期設定を含めても50行くらいです。
ループメモリを非同期で読み書きする構造ですから、それぞれのアドレスカウンタの扱いが肝です。当初悩んだものの、条件を整理すれば案外簡単でした。アルゴリズムの設計大事です。
こういったモジュールは例外も想定して慎重に動作確認をしなければなりませんが、実機だと確認が難しいのでMPLABXのシュミレータの出番です。ステップ毎のレジスタの変化を観察したいのです。
MPLABXのシュミレーターは使い方がイマイチわからんのですが、操作メニューが違うだけでやることはv8.92と同じでしょうから、先達の書き込みを参考に探ってみます。
追記
シュミレーターの使い方は次のサイトがわかりやすい。というか、この通りにやったらシュミレート出来ました。
MPLAB X の使い方(Simulator編)
MPLABv8.92とはデザインが違いますが、やっていることは同じなので慣れればいいかなと。PICの中身を知らないと何が何やらですけど・・・
テスト用に少し書き換えればFIFOの挙動をチェック出来ます。
#PIC
ループメモリを非同期で読み書きする構造ですから、それぞれのアドレスカウンタの扱いが肝です。当初悩んだものの、条件を整理すれば案外簡単でした。アルゴリズムの設計大事です。
こういったモジュールは例外も想定して慎重に動作確認をしなければなりませんが、実機だと確認が難しいのでMPLABXのシュミレータの出番です。ステップ毎のレジスタの変化を観察したいのです。
MPLABXのシュミレーターは使い方がイマイチわからんのですが、操作メニューが違うだけでやることはv8.92と同じでしょうから、先達の書き込みを参考に探ってみます。
追記
シュミレーターの使い方は次のサイトがわかりやすい。というか、この通りにやったらシュミレート出来ました。
MPLAB X の使い方(Simulator編)
MPLABv8.92とはデザインが違いますが、やっていることは同じなので慣れればいいかなと。PICの中身を知らないと何が何やらですけど・・・
テスト用に少し書き換えればFIFOの挙動をチェック出来ます。
#PIC
LTC Generator のPICのファームウェアを書いています。
今日の課題は「バイトデータ送出モジュール(補正機能付)」です。信号を出す要の部分でしょうか。
30fps、29.97fps、25fps、24fpsに対応する予定ですが、それぞれに適したパルス波長を作る部位です。
1時間単位の計測方法が無いので精度の確認は出来ませんが、オシロスコープで確認する限りは適切なパルス長です。
データ送信も確認しました。0x00と0xFFを繰り返し送出するテストですが、ちゃんと差動バイフェーズの波形が出ています。そこそこ面倒なアルゴリズムですが一発で動いてしまい嬉しいやら寂しいやら。
データに応じた波形が出せる状態になったのでファームウェアは一旦お休み。
この後は、プリアンプの手直し、パソコンからFT232RL経由でデータを送るテストプログラムの作成と続きます。
追記
そういやFIFOモジュールを書いてない。
これは先にやっておきましょう。
#PIC #タイムコード
今日の課題は「バイトデータ送出モジュール(補正機能付)」です。信号を出す要の部分でしょうか。
30fps、29.97fps、25fps、24fpsに対応する予定ですが、それぞれに適したパルス波長を作る部位です。
1時間単位の計測方法が無いので精度の確認は出来ませんが、オシロスコープで確認する限りは適切なパルス長です。
データ送信も確認しました。0x00と0xFFを繰り返し送出するテストですが、ちゃんと差動バイフェーズの波形が出ています。そこそこ面倒なアルゴリズムですが一発で動いてしまい嬉しいやら寂しいやら。
データに応じた波形が出せる状態になったのでファームウェアは一旦お休み。
この後は、プリアンプの手直し、パソコンからFT232RL経由でデータを送るテストプログラムの作成と続きます。
追記
そういやFIFOモジュールを書いてない。
これは先にやっておきましょう。
#PIC #タイムコード
MPLABX-IDEv5.50、XC8_pic-as、PICkit3 の組み合わせでPICが動きました。
今までは古い古いMPLABv8.92を主に使ってきましたが、MPLABXへの引っ越しが終わった感じです。出来るだけ新しいMPLABXを使わないと対応デバイスやら動作クロックの制限があって不便だったのです。
PICに対して行う要点は同じですが、大事なところが微妙に違うのには難儀しました。特に、プログラムメモリアドレスの指定とコンフィゲエーションビットの設定という超重要項目の設定方法が全く違うのには泣かされました。先達の情報に感謝です。
TMR1をコンペアモードで動かして所定の基底パルスが出ています。25fps向けの4,000Hzなので折り返しは250usec.です。オシロスコープにしっかりと波形が出ています。
基本的なところがクリア出来ましたので、試行錯誤で散らかったソースコードを掃除して次のステップです。
追記
音声信号に変換するプリアンプ回路が思った様になりません。
アナログは苦手です。
追記
先達の情報にこんなんがありました。
単電源でアンバランス-バランス変換 その2
単電源でオペアンプを使う際の注意点というか基本が読み取れる回路図です。自分は単電源での使い方を間違って覚えているかもしれません。
試しにブレッドボードで組んでみましょう。
つか、苦手な要素はテストしてから基板作れよっ・・
追記
上記のサイトの回路を参考に、プリアンプ回路の修正基板を描いてみました。オペアンプを搭載するDIP8ピンのパターンに被せる基板です。

全てを作り直してもいいのですが、無駄になる物が多いので、すでに入荷済みの基板にはこの手で使おうかなと。聴くものじゃありませんので多少ノイズが出ても支障ありませんし。
オーダーするのはブレッドボードでのチェックの後にしますケドね。
#PIC #タイムコード
今までは古い古いMPLABv8.92を主に使ってきましたが、MPLABXへの引っ越しが終わった感じです。出来るだけ新しいMPLABXを使わないと対応デバイスやら動作クロックの制限があって不便だったのです。
PICに対して行う要点は同じですが、大事なところが微妙に違うのには難儀しました。特に、プログラムメモリアドレスの指定とコンフィゲエーションビットの設定という超重要項目の設定方法が全く違うのには泣かされました。先達の情報に感謝です。
TMR1をコンペアモードで動かして所定の基底パルスが出ています。25fps向けの4,000Hzなので折り返しは250usec.です。オシロスコープにしっかりと波形が出ています。
基本的なところがクリア出来ましたので、試行錯誤で散らかったソースコードを掃除して次のステップです。
追記
音声信号に変換するプリアンプ回路が思った様になりません。
アナログは苦手です。
追記
先達の情報にこんなんがありました。
単電源でアンバランス-バランス変換 その2
単電源でオペアンプを使う際の注意点というか基本が読み取れる回路図です。自分は単電源での使い方を間違って覚えているかもしれません。
試しにブレッドボードで組んでみましょう。
つか、苦手な要素はテストしてから基板作れよっ・・
追記
上記のサイトの回路を参考に、プリアンプ回路の修正基板を描いてみました。オペアンプを搭載するDIP8ピンのパターンに被せる基板です。


全てを作り直してもいいのですが、無駄になる物が多いので、すでに入荷済みの基板にはこの手で使おうかなと。聴くものじゃありませんので多少ノイズが出ても支障ありませんし。
オーダーするのはブレッドボードでのチェックの後にしますケドね。
#PIC #タイムコード
PICをプログラムするのに開発ツールのMPLABXと書き込み機のPICkitを使っています。
最新のMPLABXでアセンブラファイルを作ったので書き込みのテストを始めたのですがPICkit4が正常に動かない。認識はされているのに書き込みをすると正常な通信が出来ないとエラーを出します。イロイロ試すものの一向に改善しません。
こんな時はヴァージョンを落とすのも対策の一つです。原因がMPLABXにあるのかPICkit4にあるのかわかりませんので、開発ツールも書き込み機も世代を落とします。条件はXC8のアセンブラとPICkit3が使えることです。ver5.40、5.45、5.50が該当します。
ダウンロード済みだったver5.40を試すとアッサリ解決。正常なログが出ました。試行錯誤の6時間はなんだったのでしょう。
当面、ver5シリーズの最終版であるver5.50を使うことにします。
PICが正しく動くかのチェックはこれからです。正しく書きこんだ顔をしているのにダメって可能性もあるので安心するのは早いです。
PICkit4が動かないのは困りますが、こういった開発ツールではヴァージョンアップの過渡期によくあることです。気にしても始まらない。
#PIC
最新のMPLABXでアセンブラファイルを作ったので書き込みのテストを始めたのですがPICkit4が正常に動かない。認識はされているのに書き込みをすると正常な通信が出来ないとエラーを出します。イロイロ試すものの一向に改善しません。
こんな時はヴァージョンを落とすのも対策の一つです。原因がMPLABXにあるのかPICkit4にあるのかわかりませんので、開発ツールも書き込み機も世代を落とします。条件はXC8のアセンブラとPICkit3が使えることです。ver5.40、5.45、5.50が該当します。
ダウンロード済みだったver5.40を試すとアッサリ解決。正常なログが出ました。試行錯誤の6時間はなんだったのでしょう。
当面、ver5シリーズの最終版であるver5.50を使うことにします。
PICが正しく動くかのチェックはこれからです。正しく書きこんだ顔をしているのにダメって可能性もあるので安心するのは早いです。
PICkit4が動かないのは困りますが、こういった開発ツールではヴァージョンアップの過渡期によくあることです。気にしても始まらない。
#PIC
オレメモです。
PICにおいてPORTx,nに対するbit反転方法。
TMR1のコンペアで割り込みしてPORTの出力を反転すればパルスになりますから、差動バイフェーズで重要です。
; PORTAの3bit目だけ反転させる。
MOVLW 00001000B ; Wレジスタにフィルタ値を定義 3bit目だけ1
XORWF PORTA,SELF ; PORTAの3bit目だけを反転
※ 書式はXC8のPIC-as
データシート読むとPORTxではなくLATxに対して計算を当てるのがいいらしいのですが、ここではわかりやすさのためにあえてPORT相手です。
XORの計算は次の通り。
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
PIC16系にはbit単位の反転命令がありませんので、反転させたいbitだけ1にしたフィルタ値をXORで当てます。
左の値をPORTの現在値、右の値をフィルタ値とすると、2行目と4行目が反転になり、1行目と3行目は非反転になります。
論理演算の基本ちゃ基本ですが、案外忘れてしまうのでメモメモ。
アセンブラに限らずですが、出来るだけ簡単な計算で条件分岐を行うことが大事です。
例えば処理を10回繰り返すとして、0から加算してカウンタが10になったことを判断するより、10から減算して0になったことを判断する方が好みです。PICのアセンブラの分岐処理は計算結果が0かで扱うのが自然だからです。
; 10回繰り返す
MOVLW 10 ; COUNTに10を設定する
MOVWF COUNT ;
LOOP:
~ 10回繰り返す処理をここに書く ~
DECFSZ COUNT,SELF ; COUNTをデクリメント(-1)し、結果が0なら次行の処理を飛ばす
GOTO LOOP ; LOOPを繰り返す
~ 繰り返しの後の処理をここに書く ~
DECFSZはDECFとBTFSSを組み合わせたマクロ命令みたいなものです。
少し蛇足ですが、レジスタの現在値が0であるかを見るには、
; レジスタNUMの値は0か?
MOVF NUM,SELF ; 自分自身へ値をコピー
BTFSC STATUS,ZE ; 計算結果がゼロかどうかで分岐
GOTO NUMisZERO ; ゼロの場合NUMisZEROへジャンプ(CALLでもいいけど)
MOVFで自分自身に値をコピーするとSTATUSのゼロフラグ以外変化しないので便利です。
もちろんWレジスタにコピーしても同じ結果を得られますが、Wレジスタが変化しない方がスッキリまとまることが多いようです。
てな感じで、PICのアセンブラのリハビリをしています。
#PIC
PICにおいてPORTx,nに対するbit反転方法。
TMR1のコンペアで割り込みしてPORTの出力を反転すればパルスになりますから、差動バイフェーズで重要です。
; PORTAの3bit目だけ反転させる。
MOVLW 00001000B ; Wレジスタにフィルタ値を定義 3bit目だけ1
XORWF PORTA,SELF ; PORTAの3bit目だけを反転
※ 書式はXC8のPIC-as
データシート読むとPORTxではなくLATxに対して計算を当てるのがいいらしいのですが、ここではわかりやすさのためにあえてPORT相手です。
XORの計算は次の通り。
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
PIC16系にはbit単位の反転命令がありませんので、反転させたいbitだけ1にしたフィルタ値をXORで当てます。
左の値をPORTの現在値、右の値をフィルタ値とすると、2行目と4行目が反転になり、1行目と3行目は非反転になります。
論理演算の基本ちゃ基本ですが、案外忘れてしまうのでメモメモ。
アセンブラに限らずですが、出来るだけ簡単な計算で条件分岐を行うことが大事です。
例えば処理を10回繰り返すとして、0から加算してカウンタが10になったことを判断するより、10から減算して0になったことを判断する方が好みです。PICのアセンブラの分岐処理は計算結果が0かで扱うのが自然だからです。
; 10回繰り返す
MOVLW 10 ; COUNTに10を設定する
MOVWF COUNT ;
LOOP:
~ 10回繰り返す処理をここに書く ~
DECFSZ COUNT,SELF ; COUNTをデクリメント(-1)し、結果が0なら次行の処理を飛ばす
GOTO LOOP ; LOOPを繰り返す
~ 繰り返しの後の処理をここに書く ~
DECFSZはDECFとBTFSSを組み合わせたマクロ命令みたいなものです。
少し蛇足ですが、レジスタの現在値が0であるかを見るには、
; レジスタNUMの値は0か?
MOVF NUM,SELF ; 自分自身へ値をコピー
BTFSC STATUS,ZE ; 計算結果がゼロかどうかで分岐
GOTO NUMisZERO ; ゼロの場合NUMisZEROへジャンプ(CALLでもいいけど)
MOVFで自分自身に値をコピーするとSTATUSのゼロフラグ以外変化しないので便利です。
もちろんWレジスタにコピーしても同じ結果を得られますが、Wレジスタが変化しない方がスッキリまとまることが多いようです。
てな感じで、PICのアセンブラのリハビリをしています。
#PIC
LTC Generator のファームウェアもボチボチ製作開始です。初期設定から整理を始めています。
まずはPICとプリアンプの確認を兼ねてパルス出力のテストプログラムからでしょうか。これが思惑通りにならないと何も始まりません。
30fps向けの2,400bpsと25fps向けの2,000bpsです。実際は倍の4,800Hzと4,000Hzのパルス生成です。
生成にはTMR1をコンペアモードで使います。
TMR1はタイマと呼ばれるもので、CPUクロックなどをキーにした自動カウンターです。時間の計測に使えます。
コンペアとはタイマが指定の値になったらタイマの値を初期化しつつフラグを立てる機能です。一定の周期を得られます。
周期を動的に調整して1時間あたりの総カウント数を出来るだけ正確にしようというのが今回の肝です。
#PIC #器具の製作 #タイムコード
まずはPICとプリアンプの確認を兼ねてパルス出力のテストプログラムからでしょうか。これが思惑通りにならないと何も始まりません。
30fps向けの2,400bpsと25fps向けの2,000bpsです。実際は倍の4,800Hzと4,000Hzのパルス生成です。
生成にはTMR1をコンペアモードで使います。
TMR1はタイマと呼ばれるもので、CPUクロックなどをキーにした自動カウンターです。時間の計測に使えます。
コンペアとはタイマが指定の値になったらタイマの値を初期化しつつフラグを立てる機能です。一定の周期を得られます。
周期を動的に調整して1時間あたりの総カウント数を出来るだけ正確にしようというのが今回の肝です。
#PIC #器具の製作 #タイムコード
Linux上のC言語でLTCの波形を起こせたらと思ったのですが、処理能力の総量は余裕タップリなものの、Art-Netエンジンを作った際に感じた挙動ムラから想像するに許容範囲を越える波形ムラが起こりそうです。LinuxはOSそのものや他のモジュールに引っ張られて100~300usecくらい待たされることがあるのですが、LTCの波形を起こすのにこの条件はよろしくありません。RTOSを使わないなら普通のことですけどね。
ならばLTCを起こすところにはPICを使ったらいいかな?適材適所?
LinuxからUARTなどでフレーム情報を送ってPICでLTCを生成するのです。2~4フレーム分くらいPICにバッファすればLinux側に動作ムラがあっても安定した波形を出すと思われます。
差動バイフェーズで信号を反転する時間ピッチは25fpsで250usecです。29.97fpsではなく25fpsとしているのは、PALのレートなのでLTC対応の演出機器は100%対応するし、何よりも計算がしやすく誤差も出にくいために当面の試作には良いかなと。250usecは32MHzのPICで2,000命令相当の時間です。これだけあれば大概ことは1フェーズ分実行出来ます。実行周期はTMR1やTMR2による周期割込みを使えばPICのクロック素子相当の精度を得られます。
求める精度は、周期が0.001%未満、差動バイフェーズの立ち上がり立下り精度が5%未満です。無理は無さそうです。
書いてて思ったのですが、こんなLTCジェネレーターをこれまでに作らなかった自分が不思議。
#タイムコード #PIC #電子工作
ならばLTCを起こすところにはPICを使ったらいいかな?適材適所?
LinuxからUARTなどでフレーム情報を送ってPICでLTCを生成するのです。2~4フレーム分くらいPICにバッファすればLinux側に動作ムラがあっても安定した波形を出すと思われます。
差動バイフェーズで信号を反転する時間ピッチは25fpsで250usecです。29.97fpsではなく25fpsとしているのは、PALのレートなのでLTC対応の演出機器は100%対応するし、何よりも計算がしやすく誤差も出にくいために当面の試作には良いかなと。250usecは32MHzのPICで2,000命令相当の時間です。これだけあれば大概ことは1フェーズ分実行出来ます。実行周期はTMR1やTMR2による周期割込みを使えばPICのクロック素子相当の精度を得られます。
求める精度は、周期が0.001%未満、差動バイフェーズの立ち上がり立下り精度が5%未満です。無理は無さそうです。
書いてて思ったのですが、こんなLTCジェネレーターをこれまでに作らなかった自分が不思議。
#タイムコード #PIC #電子工作