全年全月24日の投稿[36件](2ページ目)
2023年5月 この範囲を時系列順で読む この範囲をファイルに出力する
オレメモです。
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 #器具の製作 #タイムコード
MUSES01DのDI-1のエージングは135時間経過です。
劇的ではないものの、時間経過と共に安定感と明瞭感が増しています。無改造品との違いも分かりやすくなってきました。
今朝感じたことは、アコースティックギターのピックや指が擦れる音が一層明瞭に聴こえてきたことです。そういった音を主張したミキシングではありませんし、パルスに近い音が大きくなったワケでもありませんが、音の向こうの無音が以前より感じられる様になったとでも言えばいいでしょうか。聴こえるということは音が大きくなったかそれを隠す余計な音が無くなったかのどちらかですが、原因は定かでないものの、聴き取り難かった音が明瞭になったことは事実です。
音作りは好みの世界で、低能率やノイズすら「味」や「色」とされることもありますが、ダイレクトボックスは楽器の音をPAに受け渡す入口ですから正確に次に渡すことが役目だと考えています。正確の意味は演奏者が作った音を足しもせず引きもせずということです。
どこからの情報かわからないのですが、MUSES01Dのエージングは300~350時間らしいので半分経過です。
ちなみに無改造品の変化は止まった気がします。そのため改造品と差が開いた印象があるのかもしれません。途中参戦なので少し短いですが、ここまでのエージング時間は約80時間だと思います。
今後も改造品と共にエージングを続けますが、無改造品のエージングは歪み限界から-3dBのピンクノイズを100時間当てる、としておきましょう。
#音の世界
劇的ではないものの、時間経過と共に安定感と明瞭感が増しています。無改造品との違いも分かりやすくなってきました。
今朝感じたことは、アコースティックギターのピックや指が擦れる音が一層明瞭に聴こえてきたことです。そういった音を主張したミキシングではありませんし、パルスに近い音が大きくなったワケでもありませんが、音の向こうの無音が以前より感じられる様になったとでも言えばいいでしょうか。聴こえるということは音が大きくなったかそれを隠す余計な音が無くなったかのどちらかですが、原因は定かでないものの、聴き取り難かった音が明瞭になったことは事実です。
音作りは好みの世界で、低能率やノイズすら「味」や「色」とされることもありますが、ダイレクトボックスは楽器の音をPAに受け渡す入口ですから正確に次に渡すことが役目だと考えています。正確の意味は演奏者が作った音を足しもせず引きもせずということです。
どこからの情報かわからないのですが、MUSES01Dのエージングは300~350時間らしいので半分経過です。
ちなみに無改造品の変化は止まった気がします。そのため改造品と差が開いた印象があるのかもしれません。途中参戦なので少し短いですが、ここまでのエージング時間は約80時間だと思います。
今後も改造品と共にエージングを続けますが、無改造品のエージングは歪み限界から-3dBのピンクノイズを100時間当てる、としておきましょう。
#音の世界
2023年4月 この範囲を時系列順で読む この範囲をファイルに出力する
とりあえずの探り設定で綺麗にプリント出来ました。一つ前のプリントの不良は解消。
これから数日は「靴屋の小人」さんに日夜頑張ってもらいましょう。1セット5時間半なので、出勤前と寝る前に開始、1日2セットです。
製作数は未定ですが、角パイプを4mも買ってしまったので半分は使おうかなと。角パイプを90mm使うので20個程度作れます。パチモンTRUE1は山ほどあります。
#3Dプリンタ
これから数日は「靴屋の小人」さんに日夜頑張ってもらいましょう。1セット5時間半なので、出勤前と寝る前に開始、1日2セットです。
製作数は未定ですが、角パイプを4mも買ってしまったので半分は使おうかなと。角パイプを90mm使うので20個程度作れます。パチモンTRUE1は山ほどあります。
#3Dプリンタ
フィラメントを使い切ったので別な物に交換。反り難いと高評価の物。
十分綺麗なプリントだし謳い文句の通り反りは少ないけれど、ノズルの温度が合っていない感じがします。縁にバリというかブツブツが出るのです。温度設定をどうするか・・・
購入ページで確認し直したところ、ノズルの推奨温度が今までのフィラメントよりも15度くらい高い。その代わりプラットホームの推奨温度は5度くらい低い。
今のプリンタでノズル温度をそこまで上げられるのか疑問だけど、反りが少ないので使える様にしたい。
改めて条件出しです。
#3Dプリンタ
十分綺麗なプリントだし謳い文句の通り反りは少ないけれど、ノズルの温度が合っていない感じがします。縁にバリというかブツブツが出るのです。温度設定をどうするか・・・
購入ページで確認し直したところ、ノズルの推奨温度が今までのフィラメントよりも15度くらい高い。その代わりプラットホームの推奨温度は5度くらい低い。
今のプリンタでノズル温度をそこまで上げられるのか疑問だけど、反りが少ないので使える様にしたい。
改めて条件出しです。
#3Dプリンタ
2023年3月 この範囲を時系列順で読む この範囲をファイルに出力する
ライトアップを終わらせました。

架台と照明の作業比は9:1くらいでした。照明はなんちゃことなかったのですが、架台は部品製作から現地設置まで丸一週間かかりましたので。
電源コネクタはTRUE1です。対候性能はIP65ですから、水没しない条件で全天候対応です。屋内でも普通に使えますから、直電源ケーブルは全てコレにしたい。
純正品は高価ですが、中華電機で互換品(もといパチモン)が手に入ります。全身黒もあります。
中華電機には色々なセラーがいますが「R Conector Store」は良心的なパチモンを扱っていると思います。
良心的なパチモンとはコレ如何にだけど、下請け工場が5時から仕事で作っている感じですから中身はホンモノかなと。ちなみに「5時から仕事」とはホンモノを作っているところが横流し品を作ることを言います。
#本業

架台と照明の作業比は9:1くらいでした。照明はなんちゃことなかったのですが、架台は部品製作から現地設置まで丸一週間かかりましたので。
電源コネクタはTRUE1です。対候性能はIP65ですから、水没しない条件で全天候対応です。屋内でも普通に使えますから、直電源ケーブルは全てコレにしたい。
純正品は高価ですが、中華電機で互換品(もといパチモン)が手に入ります。全身黒もあります。
中華電機には色々なセラーがいますが「R Conector Store」は良心的なパチモンを扱っていると思います。
良心的なパチモンとはコレ如何にだけど、下請け工場が5時から仕事で作っている感じですから中身はホンモノかなと。ちなみに「5時から仕事」とはホンモノを作っているところが横流し品を作ることを言います。
#本業
2023年2月 この範囲を時系列順で読む この範囲をファイルに出力する
Art-Net関連は脳裏に湧いたアイデアを一通り吐き出したら次の壁が見えてしまいました。
Pythonでは思うように作れなかったことがC言語によって解決出来たことは成果ですが、最後の壁を攻略したと思ったのに次の壁が霧の先に見えています。登る方法や降りる方法、はたまたトンネルを掘る方法を地道に探さんといけません。登るべきか掘るべきかルートを変えるべきかも壁の先が見えないのでわからんのですけど、壁が間近に見えるところまで行って一服すかね。
壁と書きましたが、その筋の専門家にとっては小さな水溜りかな?
四の五のと言葉を積んでも出来んことは出来んので、一服ついでに棚上げになってるネタに手を付けています。
「後は組むだけ」で放置してあるネタが幾つかあるのでそれをヤリ切ってしまいましょう。
児童公園の築山を攻略してガッツポーズする50代も格好悪すぎてワルくないwww
#雑談
Pythonでは思うように作れなかったことがC言語によって解決出来たことは成果ですが、最後の壁を攻略したと思ったのに次の壁が霧の先に見えています。登る方法や降りる方法、はたまたトンネルを掘る方法を地道に探さんといけません。登るべきか掘るべきかルートを変えるべきかも壁の先が見えないのでわからんのですけど、壁が間近に見えるところまで行って一服すかね。
壁と書きましたが、その筋の専門家にとっては小さな水溜りかな?
四の五のと言葉を積んでも出来んことは出来んので、一服ついでに棚上げになってるネタに手を付けています。
「後は組むだけ」で放置してあるネタが幾つかあるのでそれをヤリ切ってしまいましょう。
児童公園の築山を攻略してガッツポーズする50代も格好悪すぎてワルくないwww
#雑談
2023年1月 この範囲を時系列順で読む この範囲をファイルに出力する
本業では社内のサーバーやパソコンのメンテをしていますが、処理の待ち時間でC言語のお勉強。
時間についてです。
DMXを扱うには無受信1秒でタイムアウトしなければなりませんし、Delayを構成するには1/30~1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。
ですので、msec(1/1000)クラスの時間評価が必要です。
システムが持つ時間情報を扱うには<time.h>を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒(UTC))からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の1秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。
ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。
#C言語
時間についてです。
DMXを扱うには無受信1秒でタイムアウトしなければなりませんし、Delayを構成するには1/30~1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。
ですので、msec(1/1000)クラスの時間評価が必要です。
システムが持つ時間情報を扱うには<time.h>を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒(UTC))からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の1秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。
ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。
#C言語
オレメモであります。
参考になりそうな先達のページ
● UDP/IP通信全体の参考
UDP / IP でパケットの送受信を行う
● broadcast通信の参考
UDPブロードキャスト送信サンプル
● ネットワークデバイスを指定した通信の参考
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)
● 受信タイムアウトの参考
selectを使用してタイムアウト付き受信を実現する <= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。
UDP通信におけるselectの使い方。 <= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。
● 時間の扱い方
時間情報の取得方法と扱い方 <= これの5ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。
● ターミナルの行長と行数を取得する
ターミナルのサイズを取得する
ターミナルの幅と高さを得る
● ANSIエスケープシーケンス
ANSIエスケープシーケンス チートシート
この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。
ただし、1行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。
実験は受信が当面の課題となり、
1)ネットワークデバイスを指定せずArt-Netを受信する。<= とにかく受信する
2)ネットワークデバイスを指定してArt-Netを受信する。<= ネットワークデバイスを制限して受信する。
3)送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。<= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。
といった手順で進めることになろうかと思います。
受信値を確認するため、習作を兼ね、バイナリをダンプ表示をするライブラリも作ってみましょう。
#C言語 #[Art-Net]
参考になりそうな先達のページ
● UDP/IP通信全体の参考
UDP / IP でパケットの送受信を行う
● broadcast通信の参考
UDPブロードキャスト送信サンプル
● ネットワークデバイスを指定した通信の参考
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)
● 受信タイムアウトの参考
selectを使用してタイムアウト付き受信を実現する <= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。
UDP通信におけるselectの使い方。 <= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。
● 時間の扱い方
時間情報の取得方法と扱い方 <= これの5ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。
● ターミナルの行長と行数を取得する
ターミナルのサイズを取得する
ターミナルの幅と高さを得る
● ANSIエスケープシーケンス
ANSIエスケープシーケンス チートシート
この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。
ただし、1行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。
実験は受信が当面の課題となり、
1)ネットワークデバイスを指定せずArt-Netを受信する。<= とにかく受信する
2)ネットワークデバイスを指定してArt-Netを受信する。<= ネットワークデバイスを制限して受信する。
3)送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。<= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。
といった手順で進めることになろうかと思います。
受信値を確認するため、習作を兼ね、バイナリをダンプ表示をするライブラリも作ってみましょう。
#C言語 #[Art-Net]
RTCを装着したRaspberryPiは正常のようです。
今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。
socketの実験は連休中に時間が取れず未対応です。
Art-Netの受信と送信を1台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。
RaspberryPiのPythonでは成功していることですから可能だと思いますが、C言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。
#RaspberryPi #C言語 #[Art-Net]
今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。
socketの実験は連休中に時間が取れず未対応です。
Art-Netの受信と送信を1台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。
RaspberryPiのPythonでは成功していることですから可能だと思いますが、C言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。
#RaspberryPi #C言語 #[Art-Net]