🗐 電装工芸日記 - 舞台照明機器の製作とか -

今年は開発案件を進めたい

or 管理画面へ

タグ「PIC」を含む投稿[30件]

Icon of admin
 PIC16F18326 についてはヘッダーファイルを書いています。
 書きながら勉強になっているのでいいのですが、パラメータが増えているのでなかなか終わらない。
 Pickit(書き込み機)も新調しました。最新のMPLABXではPickit3が対象外になっているためです。

#PIC
Icon of admin
 PIC16F18326 の勉強をしています。
 データシートを機械翻訳し、見開きで原文(英文)と翻訳(日本語)を読めるように印刷しました。496ページもあるので1,000ページ近い印刷になりましたが、英文は苦手だし機械翻訳は奇妙なところがあったりなので両方見比べられるとわかりやすい。
 拡張ミッドレンジ(16F1823など)と概ね同じですが、機能が増えたためかレジスタやフラグビットに違いがあります。この辺りの違いが細かくて微妙なので把握するのが大変だったりして・・・。俺様ヘッダーファイルを作ることでその違いを把握しています。
 まずはI/Oポートからです。驚いたのは、すべてのポートをオープンドレイン出力に出来ることと入力特性をST(シュミットトリガー)か一般的なTTLか選べることです。これは助かる。
 オープンドレインには様々な使い方があり、5v駆動から3.3v駆動へ信号を送ることが代表株かもしれませんが、自分は複数のPICの間でセマフォの様なフラグを持たせる場合に使うことが多いです。プルアップしておいてL出力で権利を宣言するのです。
 シュミットトリガーは入力の閾値判断をあえてヒステリンス特性にしていますので入力検知の正確さを期待できます。キー入力のチャタリング対策や外部入力の信号のパルスエッジに傾斜がある場合などに信頼性向上の効果があります。誤認識を減らせるってことです。
 機能が増えて複雑になってますがいい感じです。

#PIC
Icon of admin
 PIC16F18326 のデータシートを翻訳しました。
 もちろん自力ではありません。以前も利用した「Doc Translator」にお世話になりました。
 一気に496ページは翻訳出来ませんので100ページくらいに分けて実施。PDFのページ体裁の編集はフリーウェアの「CubePDF Page」と「CubePDF Utility」を使うと便利です。
 完璧な翻訳では無さそうですが意図を読み取るには十分な翻訳をしてくれます。
 もちろん翻訳を確認した後に寄付をしました。フリーウェアでも恩恵を受けたら寄付をしましょう。

#PIC
Icon of admin
 現場の日程も緩んできたので開発を始めています。
 今はDMX切替器のファームウェアの更新とそれに実装するDMX-HOLDです。
 他社の先輩に頼まれて作ったモノですが、当時の技術力ではHOLDを作れずに無い々々で納品したのを忘れていました。
 流石にこれではいけませんし、2kBの目盛りを持ったPICが入手できるようになったので作ろうと思ったワケです。
 14ピンのPIC16F18326を使う予定です。データシートを見たら初期の拡張ミッドレンジの頃とは細かい違いがあります。ヘッダーファイルも含めて再検討が必要でしょう。
 驚いたのはシリアル通信の出力ポートが見当たらないこと。なんのことやとデータシートを読んだところPPSという機能が入っていました。以前にもI/Oポートのピンを変更する機能が搭載されていましたがこれが拡充されたようです。シリアル通信の出力ポートはこれで定義できます。あとは、プログラムマブルロジックが搭載されています。ピンが余っている場合にこれは便利かもしれません。
 ともかく、新しい世代のPIC16を勉強しましょう。データシートが英文で450ページもあるので読むだけで一苦労ですけど。

#PIC
Icon of admin
 MPLABXv5.5 にて PIC の書き込みが出来ました。
 以前はその場しのぎの成り行きでやっていたので、今回は設定と手順をまとめた次第です。
 MPLABX の操作・設定、コンフィゲーションビットの設定、XC8 の書式がわかれば MPLABv8 と大差ありません。この辺りがモヤモヤしていると言えばそれまでなんですけどね。
 ただ、Pickit3 は動くのですが Pickit4 はダメ。PIC を見つけてくれないし、Pickit4 とは別に不明なシュミレータ/プログラマも表示される。壊れているのか設定が間違っているのか、新品を買って比べるのがいいのでしょうが、Pickit3 で当面はしのげるので様子見です。

#PIC
Icon of admin
 MPLABv8とMPLABXを共存させる場合、「MPLAB driver switcher」を用いてUSB接続されるデバイスのドライバを切り替えなければならないらしい。
 ただし、MPLABXの後にMPLABv8をインストールするとスッキリしない。バージョン順にインストールするのがいいらしい。
 バージョンによる境界だが、MPASM が付属し使えるのは MPLABXv5.35 まで、Pickit3 が使えるのは MPLABX6.2 までらしい。

#PIC
Icon of admin
 今更ですが、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
Icon of admin
 Open DMX USB の BreakTime について考えていたところ PIC の BreakTime についてもアイデアが出ました。
 拡張ミッドレンジPIC16系の EUSART には Break 機能があります。ただし、11bit分の L を出力して StopBit(H) を出すまでが一連の動作なので2回繰り返しても DMX512 の BreakTime にはなりません。今は I/O ピンをプルダウンしておき、入出力設定(TRIS)を Input(Hi-Z) にしてから捨て送信をすることで BreakTime を作っています。
 本題です。DMX512 の BreakTime は 最小 88usec ですから 250kbps なら 22bit 分の連続した L を出力すれば成立します。PIC16系の EUSART の Break が DMX512 の BreakTime に使えないのはこれが理由ですが、BaudRate を変更した Break を出力したらよくね?ってのが今回のアイデアです。手段を問わず、L 送信が 88usec 以上ならいいのです。私の理解が間違っていなけば、アイドル時なら BaudRate をバイト送信毎に変更しても EUSART は正しく動くハズです。単純計算なら BaudRate を半分にすれば規格値が出ます。現状でも BaudRate の調整だけで 1/50 くらいには出来ますから十分な BreakTime を作れると思われます。もちろん、BaudRate を 1/3 以下にして Break ではなく 0x00 を通常出力しても同じことです。こちらの方が汎用性が高いかも。受信も併用する構成ではNGですけどね。
 この方法が成立すればプルダウン抵抗は不要です。たった一つの抵抗ですが、部品を減らすことは絶対の正義ですので検討する価値はありそうです。

#PIC #器具の製作
Icon of admin
 まだまだ途中ではあるものの使えるっちゃ使える LTC_Player で本業の音源チェックをしています。
 思いっきり自画自賛ですが、コレ、便利です。
 作った本人だからってのが81%くらいありそうですけど、こうやって実務で使うと完成イメージが具体的になります。
 今は設定変更のロックを機能別にしていますが、Play_Mode という括りで良さそうです。本番モード、リハモード、机上作業モード、プレイリスト編集モードって感じです。各種設定のロックの組み合わせがモードの違いとなりますが、機能単位でロックを掛けられるようにしていますので変更するのは簡単です。

 私のプログラムの書き方を整理しますと「状態を把握」「処理の振り分け」「パラメータとフラグの設定」「パラメータとフラグを見て最終処理」ってのを1フェーズ単位にして管理しています。バグが多く発生する書き方は処理を振り分ける際に一部の最終処理までしてしまう書き方だったので、幾重にも重なったふるいにかけて粉を落とすイメージでフラグを立て、最後に落ちて来たフラグを見て最終処理をするのです。その都度結果を求めると整合性を取るのが大変になり、それこぞバグの原因になるのでした・・・私の場合ですけどね。完全独学ですから王道の書き方なんて知りませんが、一本筋の処理フェーズしかないPICのアセンブラで染みついた構築の仕方です。ガチガチで汎用性が狭い感じがしますが、発展させると疑似的なマルチスレッドも構成出来ます。PICではタイマー1個でポーリングによる複数の時間分岐を得る書き方をレギュラー化していますが、これって精度は低いけどRTOSっぽくね?とか思いながら使っています。タイムスレッドと勝手に呼称している書式ですが、余程のレスポンスを求めないなら割込みを使わずタイムスレッドとモジュールの割込みフラグによるポーリング処理で複数の処理をPICの中で実現出来ています。特別なレスポンスを求める要素にだけ割込みを使い、高級言語で言うところの sleep を絶対に使わない方針です。
 ソフトウェアは時間の管理が一番大事だと思う今日この頃。適切に時間が管理されていればインプットもアプトプットも整合性を持って管理出来ます。

#Python #PIC
Icon of admin
 LTC Generator は24fpsも他のfpsと同様の誤差に収まりました。現在稼働中の30fpsも確認出来れば LTC Generator はヒト段落です。
 本業もそこそこ忙しくなってきたので工作に使える時間は限られますが、LTC Player まで出来るだけ早く到達したいところです。

#PIC #タイムコード

■思ってみた

春ですねぇ~。
花粉症の部下は死にそうですが、暖かいってのはいいことです。

編集

■全文検索:

複合検索窓に切り替える

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2025年3月
1
2345678
9101112131415
16171819202122
23242526272829
3031

■カテゴリ:

■最近の投稿:

最終更新日時:
2025年4月29日(火) 20時16分48秒