全年全月2日の投稿[45件](3ページ目)
2024年6月 この範囲を時系列順で読む この範囲をファイルに出力する
今更ですが、PIC の開発環境を MPLAB-X に完全移行しています。このところ PIC のソースコードを書いていなかったので取り急ぎの必要がなかったのですが、DMX のスプリッターを増産することになったのでこの際といったところです。
問題点はアセンブラが MPASM から XC8 になったためソースコードの記述が違うことです。
以前にも少し書いたのですが、整理したので改めて揚げてみます。
1)ラベル文字の最後に ' : ' をつける
例:
--- MPASM ---
LOOP
NOP
GOTO LOOP
--- xc8_asm ---
LOOP:
NOP
GOTO LOOP
2)0x以外の数値識別子が異なる
例:
--- MPASM ---
2進数 B'01001111'
8進数 O'72'
10進数 D'34' または .34
16進数 H'4F' または 0x4F
--- xc8_asm ---
2進数 01001111B
8進数 72Q
10進数 34
16進数 04FH または 0x4F
3)cblock は使えないので equ を使用する
4)org の代わりに、psect を使用する
コードの開始アドレスを指示するのだが、二か所に記述する。これまで ORG を書いた本文の位置と Linker に記述。
例1:
インデックスの名前を Code_Start としアドレスを 0x0000 とする場合。
(1) 開始アドレスを与えたいコードの直上に次を記述する。ORG の代わりに用いるものである。
PSECT Code_Start,class=CODE,delta=2
(2) <project properties ダイアログ> <pic-as Linker> <Custom linker options> に以下を記述する。
-pStart_Code=0h
例2:
インデックスの名前を Int_Vec としアドレスを 0x0004 とする場合。
(1) 開始アドレスを与えたいコードの直上に次を記述する。ORG の代わりに用いるものである。
PSECT Int_Vec,class=CODE,delta=2
(2) <project properties ダイアログ> <pic-as Linker> <Custom linker options> に以下を記述する。
-pInt_Vec=4h
例3:
インデックスの名前を Tables としアドレスを 0x0400 とする場合。
(1) 開始アドレスを与えたいコードの直上に次を記述する。ORG の代わりに用いるものである。
PSECT Tables,class=CODE,delta=2
(2) <project properties ダイアログ> <pic-as Linker> <Custom linker options> に以下を記述する。
-pTables=400h
5)コンフィグ指定は、xc8 の形式とする
MPLABX のメニュー [Production] [Set Configuration Bits] を用いると各項目の設定から以下のようなコードの生成まで出来るので本文の冒頭にコピペする。
例:
; CONFIG1
CONFIG FOSC = EXTRCCLK ; Oscillator Selection bits (EXTRC oscillator; CLKO function on RA6/OSC2/CLKO)
CONFIG WDTE = ON ; Watchdog Timer Enable bit (WDT enabled)
CONFIG PWRTE = OFF ; Power-up Timer Enable bit (PWRT disabled)
CONFIG MCLRE = ON ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
CONFIG BOREN = ON ; Brown-out Reset Enable bit (BOR enabled)
CONFIG LVP = ON ; Low-Voltage Programming Enable bit (RB3/PGM pin has PGM function, Low-Voltage Programming enabled)
CONFIG CPD = OFF ; Data EE Memory Code Protection bit (Code protection off)
CONFIG WRT = OFF ; Flash Program Memory Write Enable bits (Write protection off)
CONFIG CCPMX = RB0 ; CCP1 Pin Selection bit (CCP1 function on RB0)
CONFIG CP = OFF ; Flash Program Memory Code Protection bit (Code protection off)
; CONFIG2
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
CONFIG IESO = ON ; Internal External Switchover bit (Internal External Switchover mode enabled)
6)オペランドでの SFR の表記に注意する
詳細が長すぎるのでここでは割愛
追記
不思議な現象が発生。
MPLABXv5.5ではアセンプルが通るのにv6.2ではエラーが出て通らないプロジェクトがある。アセンブラはどちらも同じバージョンのXC8。
エラーメッセージを見ると書いたソースコードではなく内部的なツールにエラーが起きているとある。
さて、とこから詰めていきましょうか。
#PIC
問題点はアセンブラが MPASM から XC8 になったためソースコードの記述が違うことです。
以前にも少し書いたのですが、整理したので改めて揚げてみます。
1)ラベル文字の最後に ' : ' をつける
例:
--- MPASM ---
LOOP
NOP
GOTO LOOP
--- xc8_asm ---
LOOP:
NOP
GOTO LOOP
2)0x以外の数値識別子が異なる
例:
--- MPASM ---
2進数 B'01001111'
8進数 O'72'
10進数 D'34' または .34
16進数 H'4F' または 0x4F
--- xc8_asm ---
2進数 01001111B
8進数 72Q
10進数 34
16進数 04FH または 0x4F
3)cblock は使えないので equ を使用する
4)org の代わりに、psect を使用する
コードの開始アドレスを指示するのだが、二か所に記述する。これまで ORG を書いた本文の位置と Linker に記述。
例1:
インデックスの名前を Code_Start としアドレスを 0x0000 とする場合。
(1) 開始アドレスを与えたいコードの直上に次を記述する。ORG の代わりに用いるものである。
PSECT Code_Start,class=CODE,delta=2
(2) <project properties ダイアログ> <pic-as Linker> <Custom linker options> に以下を記述する。
-pStart_Code=0h
例2:
インデックスの名前を Int_Vec としアドレスを 0x0004 とする場合。
(1) 開始アドレスを与えたいコードの直上に次を記述する。ORG の代わりに用いるものである。
PSECT Int_Vec,class=CODE,delta=2
(2) <project properties ダイアログ> <pic-as Linker> <Custom linker options> に以下を記述する。
-pInt_Vec=4h
例3:
インデックスの名前を Tables としアドレスを 0x0400 とする場合。
(1) 開始アドレスを与えたいコードの直上に次を記述する。ORG の代わりに用いるものである。
PSECT Tables,class=CODE,delta=2
(2) <project properties ダイアログ> <pic-as Linker> <Custom linker options> に以下を記述する。
-pTables=400h
5)コンフィグ指定は、xc8 の形式とする
MPLABX のメニュー [Production] [Set Configuration Bits] を用いると各項目の設定から以下のようなコードの生成まで出来るので本文の冒頭にコピペする。
例:
; CONFIG1
CONFIG FOSC = EXTRCCLK ; Oscillator Selection bits (EXTRC oscillator; CLKO function on RA6/OSC2/CLKO)
CONFIG WDTE = ON ; Watchdog Timer Enable bit (WDT enabled)
CONFIG PWRTE = OFF ; Power-up Timer Enable bit (PWRT disabled)
CONFIG MCLRE = ON ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
CONFIG BOREN = ON ; Brown-out Reset Enable bit (BOR enabled)
CONFIG LVP = ON ; Low-Voltage Programming Enable bit (RB3/PGM pin has PGM function, Low-Voltage Programming enabled)
CONFIG CPD = OFF ; Data EE Memory Code Protection bit (Code protection off)
CONFIG WRT = OFF ; Flash Program Memory Write Enable bits (Write protection off)
CONFIG CCPMX = RB0 ; CCP1 Pin Selection bit (CCP1 function on RB0)
CONFIG CP = OFF ; Flash Program Memory Code Protection bit (Code protection off)
; CONFIG2
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
CONFIG IESO = ON ; Internal External Switchover bit (Internal External Switchover mode enabled)
6)オペランドでの SFR の表記に注意する
詳細が長すぎるのでここでは割愛
追記
不思議な現象が発生。
MPLABXv5.5ではアセンプルが通るのにv6.2ではエラーが出て通らないプロジェクトがある。アセンブラはどちらも同じバージョンのXC8。
エラーメッセージを見ると書いたソースコードではなく内部的なツールにエラーが起きているとある。
さて、とこから詰めていきましょうか。
#PIC
2024年5月 この範囲を時系列順で読む この範囲をファイルに出力する
12tのコンパネを貼り合わせて24tにするには挟み込む治具が必要と思われます。平台状の物でサンドイッチしてクランプで圧着するのです。床に置いて重しをしても木工ボンドの湿気による反りに負けない様にするにはかなりの重量が必要だからです。
平台は材料ナリで作っても必要な精度は出そうですが収納場所が問題。こんなモノに良い場所を与えるワケにもいきませんが、奥まったところに置くと取り出すのが不便です。
とりあえず作ってから悩んでもいいか・・・。
#ガチ工作
平台は材料ナリで作っても必要な精度は出そうですが収納場所が問題。こんなモノに良い場所を与えるワケにもいきませんが、奥まったところに置くと取り出すのが不便です。
とりあえず作ってから悩んでもいいか・・・。
#ガチ工作
2024年4月 この範囲を時系列順で読む この範囲をファイルに出力する
ATX電源を止めるネジについて調べました。PCでは多く使われる物ですが、「UNC No.6 32山」だそうです。
歴史上の名残りというか、USAではインチベースのネジが未だに使われているためかな?
USAで一般的なインチネジにはW(ウィット)、UNF、UNCと3種類あるそうな。ISOネジに統一してくれたらいいのにねぇ~。
追記
Wはネジ山の角度が55度のインチネジ、UNCやUNFは60度のインチネジだそうな。Wはウィットネジ、UNCとUNFはユニファイネジと呼称される。UNCとUNFの違いはISOで言うところの並ネジと細ネジ。UNFが細ネジ。
蛇足ですがW1/4とUNC1/4はほぼ同じ。UNC1/4はカメラ系の固定で使われることが多いのですが、UNC1/4の雌ネジにW1/4の雄ネジは普通に入ります。山は少し違いますが、太さも山ピッチも同じですから。
#工具と資材
歴史上の名残りというか、USAではインチベースのネジが未だに使われているためかな?
USAで一般的なインチネジにはW(ウィット)、UNF、UNCと3種類あるそうな。ISOネジに統一してくれたらいいのにねぇ~。
追記
Wはネジ山の角度が55度のインチネジ、UNCやUNFは60度のインチネジだそうな。Wはウィットネジ、UNCとUNFはユニファイネジと呼称される。UNCとUNFの違いはISOで言うところの並ネジと細ネジ。UNFが細ネジ。
蛇足ですがW1/4とUNC1/4はほぼ同じ。UNC1/4はカメラ系の固定で使われることが多いのですが、UNC1/4の雌ネジにW1/4の雄ネジは普通に入ります。山は少し違いますが、太さも山ピッチも同じですから。
#工具と資材
ATX(SFX)電源の汎用化を進めているのは RaspberryPi の開発環境を整えるためです。
ATX電源は一般的な汎用電源に比べ出力に余裕があり、安価な製品も多く、私の場合は手元にジャンク品があるためコスパが良い。ただ、汎用電源化するには何らかの加工をしなければならないのがネック。
今回はリセッタブルヒューズを介してJSTのXHコネクタで取り出せる基板を作りましたが、こういった物はあるようでありません。物凄くニッチな代物となりますが、ATX電源を汎用電源化するグッズがあってもいいような気がします。
数日前、基板が届きましたのでケースの加工をしております。
ホームセンターで入手したトランクケースの中に電源を固定します。いわゆるブリーフケースタイプではなく寸胴な工具箱タイプですが、これの側面に角穴を空けプリントしたパネルを介してSFX電源を固定します。この後はモニタをフタの内側に取り付けますので、形がまとまったら写真を揚げてみます。
箱に標準実装するのは電源とモニタだけです。空きスペースは十分にありますので、ここに開発に必要な用品( RaspberryPi や周辺機器)を仮組みしておくのです。いつ終わるかわからない作業のために占領し続ける場所もありませんし、都度組むのも面倒なので、お店を広げたままの作業机を持ち運びするイメージになればと。
#電子工作 #ガチ工作 #器具の製作
ATX電源は一般的な汎用電源に比べ出力に余裕があり、安価な製品も多く、私の場合は手元にジャンク品があるためコスパが良い。ただ、汎用電源化するには何らかの加工をしなければならないのがネック。
今回はリセッタブルヒューズを介してJSTのXHコネクタで取り出せる基板を作りましたが、こういった物はあるようでありません。物凄くニッチな代物となりますが、ATX電源を汎用電源化するグッズがあってもいいような気がします。
数日前、基板が届きましたのでケースの加工をしております。
ホームセンターで入手したトランクケースの中に電源を固定します。いわゆるブリーフケースタイプではなく寸胴な工具箱タイプですが、これの側面に角穴を空けプリントしたパネルを介してSFX電源を固定します。この後はモニタをフタの内側に取り付けますので、形がまとまったら写真を揚げてみます。
箱に標準実装するのは電源とモニタだけです。空きスペースは十分にありますので、ここに開発に必要な用品( RaspberryPi や周辺機器)を仮組みしておくのです。いつ終わるかわからない作業のために占領し続ける場所もありませんし、都度組むのも面倒なので、お店を広げたままの作業机を持ち運びするイメージになればと。
#電子工作 #ガチ工作 #器具の製作
2024年1月 この範囲を時系列順で読む この範囲をファイルに出力する
帰省してきました。車で20分ですが。
高齢になっても話がシッカリして元気にしている両親には安心しつつ感謝しましたが、帰省あるあるお土産の山。これ持っていけ、あれ持っていけ。
全て食品ですが、傷む前に食いきれるのか?といった量。
これはお裾分けしないといけません。
帰宅したので製作の再開です。
2品目のハンダ付けから。表面実装部品のリフローハンダです。
#器具の製作
高齢になっても話がシッカリして元気にしている両親には安心しつつ感謝しましたが、帰省あるあるお土産の山。これ持っていけ、あれ持っていけ。
全て食品ですが、傷む前に食いきれるのか?といった量。
これはお裾分けしないといけません。
帰宅したので製作の再開です。
2品目のハンダ付けから。表面実装部品のリフローハンダです。
#器具の製作
2023年11月 この範囲を時系列順で読む この範囲をファイルに出力する
C60A-C30Aの分岐ボックスは未来工業さんのPVP201007Aで構成案を描いてみたところいい感じ。ケーブルの取り回しを充分に考慮しないと手詰まりになりますから細かいレイアウト図を起こしています。
追記
スケッチを揚げます。部品の形状の三面図をメーカーのDXFや実測から起こしてレイアウトを試します。こういったスケッチで検討してから寸法図・加工図を起こします。
少し大きいケースはPVP-201507Aです。

余談ですが、PDF出力する仮想プリンタドライバとして「Cube PDF」を使っています。フリーウェアとは思えない程の機能と使いやすさ。さらにはPDFだけでなく、PS、EPS、PNG、JPEG、BMP、TIFFも出力出来ます。上記はそれで起こしています。
アプリに付属の画像出力がイマイチの場合に便利です。ただ、画像の解像度が高すぎる傾向がありますので、用途に合わせて別アプリで解像度を調整すると良いようです。
#器具の製作
追記
スケッチを揚げます。部品の形状の三面図をメーカーのDXFや実測から起こしてレイアウトを試します。こういったスケッチで検討してから寸法図・加工図を起こします。
少し大きいケースはPVP-201507Aです。

余談ですが、PDF出力する仮想プリンタドライバとして「Cube PDF」を使っています。フリーウェアとは思えない程の機能と使いやすさ。さらにはPDFだけでなく、PS、EPS、PNG、JPEG、BMP、TIFFも出力出来ます。上記はそれで起こしています。
アプリに付属の画像出力がイマイチの場合に便利です。ただ、画像の解像度が高すぎる傾向がありますので、用途に合わせて別アプリで解像度を調整すると良いようです。
#器具の製作
2023年9月 この範囲を時系列順で読む この範囲をファイルに出力する
pyinstaller でexeファイルを作ってみましたが環境によって微妙な不具合が出ます。原因は不明ですが、pyinstaller の操作手順かもしれません。
「PyinstallerでPythonプログラムをexe化する手順書(Windows編)」
上記を参考に作った exeファイルは自分の環境では問題なく動いたのですが、ここに一工夫加えてみようと思います。
仮想環境での実行が推奨されていますが、pyinstaller 自体も仮想環境にインストールするべきなのかもしれません。別の先達情報にはその様に書かれている物があります。
「PyInstallerを使ってみた」
追記
作業手順のオレメモ。
仮想環境に pyinstaller を入れての実行の方が良いようです。
作業ディレクトリに移動
> cd <作業ディレクトリ>
pipenv をインストール
> pip install pipenv
pipenv で使う python のバージョンを指定
> pipenv --python 3.9
pipenv(仮想環境)を開始
> pipenv shell
仮想環境にpyinstaller をインストール
> pipenv install -d pyinstaller
必要なライブラリをインストール
> pipenv install pyserial
> pipenv install PySimpleGUI
> pipenv install python-vlc
・・・etc
ビルドする
> pyinstaller ltcplayer.py --clean --noconcole --onefile
・・・数分で終わる。
作業ディレクトリ内の distフォルダ内 に ltcplayer.exe が出来ている。
終了なら仮想環境のshellから抜ける
> exit
仮想環境を削除
> pipenv --rm
作業ディレクトリは Python のソースコードがある階層でもいいのだけれど、
ゴチャゴチャするので私は一つ下の階層で作業をしています。
ソースコードがある階層で
> mkdir env
> cd env
> pyinstaller ..\ltcplayer.py --clean --noconcole --onefile
相対パスでソースコードを一つ上の階層として呼びます。
お好みですけど。
#Python #タイムコード
「PyinstallerでPythonプログラムをexe化する手順書(Windows編)」
上記を参考に作った exeファイルは自分の環境では問題なく動いたのですが、ここに一工夫加えてみようと思います。
仮想環境での実行が推奨されていますが、pyinstaller 自体も仮想環境にインストールするべきなのかもしれません。別の先達情報にはその様に書かれている物があります。
「PyInstallerを使ってみた」
追記
作業手順のオレメモ。
仮想環境に pyinstaller を入れての実行の方が良いようです。
作業ディレクトリに移動
> cd <作業ディレクトリ>
pipenv をインストール
> pip install pipenv
pipenv で使う python のバージョンを指定
> pipenv --python 3.9
pipenv(仮想環境)を開始
> pipenv shell
仮想環境にpyinstaller をインストール
> pipenv install -d pyinstaller
必要なライブラリをインストール
> pipenv install pyserial
> pipenv install PySimpleGUI
> pipenv install python-vlc
・・・etc
ビルドする
> pyinstaller ltcplayer.py --clean --noconcole --onefile
・・・数分で終わる。
作業ディレクトリ内の distフォルダ内 に ltcplayer.exe が出来ている。
終了なら仮想環境のshellから抜ける
> exit
仮想環境を削除
> pipenv --rm
作業ディレクトリは Python のソースコードがある階層でもいいのだけれど、
ゴチャゴチャするので私は一つ下の階層で作業をしています。
ソースコードがある階層で
> mkdir env
> cd env
> pyinstaller ..\ltcplayer.py --clean --noconcole --onefile
相対パスでソースコードを一つ上の階層として呼びます。
お好みですけど。
#Python #タイムコード
2023年8月 この範囲を時系列順で読む この範囲をファイルに出力する
自作のポップアップウィンドウを作っています。
汎用もあるのですが、ちょっと違うなぁ~って思いまして。
ウィンドウを表示するだけなら簡単ですが問題は表示位置です。通常はモニタのセンターに表示されますが、ポップアップウィンドウは親ウィンドウの中央に表示したい。
モニタのサイズ、親ウィンドウの位置やサイズは取得出来ますのでポップアップウィンドウのサイズがわかれば左上の位置は計算で出せますが、
・表示するとプログラムから表示位置の変更が出来ない。
・表示しないとウィンドウのサイズを得られない。
といった制約のためナカナカ難しい。
ならばと閃いたのが、テキトウな位置に表示してサイズを取得してすぐに消し、位置を計算して再表示するというもの。サイズ取得のための表示はタイムアウトを10msecくらいにすれば全く気になりません。
進捗表示などはメインルーチンで進捗の更新しないといけませんが、関数側で表示まで行い、ウィンドウのステータスをメインルーチンに戻して進捗表示を進めます。処理が終わればメインルーチン側で close() を実行です。ウィンドウのステータスをポインタで返しているんですね。
ついでに、親ウィンドウがモニタからハミ出した場合にはフルサイズになるようにもしてみました。
#Python
汎用もあるのですが、ちょっと違うなぁ~って思いまして。
ウィンドウを表示するだけなら簡単ですが問題は表示位置です。通常はモニタのセンターに表示されますが、ポップアップウィンドウは親ウィンドウの中央に表示したい。
モニタのサイズ、親ウィンドウの位置やサイズは取得出来ますのでポップアップウィンドウのサイズがわかれば左上の位置は計算で出せますが、
・表示するとプログラムから表示位置の変更が出来ない。
・表示しないとウィンドウのサイズを得られない。
といった制約のためナカナカ難しい。
ならばと閃いたのが、テキトウな位置に表示してサイズを取得してすぐに消し、位置を計算して再表示するというもの。サイズ取得のための表示はタイムアウトを10msecくらいにすれば全く気になりません。
進捗表示などはメインルーチンで進捗の更新しないといけませんが、関数側で表示まで行い、ウィンドウのステータスをメインルーチンに戻して進捗表示を進めます。処理が終わればメインルーチン側で close() を実行です。ウィンドウのステータスをポインタで返しているんですね。
ついでに、親ウィンドウがモニタからハミ出した場合にはフルサイズになるようにもしてみました。
#Python
2023年6月 この範囲を時系列順で読む この範囲をファイルに出力する
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 #タイムコード #電子工作