新年明けましておめでとうございます
今年も、どうぞよろしくお願いいたします
久しぶりの投稿になりました。年末にまとめて作成した基板が出来上がって届きまして、それらの評価を進めているうちに、年が明けてしまい、レポートが遅れてしまった次第。自分の設計ミスもあり、多くのトラブルなどにも見舞われ、あれやこれやとばたばたと対処している間に時間が経ちました。それらの報告は、別途そのうちに。
今まで、制御マイコンとしては主にPICを利用してきました。場合によっては、もっと簡単に実現したい場合にはArduinoを使いましたので、AVRのマイコンも一部利用していますが、本格的な自作ボードではPICを主に利用しています。
いろいろな癖が言われるPICですが、C言語でプログラミングする限りは、あまり意識する必要がありません。しかし、PICの特殊な機能にアクセスしようとすると、どうしてもそれなりの約束事が必要になります。それらの情報は、インターネット上にも散在してはいますが、ジャストミートする情報に行き着ける場合が意外と少ないものです。結局、得られた情報の断片から、自分で試してみて、うまくいく方法を探り当て、それをストックすることで再利用するという方法をとることになります。
その手の情報は、ローカルに自分でPICノウハウ集として記録をしておりますが、せっかく得られたノウハウを独り占めするのはもったいない。自作する方々のために広く公開して、ものづくりの裾野を広げたいと思います。
今後、シリーズ化して情報を提供していきますので、自由にご活用いただければと思います。なお、何らかのお役に立った場合には、コメントなど、残していただけると幸甚です。
どうぞよろしくお願いいたします。
今回は、初回として、PICのデバイスID、リビジョンIDをプログラムで活用する方法についてです。
PIC個々のチップには、チップ内にデバイスID、リビジョンIDが記録されています。デバイスIDとは型番を示すもので、リビジョンIDをは同型のものでも改良が加えられていくバージョンのようなものを表します。マニュアル上の機能は同じでも、リビジョンによって、不具合の状況が異なったりする場合があります。リビジョン毎の不具合は、Errataとして公開されており、プルグラムがどうしても思うように動かない場合など、Errataを確認して、地雷を踏んでることに気がついたりするものです。
たとえば、私が好んで利用するPIC12(L)F1822/16(L)F1823については、最新リビジョンA9となっており、過去にA6、A8というリビジョンがあります。それらのErrataはここに公開されています。
過去に遭遇した不具合では、ADコンバータの変換があります。仕様上は終了はフラグで検知出来るとあるのですが、場合によってフラグが立たないときがあるという極めて致命的なものでした。そのために、プログラムは、リビジョンによってソースを分けなければならない状況になります。そんな場合、プログラムからチップのリビジョンが確認できれば、自動的にそれぞれのリビジョンに応じた論理にすることで、ソースコードの一本化が可能になります。
それでは、プログラムからデバイスIDとリビジョンIDを読む方法のプログラムソースです。
// デバイスIDリビジョンIDの確認
unsigned int dev_id; // デバイスID(9ビット)
unsigned char rev_id; // リビジョンID(5ビット)
EEADRH=0x80; // デバイスIDの上位アドレスセット
EEADRL=0x06; // デバイスIDの下位アドレスセット
CFGS=1; // EECON1のCFGSフラグセット(コンフィグメモリ読込み可能に設定)
RD=1; // EECON1のRDフラグセット
NOP(); // RDセット後2サイクルは無視される
NOP(); // RDセット後2サイクルは無視される
dev_id=((EEDATH<<8)+EEDATL)>>5; // デバイスID読込み(EEDATH+EEDATL上位3ビット)
rev_id=EEDATL&0x1F; //リビジョンID読込み(EEDATLの下位5ビット)
投稿の際に、インデントが崩れてしまうのはお許しください。こうすることで、dev_idにデバイスIDが、rev_idにリビジョンIDが読み込まれます。デバイスのデータシート(マニュアル)に、それらIDのフォーマットについては上の表のように記述してありますので、特定することが可能となります。
上記は、PICに内蔵されている不揮発性ROM、EEPROMから読み出すルーティンとなります。より汎用的なEEPROMアクセス方法については、別途、ご紹介させていただきます。
次回へ