pic18spx 2010.04.22  

 pic18spxは複合機能を持っています。分散している内容をここに一つにまとめる予定です。ライタの項とPICの項の関連事項はここに移動する予定です。 計画が完了するまで重複して掲載することになります。

(指摘されているようにこの項の内容は irukaさんのサイトとsenshuさんのサイトの情報のうち私が理解できてかつ必要と思うものを書き換えただけです。オリジナルのサイトには遥かに豊かな説明がありますのでそちらを読まれる方がよく理解できると思います。備忘録として書いたものであることをご理解下さい。)

  1 概要 
  2 ファイルの所在と回路図 
  3 pic18spxの製作 
  4 基本的な使い方 
  5 単能機と万能機   専用機を使う
  6 pic18spxシリアル変換専用機   2010.08.18
  7 ファームウエアの更新   2011.08.12
  8 シリアル変換専用機に変更   2011.08.14















1 概要

 pic18spxはirukaさんが開発され、senshuさんが改良の努力をしておられるPIC18F14K50のUSB機能を活用した複合機能を持つ作品です。
詳しくは作者
irukaさんのサイトsenshuさんのサイトをご覧下さい。
多くの特長がありますが、関心の深いものを次に挙げます。

 1 AVRライタです。HIDaspxと同じ感覚で使えますが専用のUSB機能を使っていますのでより高速になっています。
   AVRだけでなく、PIC18 と PIC24の一部 にも書くことができます。
 2 特別な部品を使わず簡単に作ることができしかも安価です。\200のPIC18F14K50と12MHzの水晶とコネクタ
   でほとんど終わりです。
 3 製作が簡単です。
 4 PICライタが無くても HIDaspx があればファームを書き込むことができます。私のようにPIC開発環境を持たない
   ものには嬉しい条件です。
 5 ライタと同時にUSB-IO制御機能もあります。これだけでPCからIO制御の実験ができます。
 6 USB-シリアル変換機能を持ちます。しかもライタ機能IO機能と同時に持つことができ、回路やファームの変更
   無しにそれぞれの機能を切り換えることができます。
 7 ライタ/USB-シリアルのファームはブートローダで書き換えられますから変更が簡単です。

ここでは製作例と使用例を中心に書くことにします。解説その他は上記のサイトをご覧下さい。




2 ファイルの所在と回路図 2011.11.23 変更

関係するファイル群は
irukaさんのサイトにあります。今までアーカイブの場所を紹介してきましたがそのためにirukaさんがアーカイブの名付けに苦労されておられますので紹介をやめて、以下の実験に必要なファイルをまとめたものをファイル群としてここに置きます。irukaさんの了承はこれからですが、実験のためにはこの方が使いやすいと思いますので変更します。
初歩の実験が済みましたら、ファイルの更新もありますから、正式にirukaさんのサイトを訪れて理解を深めていただきたいと考えています。

これを解凍して得られるファイルを簡単に説明します。
  
 loader-18F14K50.hex --- pic18spxに書き込むブートローダです。これがライタやコンバータを読み込みます。
 picboot.exe --- ブートローダを動かすPC上のソフトです。
 picmon-18F14K50.hex --- AVRライタとUSB-IO機能をもつファームウエアです。
                  ブートローダで読み込まれます。
 picmon.exe --- USB-IOを制御するPC上のソフトです。
 picspx-gcc.exe--- AVRライタを使うPC上のソフトです。picspx-gcc.iniファイルを同じフォルダに置きます。
              avrdude-GUIに含まれるpicspxはこれの拡張版です。下記のPICspx(大文字です)とは別物です。
 picwrite.exe --- PIC18ライタとして使うときのPC上のソフトです。
 writer24.exe --- PIC24ライタとして使うときのPC上のソフトです。
 cdc-18F14K50.hex --- ライタファームと同居するUSB-シリアル変換のファームです。
                2c00番地からロードされます。
 PICspx.exe --- HIDaspxを使ってPIC18F14K50に書き込むPC上のソフトです。
             PICライタを持たないAVRユーザーには貴重なものです。
             しかし、多分一度だけしか使いません。

この他にライタ機能と同居しないシリアル変換ファームなどがありますが省略します。

なお 千秋ゼミのサイト で改良が進められています。


回路図
irukaさんの回路図です。 ライタコネクタ、ISP(ICSP)コネクタ、UARTコネクタは省略です。




 3 pic18spxの製作

ライタ以外にシリアル変換機能を組み込み、かつブートローダ書き込みようのISP(ICSP)コネクタを持つフルバージョンの回路図を示します。



実験をしている内にいろいろできました。
初めのうちは五里霧中で間違いも多く手探り状態でした。教えていただきながらわかるところから少しずつかじってきました。

後の使用を考えるとISP端子を付けて、ライタ/IO機能、USB-シリアル機能のすべてを持ったものが良いと思います。
72mm×48mmの万能基板には十分納まります。リセットスイッチは必要で、bootスイッチはある方が良いでしょう。
RC0のLEDはモードのインジケータとなっているので付けておきます。

水晶の負荷コンデンサ22p×2は無くても(周波数はずれるが)大勢に影響はない、との説がありますので実装していませんが無事動いています。トラブルが起これば付けることにします。
電源ONがわかるようにLEDを付けるのが好きで基板に余裕があれば実装しています。
PGM端子(7番)のプルダウン抵抗はLVP(低電圧書き込み)の時は必須です。この端子は他の用途には使えません。

このデバイス(PIC18F14K50)のD+、D-端子は3.3Vの耐圧しかないようです。この端子はプログラム書き込みに使いますので、プログラム書き込み時は大事を取ってVccを3.3Vとし、かつプログラム電圧も3.3Vとするのが安全策のようです。したがって書き込み時も電源は3.3Vが無い場合には乾電池2本の3Vとすると良いでしょう。ライタについては出力回路に100Ω程度の抵抗があれば5V電源でも心配ないようです。

ブレッドボードなどでPIC18F14K50-dipに書き込む方法があればISP(ICSP)端子はなくても良いでしょう。多分1回きりのブートローダの書き込みにしか使わないでしょう。


ファームウエアの書き込み
下準備として上に挙げたファイルの内次のものを一つのフォルダ(できればパスの通った)に入れておくと便利です。
 loader-18F14K50.hex
 picboot.exe
 picmon-18F14K50.hex
 picmon.exe
 picspx-gcc.exe *
 picspx-gcc.ini *
  (最も頻繁に使うファイルですが、名前が長すぎるので別名でコピーしておく方が便利です。
  senshu版ではpicspxとなっています)

 picwrite.exe
 cdc-18F14K50.hex
 PICspx.exe
次からの作業はこのフォルダからドラッグアンドドロップするとタイピングが楽です。

@ PIC18F14K50にブートローダloader-18F14K50.hexを書き込みます。PICライタがあればその方が便利です。
 ここではHIDaspxを使う方法を紹介します。
 PIC18F14K50に3.3V電源を加え、HIDaspxを接続します。
  >picspx.exe loader-18F14K50.hex エンター
 で数分かかりますがブートローダを書き込みます。
 ベリファイが終わってコンフィグレーションが表示されると完成です。

A ブートローダ機能を使って ライタ/IOファーム picmon-18F14K50.hex を書き込みます。
 3.3V電源をはずして、USBコネクタを接続します。ブートローダが働いてRC0のLEDが点滅するはずです。
  >picboot.exe picmon-18F14K50.hex エンター
 で短時間でファームが書き込まれます。

B 続いてブートローダでUSB-シリアル変換ファームを書き込みます。
  >picboot.exe cdc-18F14K50.hex エンター
 先ほどのファームは0x0800番地から書かれますが、このファームは0x2c00番地から書き込まれます。
 これでpic18spxは完成です。 800番地から実行されればライタ/IOとして働き、2c00番地から実行されれば
 シリアル変換器として動きます。




  4 基本的な使い方

(1) AVRライタとして使う
リセットスイッチを押すとライタモードになります。windowsのUSB機器の接/断の音に気をつけています。
コンピュータによってちがうようですが私の場合はHUBを経由するとHIDaspxより遅くなってしまいました。ハブを使わないようにしています。 マザーボードはGIGABYTEのG31M-ES2LですがこのUSBを使わずに以前のPCで使っていたUSB拡張カード(KEC 2580E)を使ってみたところHUBを経由した方がやや速くなりました。MBに何か原因がありそうです。また、古いノートPCでもHUB経由でほとんど速度は変わりませんでした。

使い方はHIDaspx+hidspxと同じです。設定ファイルpicspx-gcc.iniで -d4 の速度設定がされていますからAVRのクロックが速ければ -d1 または -d0 に設定を変えるかコマンドラインで追加すると速くなります。

  >picspx-gcc.exe エンター (オプション無し)で使い方が表示されます。
  >picspx-gcc.exe filename.hex エンター でhexファイルが書き込まれます。
-r、-rp、-rf、-f オプションもhidspxと同ッじです。
HIDaspxのHUBありの2倍強の速度で書き込みができました。

picspx-gcc.exeは開発途上のため長い名前になっていると思います。短いタイピングが好きな人は ○○.exe と変更することもできます。このときはpicspx-gcc.iniも同名の ○○.ini に変更しておきます。

hidspxでGUIツールの hidspxG.exe を常用している人はこのpicspx-gcc.exeを同じツールで使うことができます。
 hidspxG.exe → picspx-gccG.exe と名前を変えたものを作る
 hidspxG.ini → picspx-gccG.ini と名前を変えたものを作る
 hidspxG.ini の FullPathName=C:\bin\hidspx.exe → FullPathName=C:\bin\picspx-gcc.exe と名前を変えたもの
  を作る  (フォルダに注意してください。これらを C:\bin\ フォルダに置いた場合を示しています)
詳細までは試していませんが主な機能は使えるはずです。


(2) PICライタとして使う
リセットスイッチを押してライタモードにして、
  picwrite.exe エンター で使い方が表示されます。
2つ目からのPIC18F14K50の書き込みはこれを使うと快適です。
ライタコネクタとPIC18端子との接続はこのようになります。
     1 MISO  ------------------> PGD
     2 Vcc   ------------------> Vcc
     3 SCK   ------------------> PGC
     4 MOSI  ------------------> PGM
     5 RESET ------------------> MCLR
     6 GND   ------------------> GND


(3) USB-シリアルコンバータとして使う
ライタモードから
 >picmon.exe
 TARGET DEV_ID=14 VER=1.1
 PIC> boot 2c00
 PIC> q
 Bye.
でシリアルコンバータモードになります。 なお、DTR信号が出ていませんのでarduinoには使えません。
この機能を使うと プログラム書き込み→実行→UARTでデバッグ がハードの接続変更無しに1台のpic18spxでできます。
現在公開されているものはシリアル番号がありませんので異なるコネクタに接続するたびに新たなcomポート番号ができますが、senshuさんの研究が進んでいますのでシリアル番号を設定できるバージョンに改訂されるでしょう。また、DTR有効にもなると思います。
  ----------------------------------------------
  最新版はシリアル番号[0001]となっています。
  >picspx-gcc -ph?
  VID=04d8, PID=003c, [AVRetc], [PIC18spx], serial=[0001] (*)
  で 0001 であることがわかります。
  また、次の方法で変更することもできます。
  >picmon
  TARGET DEV_ID=14 VER=1.1
  PIC> dr f0 f7               f0〜f7番地を表示
  0000f0 ff ff ff ff ff ff ff  ........      最初は ff...
  PIC> er f0 4                               f0に4桁を指定
  PIC> er f1 30               最初は0に設定(アスキー型に注意)
  PIC> er f2 30               2桁目も0
  PIC> er f3 30               3桁目も0
  PIC> er f4 32               4桁目は2
  PIC> dr f0 f7
  0000f0 04 30 30 30 32 ff ff ff  .0002...  0002 に設定された
  PIC> q
  Bye.
  ----------------------------------------------
なお、arduinoに使う場合は「arduino400」で検索するとirukaさんのDTR有効バージョンがあります。ただし、上記の代わりには使えません。
上記のライタモードからシリアル変換モードに変更するときの操作をバッチファイル処理にすることができます。
バッチファイル名を serial.bat として(名前は任意です)、
内容は picmon.exe -i term.scr とします。
そして term.scrファイルには 1行目に boot 2c00 2行目に q を書きます。
ライタモードにある時に serial エンター を実行するとシリアル変換モードになります。
これらのファイルは同じフォルダに置くことに注意します。


(4) PIC18F14K50の簡易IOモニタとして使う
(工事中)


(5) boot機能を使う
bootスイッチを押した状態でリセットするとブートローダ起動モードになります。
ブートローダ以外のファームの書き換えに使います。
2c00番地からのファームを書き換えたときは、0800番地からのファームは消去されません。


(6) モードの切り換え
モードの切り換えをまとめます。
 リセットスイッチ押下 → ライタ/モニタモード → batファイルで2c00へ → シリアル変換モード → リセットスイッチ・・・
 bootスイッチ押下+リセットスイッチ → ブートローダモード → リセット



  5 単能機と万能機 

「万能機」と言えば多くの場面で使えるという機能の高さを感じますが、1つの道具に頼るのではなく複数の道具を準備できるのなら単純機能しか持たない道具の方が便利であることが多いものです。
たとえば、熱出力と鏝先が変更できる半田鏝は1本あれば多くのケースをカバーできるはずですが実際には不便なもので、たとえ万能鏝があっても普及型で良いから別機能の物があれば切り換える不便なく使うことができます。工作中に2本の鏝を加熱していて便利なことを多々経験します。

その意味で pic18spx は AVR/PICライタ と シリアル変換器 の2つの機能を持っています。ここではI/Oモニタ機能は考えていません。 ライタとシリアル変換を同時に使うことはないわけですから、1台を用意しておけば リセットスイッチ と picmon で切り換えて使うことはできるわけです。

しかし、わたしがよく使う方法==プログラムを修正して書き直し、通信で検証する方法==では切り換え操作のためにプログラムの修正が妨げられる、ということが起こります。
pic18spx は高価な材料が必要ではなく、小型で置き場所にも困らず、ハブを使えばUSB接続にも困らない上に、製作は一つで止まらず趣向を変えて作り続けることになりますから、複数の pic18spx ができてしまいます。(すでに手元に5個もあります)
そのうち1台はライタ専用として(これは変更を加える必要はない)、もう1台はライタ機能を載せずリセットでシリアル変換だけが働くようにしました。

上に書いたような使い方でもteratermを起動し直すことなく快適に作業を進めることができます。 多くの人に同時に使ってもらうなら2倍の台数を準備するのは大変ですが、アマチュアの実験では単能機が2台ある方が便利だと思っています。






  6 pic18spxシリアル変換専用機 

 常時使っているときはPCで機能変更も苦にならないのですが、よく忘れるので2台必要になっても専用機がほしいと思っていました。
irukaさんに800番地から始まるシリアル変換プログラムをお願いしたところ快くすぐに作ってくれました。ライタ機能はありませんが、つなぐだけでシリアル変換してくれますのでらくに使えます。(irukaさんに感謝)

新しく作ってみました。














組み立て直したり、あるいはICの交換ができるようにICの脚は四隅を除いて空中配線しています。

パターンを剥がしてあるのがわかるでしょうか。







最近はこのような工作物はビニルシートでくるむことにしています。ショートの心配が無く埃も防げます。
ケースよりは遥かに簡単です。カバーが掛かっていてもスイッチが押せます。
(100均のビニルケースです)



回路図です。


製作してから気付いたのですが、ライタの場合はpicmon.exeが働くのでブートローダへ制御を渡すことができるのですが、この場合は制御を変更する方法がありませんので(不勉強かもしれませんが)リセットswとブートswを付けています。resetでリセットされ、bootを押してリセットするとブートローダへ制御が移ります。

上記の pic18spxの製作に準じて、まずブートローダを書き込みます。pic18spxを使えば短時間で書けますが、HIDaspxでも時間をかければ書くことができます。このときは電源電圧を3.3Vとすることに注意します。

ブートローダが書き込めたら、USBに接続して、コマンドプロンプト画面で
  >picboot.exe cdc-18F14K50_800.hex エンター
でシリアル変換プログラムを書くことができます。ここで cdc-18F14K50_800.hex はオリジナルの名前ではなく、私が _800 を付け足したものです。
このプログラムはシリアル変換ルーチンを800番地からロードしますのでresetでこのルーチンがスタートすることになります。
なお、書き換えるときは boot+reset でブートローダに制御を渡して行います。(bootを押したままでresetする。これでローダーが働きます。)

作者のirukaさんの許可はまだいただいていませんが 
cdc-18F14K50_800.hex ファイルをしばらくの間アップしておきます。
このプログラムはシリアル番号が含まれていますのでUSBのコネクタの場所が変わっても新たなCOMポートが設定されることはありません。また、eepromの f0〜f4 にシリアル番号を設定することもできます(上記のシリアル書き込み方法を参照してください)。
ただ、picspx-gcc.exe が使えませんのでシリアル番号の確認方法がありません(私にはわかりません)。
usbtool.exeのlistコマンドでシリアル番号を見ることができます。
 >usbtool list エンター
その状況を示します。
>usbtool list
VID=0x16c0 PID=0x05df vendor="YCIT" product="HIDaspx" serial="0000"
VID=0x09da PID=0x0006 vendor="A4Tech" product="USB Optical Mouse"
VID=0x04d8 PID=0x000a vendor="Microchip Technology Inc." product="CDC RS-232 Emulation Demo" serial="0007"
usbtool.exe は hidspx-2010-0805a.zip に含まれています。この表示には libusb-win32-devel-filter-1.2.1.0.zip(513.9 KB 2010-07-29)のインストールが必要でした(インストールのほぼ最後の画面で 「Enable Filer」にチェック を入れることに注意します)。

USBに接続するだけでシリアル変換器として働きます。FT232RLやcp2102をつかった変換器と同じように使えて便利だと思います。DTR制御がありませんのでArduinoではリセットが手動になりますが、Arduino以外では問題なく使えます。
FT232RLに比べてわずかですが安いことと、DIPで工作がラクですから自作派には好都合の作品だと思います。





  7 ファームウエアの更新 

 2011.08.12現在でpic18spxの3種のファームウエアがsenshuさんによって更新されています。
ライタ使用時に電源の遷移状態によってPCに認識されない場合がありましたが、この更新によってUSBの差し替え、リセット、OSの再起動などが必要でなくなり使い勝手がよくなっています。
また、ライタ機能とシリアル変換機能の2つを持ちますが、PCがなくてもスイッチ動作で切り換えられるようになりました。
起動のモードは次の3とおりです。

 1 リセットボタンを押す:ブートローダからライタ機能に引き継がれる=ライタとして機能する。
   LEDが速く点滅する。

 2 bootボタンを押した状態でリセットする:ブートローダーが起動してプログラム読み込みモードになる。
   LEDが中間の速度で点滅する。

 3 リセットボタンを押した直後(1秒以内)にbootボタンを押す:シリアル変換モードになる。
   LEDがゆっくり点滅する(周期1秒)。

更新の方法
千秋ゼミのサイトで pic18spx-0812.zip を検索してダウンロードし、解凍します。
 1 ブートローダが更新されているのでまずこれを書き込みます。
    picwrite.exe -e  イレースします
    picwrite.exe loader-18F14K50.hex  ローダーを書き込みます
    (複数台のpic18spxを作りましたのでそれを使いました。HIDaspxでは時間がかかります。)
 2 ブートローダを起動して2つのアプリケーションhexを書き込みます。
    picboot.exe picmon-18F14K50.hex  ライタの書き込み
    picboot.exe cdc-18F14K50.hex    シリアルの書き込み
    (14k50.hexを書き込むと上記2つのファイルが同時に書き込まれるそうです)
以上で更新は終了です。




  8 シリアル変換専用機に変更

 pic18spxには2つのアプリケーションが含まれています。一つは0x0800から始まるライタ機能で、他は0x2a00から始まるシリアル変換機能です。
リセット後にboot loaderが起動してデフォルトの0x800番地へジャンプするようです。新しい(2011.08.12版)ものではリセット後のboot loader実行に時間余裕を作ってこの間にbootスイッチが押されると0x800番地でなく0x2a00番地のシリアル変換アプリへジャンプするようプログラムされましたのでスイッチでモードを切り換えられるようになっています。
このようにboot loaderからデフォルトのライタアプリへジャンプするのですが、EEPROMの0xff番地(デフォルトは0xff)に0xnnが書かれていれば0xnn00にジャンプするように設計されているそうです。
したがってEEPROMの0xff番地に0x2aを書いておけばリセット後はライタでなくシリアル変換アプリが走り、シリアル変換専用機に変わります。
  (boot loaderモードで)
 >picmon
 TARGET DEV_ID=14 VER=1.1
 PIC> dr ff ff                // ff番地を表示せよ
 0000ff ff ff ff ff ff ff ff ff  ........  // 内容はff
 PIC> er ff 2a                // ff番地に2aを書き込む
 PIC> dr ff ff                // 確認
 0000ff 2a ff ff ff ff ff ff ff  *.......  // 2aが書かれた
 PIC> q
 Bye.

 ただし、スイッチ操作だけでライタモードにすることはできません。
  元に戻すには boot loaderモードで EEPROMのff番地にffを書き込みます。
 >picmon
 TARGET DEV_ID=14 VER=1.1(Bootloader)
 PIC> dr ff ff
 0000ff 2a ff ff ff ff ff ff ff  *.......
 PIC> er ff ff
 PIC> dr ff ff
 0000ff ff ff ff ff ff ff ff ff  ........
 PIC> q
 Bye.
(この機能は 千秋ゼミのサイトの pic18spx-0812.zip によるものです。バージョンに注意が必要です。) 開発当初は シリアル変換は0x2c00でしたが現在(2011.08)は0x2a00になっています。