私、FENG3は、電子工作に手を染めてから早2年余りの時が経過しましたが、PICライタの製作やサポートに時間がとられてきたこともあって、いまだにPICを使いこなせない、「LEDぴかぴか」程度の初心者です。そこで、2005年はこうした現状を打開することをめざして、PICのプログラミングの勉強をはじめることにしました。PICのプログラミングの勉強は、PIC12F509からはじめることにしました。
LEDを点灯させてみよう
(もっとも簡単なプログラム)
PIC12F509、PIC16F505は、マイクロチップ社の低価格で高機能なフラッシュメモリ・タイプの8ビットマイコンです。PIC12F509は最大4MHzで動作可能です。PIC12F509は1024ワードのプログラムメモリと41バイトのデータメモリをもっています。PIC12F509は8ピンPICで、I/Oピンが6つ(うち1つは入力のみ)となっています。
PICの命令セットは、12ビット・コアで33、14ビット・コアで35、16ビット・コアで58、エンハンスド16ビット・コアで77の命令があります。プログラムが分岐するなどのプログラム・カウンタを変更する場合をのぞいて、すべての命令は1サイクルで実行されます。PIC12F509は12ビット・コアのベースライン・シリーズに位置付けられています。
![]() |
ブレッドボードで簡単なLED点灯実験用の回路を組んでみました。電源は、9Vの006Pを使用します。U字型に折り曲げてあるジャンパ線は、抜き差しして使う簡易スイッチです。 |
写真の左からPIC12F508、PIC12F509、PIC16F505、PIC16F54、
PIC16F57です。小さなパッケージは、PIC12F509のSN(SOICです。
開発ツール
PIC12F508、PIC12F509、PIC16F505のプログラムを作成し、これらのデバイスにプログラムを書き込むには、マイクロチップ社が提供している統合開発環境である MPLAB IDE と、マイクロチップ社の PICSTART-Plus、MPLAB-PM3、 MPLAB-ICD2、 PICkit1、 BFMPなどを使用するのがもっとも確実です(PIC12F508、PIC12F509をMPLAB IDE のバージョン6.61以前で使用する場合は、エラータを参照してください)。ここでは、もっと手軽に安価な方法でこれらのデバイスにプログラムを書き込めないものか、その方法を紹介することにします。
プログラムを書き込む準備
まず用意するのは、Jens Dyekjær Madsen 氏の開発した、JDMプログラマ(PIC-Programmer 2 for PIC16C84 etc.)です。パソコンのシリアルポートから電源をとりますので、外部電源は不要です(低消費電力タイプのパソコンやノートパソコン、USBシリアル変換ケーブルでは、動作しないことがおおいようですので、ご注意ください)。部品をうまくあつめれば、数百円程度でつくることができるでしょう。作り方は、JDMプログラマなどをキーワードにしてインターネットを検索してみてください。ROCさんのホームページには、JDMプログラマについてくわしく紹介されています。また、つぎに紹介するIC−Progの日本語化パッチもROCさんのホームページからダウンロードすることができます。わたしのホームページでもJDMプログラマやRCDライタの作り方を紹介していますので、参考にしてください。
![]() |
写真は、左からJDMプログラマ、右下がRCDライタ、右上が PICkit1 です。JDMプログラマは緑色の電源LEDと赤色のアクセスLEDが点灯しています。アクセス確認用のLEDが点灯しているのは、デフォルト状態でMCLRがVDDにPICの内部で弱プルアップされているからです。 |
つぎに用意するのは、書き込みソフトです。シリアルポート接続タイプのJDMプログラマやRCDライタなどのPICライターに対応したフリーソフトのIC−ProgとWinPicを用意します。IC−Progの作者は Bonny Gijzen 氏で、プログラムは作者のホームページからダウンロードすることができます。WindowsNTや2000、XP を搭載したパソコンをお使いのときは、 icprog_driver.zip(icprog.sys)もダウンロードして、解凍してIC−Progのプログラム本体とおなじディレクトリ(フォルダ)においておきます。 このソフトの日本語化パッチは、前記のROCのホームページからダウンロードすることができます。それと、Wolfgang Büscher 氏の開発したフリーソフト WinPic を用意します。WinPicの日本語版も利用することができます。それと、忘れてはいけないものがあります。ボールペンとメモ用紙です(べつにサインペンや広告のチラシの紙でもなんでもいいです。記憶力の強い方には、不要かもしれませんが…)。
プログラムの書き込み
プログラムを書き込む(手順その1)
まずはじめに、工場出荷時にデバイスにあらかじめ書き込まれている内蔵オシレータの補正値をIC−Progで読み込みます。IC−Progの「設定」>「デバイス」のメニューで、使用するPICの機種を選択します。PIC12F508の場合はPIC12C508Aを、PIC12F509の場合はPIC12C509Aを選択します。IC−Progの「コマンド」>「すべて読出」を実行します。
![]() |
PIC12F508は、プログラムメモリの最後の 01FFh番地に内蔵オシレータの補正値が書き込まれています。図では 0CFE と表示されています。上位の C は、MOVLW という命令(Move literal to W)で、下位の FE が内蔵オシレータの補正値です。おなじ種類のPIC12F508でも、この補正値は個体ごとに異なっています。命令とこの値をふくめた Cxx をメモしておきましょう。図の例では、xxの部分は FE ですので、この場合は、CFE をメモしておきます。 |
![]() |
PIC12F509は、プログラムメモリの最後の 03FFh番地に内蔵オシレータの補正値が書き込まれています。図では 0C24 と表示されています。上位の C は、MOVLW という命令(Move literal to W)で、下位の 24 が内蔵オシレータの補正値です。おなじ種類のPIC12F509でも、この補正値は個体ごとに異なっています。命令とこの値をふくめた Cxx をメモしておきましょう。図の例では、xxの部分は 24 ですので、この場合は、C24 をメモしておきます。 |
注:もし、PICから読み込んで、上の2つの図のようにプログラムメモリ・エリアの最終番地に 0Cxx が表示されていなければ、ライタがうまく動作していないか、IC−Progの「設定」でプログラマの各種設定を調節する必要があります。
プログラムを書き込もう(手順その2)
では、実際にプログラムを書き込んでみましょう。
IC−Progの「ファイル」>「ファイルを開く」で、PICに書き込むHEXファイルをバッファに読み込みます。HEXファイルにオシレータの発振モード等のコンフィグレーションが埋め込まれていなくても、IC−Progで設定したり変更したりできます。「コマンド」>「全てプログラム」を実行すると、バッファの内容がPICに書き込まれます。
![]() |
PIC12F509に書き込んだプログラムは、PIC12C508A用のプログラムです。オシレータの設定はデフォルトのExtRCモードになっていますが、IC−Progで変更することができます。画像ではExtRCのまま書き込んでいます。 |
PIC12F509に書き込んだプログラムが正常にうごくのか、ブレッドボードに組んだ回路で確認してみました。書き込んだのプログラムは、PIC12C508A用のプログラムです。上の図ではオシレータがExtRCモードになっていますが、これをIntRCモードに変更してプログラムを書き込んであります。GP0(7番ピン)に接続した緑色のLEDがちゃんと点滅しました。つまり、PIC12C508(A)やPIC12C509(A)用に開発したプログラムが、そのままPIC12F508やPIC12F509で活用できるというわけですね。
![]() |
PIC12F509に書き込んだプログラムの動作確認をしているところです。GP0につないだLEDが1秒間隔で点滅しました。上記画像ではオシレータがExtRCモードになっていますが、この写真ではオシレータをIntRCモードにして書き込んでいます。 |
消去と再書き込み
消去と再書き込み(手順その1)
さて、問題となるのがデバイスの消去とプログラムの再書き込みです。せっかくのフラッシュメモリ・タイプのPIC12F508やPIC12F509なのに、消去や再書き込みができなくては、OTP(ワンタイム・プログラマブル)のPICとおなじです。IC−Progでは、PIC12C508AやPIC12C509Aの設定を代用してPIC12F509やPIC12F509にプログラムを書き込めることは確認できましたが、デバイスを消去するコマンドやアルゴリズムが、当然ですが用意されていません。PIC12F629などの設定をつかってデバイスを消去できたようにみえても、実際には消去できませんし、かりにブランクチェックをして消去ができているようにみえてもそれは完全ではなく、別のプログラムを再書き込みするとエラーがでるでしょう。また、バックアップOSCCALまで消去してしまうかもしれません。
デバイスを消去するには、WinPicを使います。つまり、少々めんどうですが、プログラムの書き込みにはIC−Progを、デバイスの消去にはWinPicをと、2つのソフトを使い分けるのです。用意します。
WinPicのメニューででまず、「デバイス」>「選択」で、PIC12F629を選択します。つぎに、「オプション」のタブウインドウ内の「プログラマのオプション」で、「オシレータ補正値を特別扱いしません」にチェックを入れます。理由は、WinPicは14ビットコアのミッドレンジ・シリーズのPIC専用のソフトとして設計されていますので、12ビットコアのPICの内蔵オシレータの補正値をもともと考慮しないからです。PIC12F508、PIC12F509デバイスの消去が完了して、次回WinPicをこれらのデバイス以外で使用するときは、このオプションのチェックをはずして無効にしておく必要があります。ご注意ください。なお、「バルク消去を使用」にはチェックを入れて有効にしておきます。
![]() |
デバイスはPIC12F629を選択します。「オシレータの補正値を特別扱いしません」を有効にします。 |
WinPicのメニューの「デバイス」>「消去」をクリックしてデバイスを消去します。そして、WinPicを終了します。「デバイスは消去済みです。補正値を書込んで復元してください!」というメッセージが表示されますが、これらは無視してください。
![]() |
WinPicはPIC12F509のような12ビットコアのオシレータ補正値を正しく扱えませんので、補正値はFFFhとして表示されます。 |
![]() |
WinPicを終了しようとすると、このような警告がでます。書き戻すべき補正値はすでに消去されて失われていますし、WinPicでは正しく書き戻すことができませんので、警告を無視して、「はい」をクリックしてWinPicを終了します。 |
消去と再書き込み(手順その2)
つぎに、失われた内蔵オシレータの補正値をPICに再度書き込んでやります。おなじパソコンのおなじシリアルポートを共有できないので、WinPicが起動していたら終了させ、IC−Progを起動します。「プログラムを書き込む(手順その1)」でメモしておいた補正値をPICに書き込みます。ここでボールペンとメモ用紙が役立ったわけですね。この補正値を、プログラムメモリ・エリアの最終番地に書き込むわけです。IC−Progのプログラムコードのバッファの枠内にマウスのカーソルをもっていき、最終番地にあわせてから、キーボードをつかって 0 の次から Cxx と打ち込みます。3桁打ち込むと、バッファの画面とカーソルは自動的にプログラムコードの先頭番地にスクロールアップします。下の図では、 C24 と打ち込んでいます。打ち込んだら、メニューから「コマンド」>「全てプログラム」をクリックして、PICに補正値を書き込みます。「オッシレータの校正値が見つかりません.代用として次の値を使用しますか? (0Cxxh)代用値」という警告が表示されますので、「はい」を選択してクリックします。「デバイスの照合に成功しました!」と表示されたら、PICは工場出荷時のデフォルト状態にもどったということを意味します。これで別のプログラムを何度も書き込むことができますね。
![]() |
余談ですが、低温や高温の環境でPICを内蔵クロックで動作させるときはクロックの誤差が大きくなりますので、精度を要求する場合は、この方法をつかって、工場出荷時に書き込まれた補正値を使わず、自分で最適化した補正値を書き込めます。 |
![]() |
PIC12F509(あるいはPIC12F508)のオシレータの補正値は消去されていますので、バッファに書き込んだ補正値を使用します。「はい」をクリックします。 |
![]() |
このメッセージが表示されたら、デバイスは工場出荷時の状態にもどったということです。 |
以上で終わりです。これで、PIC12C508(A) やPIC12C509(A) で蓄積されてきた電子工作上の資産を12F508、12F509 に継承、発展させる可能性が拡がることでしょう。なお、PIC12F509 やPIC12F509 に確実に安定したプログラム書き込みを要求される方は、マイクロチップ社純正の開発ツールやプログラムライタをお使いください。FENG3のホームページに記載している情報をもとに電子工作される場合は、自己責任でおこなってください。
[HOME]
2005年1月10日作成