最近 PIC に手を出しているということですが、ついこの間 PIC32MX マイコンなるものを発見してしまいましたので手を出してみました。
例によって PICKit なんて買ってやるかコンチクショーの精神で色々頑張りました。おそらく Linux でも kextunload
の箇所を除けば同じように出来ると思います。
PIC32MX とは
昔からある、言わずと知れた由緒正しき PIC アーキテクチャ...は積んでいません。PIC32MX ではこのアーキテクチャを捨て、32bit マイコンとなったのです。それではどのアーキテクチャなのかというと、MIPS なんですねえ。丁度僕が大熱血!!アセンブラ入門で読んだんですけど、同じアーキテクチャでした。この本を読んでいない方でも、情報系や電子系の方なら知っている方が多いと思います。
この PIC32MX 以外に MIPS マイコンはあるのかな〜と思ってググりましたが出てこず。今回はこの MIPS マイコンである PIC32MX マイコンに目を向けました。
また、このマイコンは旧来の PIC の用に高電圧プログラミングは出来ませんので、高電圧発生回路を作る必要はありません。よって、書き込み回路も簡単にすることが出来ます。
開発環境
コンパイルまでの過程はおなじみ MPLAB X でできます。コンパイラは XC32 コンパイラ。
また、MIPS ということで、mips-elf-gcc
を自分でビルドして用いることも出来ます。が、僕はまだ gcc を使って開発をしたことがありません。一応 sudo make install
するところまでは終わりました。
書き込み環境がまたしても大きな壁になるのですが、こちらは以下のサイトを参考にして回路を考えました。
使用ソフトはすzさんの施した改造版の pic32prog
で、2つ目のリンクからダウンロード出来ます(バージョンは pic32prog-r62-ftdi-05)。
書き込み回路の製作
すzさんによりますと、このライタは FTDI のチップを用いることが出来るとのこと。BitBang を使用していて、FT2232 や FT232 や FT245 での使用が可能とのことです。2つ目のリンクのコメントに「FT245R でできたよ」との報告がありました。だったら FT232RL でも出来るはずです。
改造版 picprog を見ると、README-ftdi.txt
と言うファイルに FTDI チップの繋ぎ方が書いてあります。その中で動作確認が出来ているという BitBang での結線方法を見ると...
こんな記述が。自分は 74HC541 というトライステートバッファを持っていたので、この回路図通りトライステートインバータではありませんが、トランジスタと抵抗でインバータを作って対応しました。実際に書き込み成功できています。
しかしながら「このために複数回路が入っているバッファを使うのもなあ」とか、「そんな IC 持ってない」と思われる方もいると思いますので、トランジスタと抵抗で今回の場合のバッファを作ります。こちらも動作確認出来ていて、ライタ回路として採用しました。
要は DCD = High で PGED = Low、DCD = Low で PGED = RXD を実現すればいいので、こんな感じの回路になりました。この線は実際のデータが行ったり来たりするため、このような構造を必要とします。RXD はフローティングにならないように、先程の回路図の指示通りプルアップです。なお PGED にもプルアップが別途必要となります。あ、あと DCD の入力にも必要ですよね。
結局のところ、説明のファイルのバッファを上のトランジスタ+抵抗に置き換えればOKですね。これで回路が完成しました。使った FT232RL モジュールは秋月の物を使用します。抵抗値を含めた回路図は以下。黒枠が FT232RL から持ってくる配線、水色枠が PIC32MX へ伸ばすピンとなっています。
改造版 pic32prog の改造
僕が用意した PIC32MX は以下のものとなっています。
んで、こちらがなんとこのソフトに対応していないんですよ。正確には、デバイス識別のデータベースに入っていないと言うだけです。なのでデータシートを見ながら情報を追記しちゃいましょう。target.c
を開いて、以下の行を 39行目あたりの構造体配列内に追加します。
{0x26600053, "MX270F256B", 256, 3, 1}, // ADD
この状態で make
してもらえば対応できます。
実際の書き込み
まず、この書き込みソフトは BitBang を使用しますので、FTDI のドライバを kextunload -b
しておいてください。
# どちらかを打ち込む
$ sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
$ sudo kextunload -b com.apple.driver.AppleUSBFTDI
以下、pic32prog
がパスの通っている場所にあると仮定します。まず単に pic32prog
と打ち込むと結線が正しければデバイス情報が出てきます。
$ pic32prog
Programmer for Microchip PIC32 microcontrollers, Version 1.Unversioned directory
Copyright: (C) 2011-2012 Serge Vakulenko
Adapter: syncbb-icsp
Processor: MX270F256B (id 26600053)
Flash memory: 256 kbytes
Boot memory: 3 kbytes
第一引数に hex ファイルを指定すれば書き込みが行われるというわけです。完了後は自動でリセットされて、プログラムが動き出します。
$ pic32prog ~/MPLABXProjects/LEDChika32.X/dist/default/production/LEDChika32.X.production.hex
Programmer for Microchip PIC32 microcontrollers, Version 1.Unversioned directory
Copyright: (C) 2011-2012 Serge Vakulenko
Adapter: syncbb-icsp
Processor: MX270F256B
Flash memory: 256 kbytes
Boot memory: 3 kbytes
Data: 17360 bytes
Erase: done
Program flash: #################### done
Program boot: #### done
Verify flash: #################### done
Verify boot: ### done
Rate: 538 bytes per second
書き込みが成功しない方へ
思いの外見てくださっている方が多いので、追記します。書き込みが成功しない方へのトラブルシューティングです。
PGED, PGEC を間違えている
すごく初歩的ですが、慣れた方でも思い込みによる結線間違いが結構あると思います。TXD <--> RXD のようにクロスしてしまっていませんか?
ちゃんと kextunload
できていない
したつもりでも、エラーで出来ていなかったりします(名前の打ち間違い、コピペミス等)。また、FTDI 社謹製のドライバをインストールしている方は、一度 FTDI.driver.FTDIUSBSerialDriver
を無効化しても、知らないうちに com.apple.driver.AppleUSBFTDI
がしゃしゃり出てくることがありますので、合わせて確認してください。
プルアップ抵抗を忘れている
これ案外ありがちです。RXD と PGED には必須なので面倒でも付けましょう。
電源が発振している
パスコンをサボっているとなることがあります。確かに秋月のモジュールにはパスコンがありますが、念のため付けておくのがよろしいかと思われます。また、USB ケーブルが異常に長い場合は通信速度を律速してしまいますので、1m くらいの物を使いましょう。
Vcap を無視している
ピン配置図に Vcap というのがあるというのはご存知でしょうか。こちらには Vss へコンデンサを介して接続する必要があります。ここを無視するとイレースまではうまくいきますが、書き込みのフェーズに入れずエラーで終了してしまいます。0.1uF 〜 10uF を入れてあげましょう。