これまでPICkit4を使ってフラッシュメモリタイプのPIC16F819にプログラムを書き込んできました。
ただ、最終的にはこれらのプログラムをEPROMメモリタイプのPIC16C712に書き込んで利用しようと思っていました。
というのも、秋月電子のお楽しみ袋にはこのPIC16C712が10個あったので、これらをArduinoやAVRの下僕(周辺デバイス的な感じ)として使ってしまいたかったからです。型番にCがつくPICは一度書き込んだら二度と書き込めないワンタイム書き込みタイプなので、開発には向いていないんです。
PIC16F819はピン数が18Pでピンの配置がPIC16C712とほぼ同等なので、作成したプログラムを少し手直しするだけでPIC16C712と置き換えることが出来ます。ただ、PIC16C712はプログラムのメモリ容量が1K(ワード)でPIC16F819の半分しか無く、あまり大きなプログラムは入りません。
でも、前回作成した7セグメントのプログラムは小さいのでPIC16C712に十分書き込めます。
そこでプログラムを移植しようと思いMPLABでプロジェクトファイルを作ろうとしたのですが、書き込み装置としてPICkit4を選ぶことが出来ませんでした。
どういうことかと思って調べてみると、PICkit4はワンタイムタイプの書き込みには対応していなかったのです。てっきり出来るものと思いこんでいたので、非常にがっかりです。
別途EPROM書き込み対応のライターを買うのは馬鹿らしいので、ワンタイム書き込みPICは諦めてしまおうかとも考えましたが、10個もあるのでやっぱりもったいない。どうにかならないものか調べてみました。
でも、結局ライターを自作するしかないようです。ネットで見つけたPIC16C712対応ライターは、殆どがRS232Cの端子に接続して使うような古いタイプで、製作も面倒そうだったのでこれらを自作したいとは思えませんでした。
しかたないので自分でライターを作ることにしました。以前にMICROCHIPのデータシート(In-Circuit Serial Programming Guide DS30277D)でちょっと調べてみたことがあり、AVRとかを使えは簡単な回路で書き込みできるのはなんとなく分かっていました。
ただ、通信プロトコルやコマンド実行手順で不明なところがあったので、データシートや先人達が作ったライタープログラムなどをじっくりながめている内に、なんとか書き込み手順の詳細が分かってきました。
まずは回路の作成です。書き込みデバイスにはATmega328を使うことにしました。前にヒューズリセッターで使った実績もありますし、個人的に使い勝手がいいからです。ATmega328がなければ他のAVRやArduinoを使ってもいいでしょう。
以下が回路図です。
抵抗しか使わない簡単なものなので、すぐにブレッドボードで組み立てられます。ATmega328の6ピン7ピンを使っているのは、分かりやすいようにPICのRB6とRB7の番号に合わせただけで、とくに深い理由はありません。
この回路でネックになるとしたら5Vと12Vを出力できる電源を用意しなければならないのと、TTLレベルのシリアル接続デバイスが必要な点ですね。
たまたま、前述のヒューズリセッターのときに用意したものが使えるのでこのような回路にしましたが、Arduino LeonardoやPro Microを使えばUSBシリアルがありますし、raw端子に12V電源を入れてVcc端子をPICの5V電源にすればいいので簡単かもしれません。ただし実際に確認したわけではないので、もし試してみるのなら自己責任でお願いします。
ちなみにシリアル接続は操作のタイミングと結果の表示に使うだけなので、かならず必要なものではありません。工夫すればLEDの点灯で代用することも可能でしょう。
12VはPICをプログラム書き込みのモードにするために使います。本来はトランジスタでスイッチングするのでしょうが、10個程度のPICにそこまでしなくてもいいかと思い手動でスイッチングすることにしました。実際はスイッチではなくブレッドボードに電源ピンをさすだけです。
次は書き込み手順です。
まずはPIC16F819で開発したプログラムをPIC16C712向けに手直します。MPLAB IDEでターゲットデバイスをPIC16C712にしてプロジェクトを作ります。書き込みデバイスの選択では何も指定しません。
次にPIC16F819のプログラムをコピペして、コンフィギュレーションビットやレジスタ名などを手直しします。それ以外の部分は、ほぼそのままで大丈夫です。以下は前回PIC16F819で作成した7セグメントのプログラムをPIC16C712向けに直したもので、コンフィギュレーションビットとタイマー0のレジスタの表記を変更しています。
newmain.c
この手直ししたプログラムをコンパイルして"プロジェクト名.X.production.hex"ファイルを作成します。hexファイルはプロジェクトのフォルダーの中のdist/default/productionにあります。
このhexファイルを以下のプログラムでc言語のソースに変換します。
hextoc.c
Makefile
このプログラムはUbuntu上で動作させるものですが、Windows等へ移植するのは難しくないと思います。
使い方は、
hextoc ファイル名
とすれば.hexファイル名の末尾に.txtがつけられたテキストファイルが作成されます。テキストの内容はPICプログラムのメモリメージをc言語に変換したものです。
サンプル
このhextoc.cプログラムの //#define DEBUG のコメントを外してコンパイルするとPICのメモリアドレス付きのバイナリダンプをテキストファイルに出力するようになります。このテキストをMPLAB IDEでコンパイルした後にWindow -> Target Memory Views->Program Memoryを選択して項目Form...をHexにしたときに表示されるPICのメモリイメージと比較すれば、出力されたテキストファイルの内容が正しいかどうか確認できます。
サンプル
hextocで出力されたc言語ソースを、PIC書き込みに使うATmega328(など)のスケッチの先頭にコピペします。
ATmega328PICWriter.ino
このスケッチには参考の為にhextocで変換したメモリイメージのソースがペーストされていますので、ここにhextocで作成したメモリイメージのソースを上書きして下さい。
このスケッチをコンパイルして上記回路図のATmega328に書き込んだら、PCのシリアルターミナルなどにつないで5V電源だけを接続します。するとシリアルターミナルに"Connect 12V to MCLR."と表示されますので、ここで12V電源を接続します。この後リターンキーを押すと、PIC16C712への書き込みが開始されます。
最初に書き込みが開始されるとエラーが大量に表示されますが、あわてずコンフィギュレーションワードが書き込まれるまで待ちます。
ここで、一度電源を切ります。
再度5V電源をつなげ、シリアルターミナルにメッセージが表示されたら12Vを接続してリターンキーを押しプログラム書き込みを行います。すると初回よりエラーメッセージが少なくなるはずです。これを2、3回(場合によってはもう数回)繰り返してエラーメッセージがなくなるのを確認します。エラーメッセージが出なくなっても、念の為もう一度書き込んでみてもいいかもしれません。
以上で書き込み終了です。これでちゃんと書き込まれているのか不安ですが、7セグプログラムをPIC16C712に書き込み、PIC16F819と差し替えて確認したところ正常に動作しました。
ATmega328のスケッチ ATmega328PICWriter.ino 内の //#define READ_MEMORY のコメントをはずしてコンパイルすると、PICのメモリ内容をシリアルターミナルに表示するようになります。これで正しく書き込まれているのか確認することができます。
データシートには書き込みエラーが起きても25回まで書き込むように書いてあるので、スケッチも25回まで書き込んでいるのですが、これでも不完全なようです。もしかすると使用する電源により書き込みの成功率は変わるのかもしれませんが、今までEPROMを扱ったことがないのでよく分かりません。
ところでデータシートによるとPIC16C712と同様の手順でこれらのPICへの書き込みが行えるようです。
PIC16C61 | PIC16C72A | PIC16CE623 |
PIC16C62 | PIC16C73 | PIC16CE624 |
PIC16C62A | PIC16C73A | PIC16CE625 |
PIC16C62B | PIC16C73B | PIC16C710 |
PIC16C63 | PIC16C74 | PIC16C711 |
PIC16C63A | PIC16C74A | PIC16C712 |
PIC16C64 | PIC16C74B | PIC16C716 |
PIC16C64A | PIC16C76 | PIC16C745 |
PIC16C65 | PIC16C77 | PIC16C765 |
PIC16C65A | PIC16C620 | PIC16C773 |
PIC16C65B | PIC16C620A | PIC16C774 |
PIC16C66 | PIC16C621 | PIC16C923 |
PIC16C67 | PIC16C621A | PIC16C924 |
PIC16C71 | PIC16C622 | PIC16C925 |
PIC16C72 | PIC16C622A | PIC16C926 |
実際に書き込めるかどうかは未確認ですので、試してみる場合は自己責任でお願いします。
※コメント投稿者のブログIDはブログ作成者のみに通知されます