ArduinoでPICマイコンに書込む

MakerFaireOpenStickを展示していると、「Arduinoでできないの?」と聞かれる事がある。
しかしArduinoでは(Leonardo等の一部を除き)USBとは仮想シリアルで接続しており、HIDデバイスを実現しにくいのだ。 しかもPIC18F2550で製作するのと比べて値段も高い。

PICでなくてArduinoを使いたい理由のひとつとしてはPICライタが必要という点であろう。
OpenStickの場合、あらかじめPIC18F2550のFlashメモリにブートローダを書込んでおくのだが、その為にPICライタが必要になる。しかし一般的なライターであるPICKit3秋月電子でも¥4500する。
こんな自作ライターを使っていた時もありましたが最近のPCはプリンタポートが無いし・・)

昨今、PICライタよりもArduino基板の方がよっぽど浸透しているだろう。
OpenStickをArduinoに移植するのは難しいが至る所に存在するArduinoを使ってPIC18F2550にブートローダを書込む事ならできそうな気がする。という事で実験を行った。

PIC18F2XXXにプログラムを書込む方法はマイクロチップテクノロジー社のこの資料に書いてあった。 このマイコンでは書き込みモードに設定する為に12Vを印加するHigh Voltage ICSPモード(以下12Vモードと呼ぶ事にする)と、5V電源のみで済むLow Voltage ICSPモード(以下5Vモード)がある。 但し5Vモードを使うには制約があり、コンフィグ設定のLVPビットに’1’が書かれていなければならない。新品購入時、LVPビットはデフォルトで’1’なのだが、ブートローダを書込むと’0’になってしまう。 5Vモードだけだと一度書き込んだら書き換えができないという事になるので、今回は外部電源を使って12Vモードで書込む事にした。

<今回の回路図>

PIC write schematic

今回の実験に使用した回路図

MCLR端子に外部から12Vを与えている。デバイスの規格でここの電源はVDD+4V~12.5Vの範囲となっており、12V電源のままで入力可能な筈だが上限値に近いので、念のためダイオードで少し電圧を落とした。 ArduinoはUNOを用い、+5V,GNDのほかは8ピンをPGC、9ピンをPGDに接続した。PGDは双方向なので念の為3.3KΩを挿入したが、デバッグ完了後はダイオードも抵抗も直結で問題なく動作した。

PIC Writer with Arduino

ArduinoでPICライター

PC側はTeraTermでArduinoに接続し、キーボードからコマンドを入力して操作する。
プログラムの書込みおよびベリファイは’w’コマンドに続いてIntelHEXのデータをテキストとして送る。 Arduino UNOのRAMは2KBしかないので全部を蓄えてから書込む事はできず、IntelHEXデータを1行ずつ読んでは書込みを繰り返すのだが、ArduinoとPC間のシリアル通信ではフロー制御を行っていないため、一気にデータを送ると書込みが間に合わず取りこぼしが発生してしまう(この場合パリティエラーとなる)。 この対策としてTeraTermの「貼り付けの行間遅延」設定を増やしておく必要があった(こちらの環境では行間遅延が20mSだと取りこぼしが発生し、50mSだとOKだった)。 なお、この関係でTeraTermからIntelHEXデータを送る際はコピペで送る必要があり、これを「ファイル」→「ファイル転送」メニューで送ると行間遅延が加わらないらしく取りこぼしが発生した。

結果として下記の方法で書き込み/読み出しができ、更にOpenStickを使ってジョイスティックコントローラとして動作させる事ができた。

<PIC18F2550にブートローダを書込む手順>

  1. まず12V電源はOFFにしておく。
  2. Arduino IDEを立ち上げこのスケッチを書込む。
  3. TeraTermをシリアルモードにしてArduinoに接続する。
    シリアル設定:9600bps,8bit,パリティ無し,stop=1,フロー制御=none
    改行コードは送信・受信共にCRにする。
    また、「設定」→「その他設定」メニューの「コピーと貼り付け」タグを選び、「貼り付けの行間遅延」を50mS程度にしておく。
  4. 接続するとTeraTerm上に以下のメニューが表示される。
    r  <start address> <count>: read from PIC
    e : all erase
    w : write to PIC
    v : verify
  5. ここで12V電源をONにする。
  6. 必要に応じ’r’コマンドで現在書かれている内容を確認する。たとえば・・・
    r 0 0x100<CR>
    と入力すると、FLASHメモリの0番地から0FF番地の内容を表示する。
    消去済ならCODEエリア全ての内容がFFになっているはずである。
    (消去チェック機能はないので、どちらにしても次の消去コマンドを実行しておくべき)
  7. 消去済みでない場合はeコマンドで消去する。
    ALL Erase <y/n>?と効いてくるのでyを入力する。
    このコマンドはチップ全体を消去する。
  8. ‘w’コマンドで書込む。w <cr>を入力すると’Send me intelhex text’と表示されるので、ここでIntelHEXファイルを送る。この際、上に書いた理由でコピペで貼り付ける方法で送る。 たとえばブートローダのHEXファイルである’20M-18f2550.hex’をメモ帳等で開いて全域をコピーした後、Teratermの画面上に貼り付ける。
    (上に書いた様に「ファイル」→「ファイル転送」メニューからの送信だと取りこぼしが発生する)
  9. エラーなく書き込みが完了したら’v’コマンドでベリファイを行う。方法は’w’コマンドと同じで、v<cr>入力後IntelHEXテキストを貼付けるとFlashメモリを読出して比較する。  エラーが出なければ正常に書き込めた筈である。
  10. 12V電源をOFFにした後、TeraTermの接続を切りArduinoのUSBケーブルを抜く。

Arduinoのスケッチ
ブートローダ(千秋ゼミさんへのリンク)

※言うまでもないと思いますが、試される方は自己責任でお願いします。
(特に12Vを印加する端子を間違ったりすると・・・ああ)
※コマンド入力のエラーチェックはあまり詳しく行っていません。

 

http://www.hoihoido.com/rudder/index.html

ArduinoでPICマイコンに書込む” への3件のコメント

  1. ピンバック: ArduinoでPICマイコンに書込む~その2~ | ほいほい堂blog

  2. ピンバック: ArduinoでPICマイコンに書込む~その3~ | ほいほい堂blog

  3. ピンバック: ArduinoでPICマイコンに書込む~OpenStickLite(PIC18F14K50)編~ | ほいほい堂blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*