PIC12F5xxシリーズ

マイクロチップ社は、12ビットコアのベースライン・シリーズにフラッシュメモリ・タイプの新機種を市場に投入してきました。
わたしが2005年1月8日現在で入手できたのは、PIC10F2xxシリーズをのぞけば、PIC12F508、PIC12F509、PIC16F505、PIC16F54、PIC16F57の5機種ありました。これらの少ピンPICは、14ビットコアのミッドレンジ・シリーズと比べれば機能は少なく、I/Oピンやメモリサイズにも制限はありますが、電池駆動可能な低消費電力で、その小さなパッケージを活かした電子工作等の用途にはうってつけです。また、12C508(A)や12C509(A)で蓄積されたノウハウを継承できれば、趣味の電子工作ユーザーには今後もいろいろ使いみちがひらけそうです。

備忘録「PIC12F509を使ってみよう」(2005年2月21日追加)


PIC12F508、PIC12F509、PIC16F505の外観
(概観ではありません。外見だけです)

PIC12F508、PIC12F509、PIC16F505は、マイクロチップ社の低価格で高機能なフラッシュメモリ・タイプの8ビットマイコンです。PIC12F508とPIC12F509は最大4MHz、PIC16F505は20MHzで動作可能です。PIC12F508は512ワードのプログラムメモリと25バイトのデータメモリ、PIC12F509は1024ワードのプログラムメモリと41バイトのデータメモリ、PIC16F505は1024ワードのプログラムメモリと72バイトのデータメモリをもっています。PIC12F508とPIC12F509は8ピンPICで、I/Oピンが6つ(うち1つは入力のみ)、PIC16F505は14ピンのPICで、I/Oピンは12(うち1つは入力のみ)となっています。

「穀つぶしみたいに食べ過ぎたらだめよ」「でも、どうしておかあさんは8本足なの?」「それはね、大きくなって重たくなったから、足が余分にいるんだよ」

写真の左から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の日本語版も利用することができます。それと、忘れてはいけないものがあります。ボールペンとメモ用紙です(べつにサインペンや広告のチラシの紙でもなんでもいいです。記憶力の強い方には、不要かもしれませんが…)。

注意:WinPicとRCDライタでプログラム書き込みする場合は、Vppの電圧が降下するために数十ワードしか書き込めません。RCDライタを使う場合は、IC−Progを使用して、下記のようにするとよいでしょう。


プログラムの書き込み

プログラムを書き込む(手順その1)

まずはじめに、工場出荷時にデバイスにあらかじめ書き込まれている内蔵オシレータの補正値をIC−Progで読み込みます。IC−Progの「設定」>「デバイス」のメニューで、使用するPICの機種を選択します。PIC12F508の場合はPIC12C508Aを、PIC12F509の場合はPIC12C509Aを選択します。IC−Progの「コマンド」>「すべて読出」を実行します。

PIC12F508の場合

PIC12F508は、プログラムメモリの最後の 01FFh番地に内蔵オシレータの補正値が書き込まれています。図では 0CFE と表示されています。上位の C は、MOVLW という命令(Move literal to W)で、下位の FE が内蔵オシレータの補正値です。おなじ種類のPIC12F508でも、この補正値は個体ごとに異なっています。命令とこの値をふくめた Cxx をメモしておきましょう。図の例では、xxの部分は FE ですので、この場合は、CFE をメモしておきます。

PIC12F509の場合

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に書き込まれます。

注意:RCDライタを使用してプログラムを書き込む場合は、Vppがすぐに低下するために数十ワードしか書き込めませんので、照合でエラーがでます。これを解決するには、「設定」>「オプション」>「プログラミング」で「プログラミング後に照合」のチェックボックスをオフにし、「プログラミング中に照合」にチェックを入れます。こうすると、「コマンド」>「すべてプログラム」を実行したときに、Vppの電圧が低下して書き込み不可能になった番地で照合エラーになり、プログラム書き込みが中断されます。一呼吸おいて電解コンデンサに充電されるのを待ってから、ふたたび「コマンド」>「すべてプログラム」を実行します。すると、照合エラーになった番地からプログラム書き込みがおこなわれます。プログラムが最後まで書き込まれるまでこの操作を繰り返します(プログラムのサイズによっては数回〜数十回になるかもしれません)。プログラムがすべて書き終わって、コンフィグレーションの番地の書き込みで照合エラーがでることがありますが、このばあいは、「コマンド」>「コンフィグレーション書込」を実行します(2005年11月11日補足)。

PIC12F509の場合

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まで消去してしまうかもしれません。

注:ここで紹介している消去方法は、やはりめんどうです。アニーさんが「IC-ProgをつかってPIC16F84Aの設定でためしてみたら消去できた」とおしえてくださったので、わたしもためしたところ、うまく消去できました。しらべてみますと、消去のシリアルコマンドは12F508/509とPIC16F84Aではおなじでした。消去したあと、失われた内蔵オシレータの補正値をPICに再度書き込む必要がありますが、そのときは、IC-ProgでPIC12C508A/509Aを選択します。下記で紹介している方法は、手順が複雑なので、デバイスの消去や内蔵オシレータの補正値の復元にもIC-Progをお使いになることをおすすめします。図解のページは、英語版のホームページにありますので、参考にしてください(2005年2月17日)。

デバイスを消去するには、WinPicを使います。つまり、少々めんどうですが、プログラムの書き込みにはIC−Progを、デバイスの消去にはWinPicをと、2つのソフトを使い分けるのです。用意します。

WinPicのメニューででまず、「デバイス」>「選択」で、PIC12F629を選択します。つぎに、「オプション」のタブウインドウ内の「プログラマのオプション」で、「オシレータ補正値を特別扱いしません」にチェックを入れます。理由は、WinPicは14ビットコアのミッドレンジ・シリーズのPIC専用のソフトとして設計されていますので、12ビットコアのPICの内蔵オシレータの補正値をもともと考慮しないからです。PIC12F508、PIC12F509デバイスの消去が完了して、次回WinPicをこれらのデバイス以外で使用するときは、このオプションのチェックをはずして無効にしておく必要があります。ご注意ください。なお、「バルク消去を使用」にはチェックを入れて有効にしておきます。

WinPicの設定

デバイスはPIC12F629を選択します。「オシレータの補正値を特別扱いしません」を有効にします。

WinPicのメニューの「デバイス」>「消去」をクリックしてデバイスを消去します。そして、WinPicを終了します。「デバイスは消去済みです。補正値を書込んで復元してください!」というメッセージが表示されますが、これらは無視してください。

デバイスの消去

WinPicはPIC12F509のような12ビットコアのオシレータ補正値を正しく扱えませんので、補正値はFFFhとして表示されます。

WinPicの終了

WinPicを終了しようとすると、このような警告がでます。書き戻すべき補正値はすでに消去されて失われていますし、WinPicでは正しく書き戻すことができませんので、警告を無視して、「はい」をクリックしてWinPicを終了します。

消去と再書き込み(手順その2)

つぎに、失われた内蔵オシレータの補正値をPICに再度書き込んでやります。おなじパソコンのおなじシリアルポートを共有できないので、WinPicが起動していたら終了させ、IC−Progを起動します。「プログラムを書き込む(手順その1)」でメモしておいた補正値をPICに書き込みます。ここでボールペンとメモ用紙が役立ったわけですね。この補正値を、プログラムメモリ・エリアの最終番地に書き込むわけです。IC−Progのプログラムコードのバッファの枠内にマウスのカーソルをもっていき、最終番地にあわせてから、キーボードをつかって 0 の次から Cxx と打ち込みます。3桁打ち込むと、バッファの画面とカーソルは自動的にプログラムコードの先頭番地にスクロールアップします。下の図では、 C24 と打ち込んでいます。打ち込んだら、メニューから「コマンド」>「全てプログラム」をクリックして、PICに補正値を書き込みます。「オッシレータの校正値が見つかりません.代用として次の値を使用しますか? (0Cxxh)代用値」という警告が表示されますので、「はい」を選択してクリックします。「デバイスの照合に成功しました!」と表示されたら、PICは工場出荷時のデフォルト状態にもどったということを意味します。これで別のプログラムを何度も書き込むことができますね。

OSCCALを復元する

余談ですが、低温や高温の環境でPICを内蔵クロックで動作させるときはクロックの誤差が大きくなりますので、精度を要求する場合は、この方法をつかって、工場出荷時に書き込まれた補正値を使わず、自分で最適化した補正値を書き込めます。

念押しです

PIC12F509(あるいはPIC12F508)のオシレータの補正値は消去されていますので、バッファに書き込んだ補正値を使用します。「はい」をクリックします。

補正値が書き込まれました

このメッセージが表示されたら、デバイスは工場出荷時の状態にもどったということです。

以上で終わりです。これで、PIC12C508(A) やPIC12C509(A) で蓄積されてきた電子工作上の資産を12F508、12F509 に継承、発展させる可能性が拡がることでしょう。なお、PIC12F509 やPIC12F509 に確実に安定したプログラム書き込みを要求される方は、マイクロチップ社純正の開発ツールやプログラムライタをお使いください。FENG3のホームページに記載している情報をもとに電子工作される場合は、自己責任でおこなってください。

[HOME]


2005年11月11日更新

2005年1月10日作成