PIC
Up one level久々にPIC書き込み
PICは公私で使っています.PIC16F84で始めちゃったので,その後も使ってますが,次はA/D, D/Aの付いたものを使ってみようと考えてます.
使っているのはいつもなのですが,プログラムするのはごくたまのことなので,プログラムする度にPCもソフト環境も激変してます^^; 一番最初にやってた頃は,秋月のキットを買ってきて,MPLABの古いバージョン(V-5)と秋月の書き込みプログラムをWindows 98SEのマシンにインストールしてやってました(秋月の書き込みソフトはお世辞にも使いやすいソフトとはいえませんでした^^; ).
ソフトのできもさりながら,はんぱに高い電圧の電源が必要,制御用PICが必要なので,プログラマーの増設が簡単にできないという不満がありました(秋月から買うしかない).
その後,電源不要,制御用PIC不要のプログラマー,PIC Programmer 2を知り,作って,Linuxのコンソールからコマンドラインで読み書きしてました.アセンブラは相変わらず,MPLABを使ってました.たぶん,V-6あたりでしょうか.Linuxへのこだわりはともかく,MPLABがWindows環境でしか動かないので,分散した,効率の悪い開発システムでした^^;
それから,また数年が過ぎた今日,Windows 98SEのマシンなどは,ソフトが入ったまま廃棄してしまったので,あらたにMPLABの最新版8.02を現用のWindows XPのマシンにインストールしました.
PICのプログラマーは,引き続き,PIC Programmer 2です.読み書きも引き続き,Linuxのコマンドラインでもできないことはないのですが,どっちみちWindowsは使うので,プログラマーのソフトもWindows用のGUIのものを試してみたところ,サクッと動いてくれました.DL4YHFというドイツのアマチュア無線家が開発したWinPicです.Windowsがメインの人たちには有名なようですが^^; よくできたソフトです.これで当分いきます(日本語版もありますね.わたしゃ使わないけど^^; ).
結局,某所ではWindows XPに,
- MPLAB IDE 8.02
- PIC Programmer 2
- WinPic
という体制です.うちのMac miniにUSB-Serialをつないで,WinPicが読み書き可能か後で試してみます.できなければ,Linuxのコマンドラインに戻ります^^;
- Category(s)
-
Legacy Ham Radio
-
Network and Computer
- PIC
USB-ParallelとUSB-Serial
今日の昼に,秋月通商にFTDI社のチップを使ったUSB-ParallelアダプターとUSB-Serialアダプターを1個ずつ注文しました.
パラレルアダプターはzLogで試そうかと思っています.zLog用のUSBアダプターは持っていますが,符合が乱れるし,他のUSBのディバイスとの相性が悪くて,試してみることにします.だめでも900円なので^^; 他に使い回しは厳しいかも.
シリアルアダプターは,PIC Writer用です.FTDI社のFT232シリーズだと,シリアルポート用に設計されたライターがたいてい使えるということで,試してみます.シリアルアダプターは,他にも使い回せますし.
- Category(s)
-
Legacy Ham Radio
- PIC
USB-Serial + Picprog2
秋月のUSB-SerialとUSB-Paralleアダプターが届きました.

さっそく,USB-Serialを,一番の目的であるPicprog2 (別名JDM)ライターにつないでみました.このライターの最大の特徴は電源が不要であるということです.逆に,制御線からプログラム用電源を取り出すので,ProlificのPL2302のように,信号線を省略してあるUSB-Serialアダプターは,全く使用できません.

最初は,他のUSB-Serialアダプターのドライバーがいくつか先にインストールしてあるので,このFTDI社のFT232RLを使用したアダプターをつなぐと,COM8になります.
ライターソフトであるWinPicのメッセージは,COM4より上は,WindowsのAPI経由になるとのメッセージが出ます.API経由だからどうなのかは表示されないですが,まあNGなんでしょう.実際,いろいろやってもなかなかうまくいきません.
そこで,解っている他のアダプターのドライバーを削除したりしましたが,まあWindowsのことですから^^; 何の前進もありませんでした.
仕方がないので,Windowsの再インストールをしました.まあ,どうでもいいNo. 3のワークステーションですから.そして,FTDIのドライバーをインストールしたところ,なんとかCOM3になり,WinPicでも認識されました.
ただし,よく使う12F683, 16F84, 16F88の余分がなかったので,12F509で試しましたが,うまく書けるときと書けないときがあります.もう少し様子を見ないといけません.
そして,書けるときも,ものすごく遅いです.RS-232CのポートのあるPCにつなげば,一瞬で書き込めるのに,30秒くらいかかります(12F509の場合).
- Category(s)
-
Network and Computer
- PIC
HalfmatのPICプログラマー
来ました.いやー小さい.オンラインカタログの写真で見て想像していたよりはるかに小さいです.

毎回この小さいソケットにPICをさすのは辛いので,一緒に買ったヘッダーピンで,秋月のプログラマーから取ったレバー付きソケットをつなぎました.これは,購入前から考えていたことです.

ソフトは,このプログラマーの原型Writer509(シリアル接続)を設計したゆうすけさん作のW509とHalfmat社の社長Feng3さん作のminiPICProgの二種が使えます.いずれも個性のあるものですが,できたHEXを書き込む,というだけ考えれば,大差はありません.
PIC関係の開発に実績のあるお二人の作なので,とにかく少ない手数で書き込めます.どちらもプログラマーがつながっているCOMポートを自動的に探し出すので,USB接続では特に楽です.
Windowsでは,コントロールパネルを開いて,いちいちCOMいくつかを確認するのがフツーなようで^^;
ただし,どちらのプログラムも,フォントを大きく設定していると,ボタンがはみ出したり,データの数字が隠れたりして,使えません.
横長の液晶モニターを使っているので,Windowsでは,フルの解像度である1680x1050以外だと,縦横比が正確でなくなり,GoogleEarthで地球がゆがみます.ですから,1680x1050にしてフォントを大きくしています.
Mac (Mac mini)だと1344x820なんてモードがあって,地球は丸いです.
このWriter509にはつかえない,WinPICは,フォントの大きさにかかわらず,使えますので,W509やminiPICProgも改善して欲しいと思います.
なお,手持ちの12F509, 12F683, 16F88は問題なく書き込めましたが,16F84はダメでした.Halfmatに質問したところ,16F84のように古いPICでは,Device IDがないので,Device IDを無視するように設定する必要がある,とのことでした.
- Category(s)
-
Network and Computer
- PIC
Cでエレキープロジェクト
最近,またPICをいじりはじめています.特に新しい制御をするというさしあたっての課題はありません.無理に考え出せば,
- FT-1000MPからだけ行っているアンテナの自動切り替えをIC-740, TS-2000SXからもできるようにする
- ローテーターの方向のデジタル的読み出し,制御
あたりがありますが,特に必要性があるわけでもなく,あまりやる気が出ません.
念頭にあるプロジェクトは,過去のプログラムの焼き直しです.
- Category(s)
-
Legacy Ham Radio
- PIC
PICのC化
もう,7〜8年前になりますが,PICで,エレキー,アンテナ切り替え器,FT-1000MPへPC音声送り込み機(ボイスメモリーDVS-2の代用)を作りました.
16F84で作ったのと,全部アセンブリ言語で作ったのとで,自分で修正するのもなかなかたいへんですし,機能拡張したり,他のPICへの移植はかなり困難です.
そこで,後々のことも考えて,プログラムをCに移植するプロジェクトに着手しました^^;
少しやってみると,条件分岐やループが非常に楽です.アセンブリ言語だと,
ステータスの変わるオペレーション BTFSS STATUS,Z GOTO どこか
なんてあったとき,Zeroフラグがセットされているときスキップだから,ゼロでないときにどこかに飛ぶんだな,といちいち考えないとなりません.BTFSCだとゼロフラグがセットされてないときスキップだから,ゼロでなくないときどかに飛ぶし,STATUS,2と書いてあったら,マニュアルを見なければ何のフラグか解りません^^; マニュアルを見ている間にゼロでないときか,ゼロでなくないときか忘れます^^;;
Cだと,
if (変数など) goto どこか;
でいいんですから.とはいえ,アセンブリ言語で書いたプログラムをCに変換するときは,さんざん悩みます.動かないときは,とりあえず!を付けてみたりして^^;;
いちおう,上記の三種については,今日までに完了しました.
ソースについても,順次公開していきます.エレキーは,まだ少々動作が怪しいので,もうしばらく自分で打ってみて,動作確認したいと思います.アンテナ切り替え器も検証中です.
あと,FOXハンティング用のFOXもありました.このプログラムのC化はまだ着手していませんが,そのうちやろうと思います.
詳細記事
- Category(s)
-
Legacy Ham Radio
- PIC
PICのC化 その2
今は,ステップモーターの制御プログラムのC化を手がけていますが,なかなか難しいです.パルスをジッタがないように発生させるために,タイマー割り込みを使っています.
まず,序の口ですが,
label1
処理
decfsz ii,1
goto label1
でしたら,
label1:
処理
if ( --ii ) goto label1;
でいいのですが,
label1
処理
decfsz ii,0
goto label1
だと,
label1:
処理
if ( ii-1 ) goto label1;
としないといけません.0と1の違いで^^; 解ってはいますが,ちょっと見ただけじゃなかなか間違いを見つけられません.
これだけならそんなに難易度は高くありませんが(といいつつ,気がつくまでかなり時間がかかりました),こういうのが複合して攻めてきますので,なかなか正解にたどり着けません.
本日の極めつけは,SDCCのbugというか仕様です.
while( 1 ) {
ii=1;
jj=2;
if ( RB1 ) break;
}
です.毎回,iiとjjに新鮮な1と2を送り込みながら,RB1がHになるのを待つルーチンです.これしきのことがなかなか動いてくれなくて,生成されたアセンブリ言語を見たら,なんと,ii, jjへの代入は,1度だけで,RB1の読み込みのみでループしています.
確かに,これだけ見れば,毎回いちいちii, jjに定数を代入する必要はないですが,割り込みルーチンが,ii, jjを書き換えるので,常に新鮮な1, 2にする必要があるのです^^;
部分的に最適化を止める方法があるのかどうか解りませんので,
while ( 1 ) {
_asm
movlw 1
movwf _ii
movlw 2
movwf _jj
_endasm;
if ( RB1 ) break;
}
として解決しました^^;
生成されたプログラムのサイズは,2.5倍で,16F84(A)の0x3FFまででは,残りわずかです.
ただし,オリジナルのアセンブリ言語ではEEPROM領域に入れていた,パルス発生タイミングのテーブルがプログラム領域に展開されているので,この2.5倍がまるまるコンパイラーのできの悪さではないです.いや〜,それも含めてコンパイラのできを考えるべきかも^^;
機能を拡張するためには,16F84Aより安い^^; 16F88に移植する必要があります.
- Category(s)
- PIC
PICのC化 その3
PIC16F84で,もともとアセンブリ言語で書いてあったプログラムのSDCCへの移植は,公私の案件ともほぼ完了しました^^;
そのうちの,特に重要なものについては,今後のことも考えて,16F88に移植することにしました.
16F84(A)から,16F88への移植については,あちらこちらに書いてありますが,SDCCを使っての移植についてはあまり見つからないですね.
実際やってみると,高速で割り込みがかかるようなプログラムでなければ,拡張されたconfigの設定と,ANSELの初期化くらいで動きます.
しかし,微妙なタイミングで動くプログラムの場合は,上記の設定をしてSDCCでコンパイルし直しても動いてくれませんでした.
遭遇した問題は,今のところ2点で,SDCCではデフォルトの演算が16bitで行われてしまう,ユーザーのデータ領域にもバンク切り替えがあるという点です..
インラインでアセンブリ言語を書く場合,
_asm
MOVLW 32
MOVWF _ii
_endasm
は,
_asm
MOVLW 32
BANKSEL _ii
MOVWF _ii
_endasm
としておく必要があるようです.インラインでアセンブリ言語を書くこと自体,普通は必要ありません^^;
16bit演算については,これも時間に余裕がない処理では気をつけた方がいいです.
unsigned char jj;
...
if ( jj-1 ) goto どこそか;
は,16F84では,8bitの比較として,jjから1引いて,ゼロかどうか判断するという,期待どおりのアセンブリ言語生成でした.
ところが,16F88では, ( jj-1 )を16bitとして見なすようで,生成されたアセンブリ言語の長さはもとの2倍以上になります.まあ,確かにそれが正しいCコンパイラーの所作なのかもしれません.これを避けるために,
if ( jj!=1 ) goto どこそか;
と書き直しました.これは,jjが8bitの変数ですから,8bitでの比較をするのが正しいですし,アセンブリ言語の生成もその通りになっています(ただし,BANKSELの分,16F84(A)用よりは長くなります).
結局は,生成されたアセンブリ言語を眺めてトラブルシューティングということになります^^;
- Category(s)
- PIC
いつも、お世話になってます。
SGHさん、私もPICに興味あります。でも、全くやった事ありません。
記事を見ていて、いーなーと思っちゃいました。
何かお勧めありましたら、ご教示頂けると嬉しいです。
よろしくお願いします。
JJ1NNH局,こんばんは.
シリアルポートがしっかりしていると,2番目の写真の手前に写っているライター(JDMライター)は非常に軽快です.しかし,今時はデスクトップPCにもシリアルポートがついてませんね.USB用としては,Halfmatという,個人経営の会社のライターがいいようです.
実は今日注文しました.来たらまたご報告します.
JE1SGHさん、おはようございます。
PICライターは、秋月の物しか知りませんでした。
Halfmatの方が安いですね。ライターは書き込めればいいので、
どこのを使ってもいいのですね。(^^; (と、このあたりも全然分かっていません)
レポート頂きましたら、私も購入します。
その時は、よろしくお願いします。
ライターは,機能としては完成したプログラムのコードを正確に書き込めばいい,だけのものですが,案外使い勝手が重要です.それは,開発サイクルの中で,必ず行う行程だからです.プログラムのほんの一部を変更してもライターを使います.何度も何度も使います.
古いバージョンではありますが,AZ通販の製品で気になったのは,(1) 毎回コードのディレクトリーを探しに行かなければならない(ファイルオープンの時,いつもデフォルトディレクトリーに戻る.Windowsの仕様でしょうか^^; ) (2) (これは今でもそうですが)別電源が必要の2点です.何回も繰り返し作業していると,耐えられなくなります.
この2点がない,つまり,前に開いたファイルのあるディレクトリーにいってくれるプログラム(これ,Macなんかでは標準なんですけど^^; ),電源不要のライターは存在するわけですから.
なるほど。
実際に使っている方ならではのアドバイスですね。
ありがとうございます。
Halfmatは、この2点を満足してましたでしょうか。
USBというのも、とてもいいですね。