![]()
5.PICのレジスタについて (2021.12.1)
PICの設計においてレジスタを理解しておくことは重要です。レジスタをどのように設定するかで、PICの動作を決定することになるからです。そうは言ってもレジスタの内容は多岐に渡り、内容を丸暗記するなど不可能です。大事なのはデータシートの見方を理解することで、プロジェクトを始める時に検討すれば良い話です。今はPIC12F675-I/Pをメインにプログラミングを行っているので、このチップが持つレジスタの働きを確認しながら、実際の設定に反映させることを目的とします。メーカー公開資料にレジスタの詳細も書かれているので、適宜参考にしていきたいと思います。姉妹モデルにADコンバーターを除いたPIC12F629-I/Pがありますが、価格はほとんど変わらないのであえて629を選択することも無いでしょう。こんなに小さな1チップマイコンでも大きなパフォーマンスを持っていて、使いこなそうとすれば相当奥の深さを感じるところです。
PIC675/629-I/P資料
幸いPICのプログラミングを行う際には、デバイスコンフィグレーションビット(PIC12F675-I/Pの資料では「9.1 Configuration Bits」の項目)と呼ばれる環境設定が簡単にできるよう、MPLAB X IDEにツールが用意されています。まずはこの項目について順に見ていきます。PIC12F675-I/Pのコンフィギュレーションビットには、コンフィギュレーションワードと言う14bitレジスタがあり(PICによっては複数のコンフィギュレーションワードレジスタがある)、目的に応じてビットを操作します。ただし、IDEではビットを直接操作するのでは無く、わかりやすい言葉で選択するようになっています。
下位3bit(FOSC0~FOSC2)は動作の要である基本クロック(発振回路)のモード設定です。「2.PICを始めよう!」で設定した内容を確認すると
#pragma config FOSC = INTRCIO
となっていて、INTRCIOは内部オシレーター(発振回路)を使用する設定です。外部からのクロックを使う場合はHSやXT等の複数の選択肢があります。外部クロックでは高性能オシレーターを用いることで、内蔵よりも精度の高い動作を実現できるようです。なお、IDEでは設定対象に対してセレクタで選択するだけで済みます。これは他の項目でも同様です。
WDTEはウオッチドッグタイマーと呼ばれる機能の設定で、PICが暴走した時等にリセット動作を行うものです。
#pragma config WDTE = OFF
安全重視のシステムでは使用した方が良いかもしれませんが、プログラムを十分検証していないとバグなのかWDTの働きなのか分からなくなるので、通常はオフで構わないと思います。
-PWRTEは起動時に電源や周辺回路が安定するまでの一定時間動作を停止するパワーアップタイマーの設定です。
#pragma config PWRTE = ON
暴走を防止するためにも通常はONにすべきです。
MCLREはMCLR端子をリセット端子として使うかどうかの設定です。
#pragma config MCLRE = ON
初めて動作させた時にハマッたのがこれです。外部リセット端子として機能する設定にしたため、端子をプルアップする必要があったわけです。これをOFFにしておけばMCLR端子はGP3として外部入力端子(この端子は出力には使えない)として利用することができます。どちらが良いかはケースバイケースですが、複雑なシステムでは外部リセットによって十分な待機時間を取った方が安全です。
BORENは電源電圧が低下してPICが不安定になるのを防ぐため、一定値以下になるとリセットをかけるブラウンアウトリセット機能を有効にするか否かを設定します。
#pragma config BOREN = ON
これもONにしておいた方が安心ですが、低電圧で使用する場合はリセットがかかりっ放しになる恐れもあるので注意が必要です。
-CPはメモリー領域に書き込んだプログラムの読み出しを許可するか否かを設定します。
#pragma config CP = OFF
特別な場合に使用する機能なので、通常はOFFの設定にします。
-CPDはEEPROMへ書き込んだデーターの読み出しを許可するか否かを設定します。
#pragma config CPD = OFF
これも特別な場合に使用する機能なので、通常はOFFの設定にします。
最上位2bit(BG0、BG1)はパワーダウンリセットキャリブレーションと呼ばれる機能の設定で、通常1が設定されユーザーは使用できません。
上記以外に重要な設定として、内蔵クロックでは周波数設定が必要です。
#define _XTAL_FREQ 4000000
周波数を最大の20MHzに設定したら、指定間隔でLEDが点滅しなくなりました。調べたところ、内蔵クロックでは4MHzまでしか使えないことを後から知りました(外部クロックなら最高20MHzで動作可能)。内蔵クロックで4MHzを超えるような指定をした場合、逆に速度が落ちるところを見ると(LEDの点滅周期が伸びた)、レジスタ設定時に上位ビットが除かれてしまうのかもしれません。4MHzで動作させると電源電圧は2Vでも使えるようなので、低電圧動作のシステムを組めるメリットがあります。これはかなりのアドバンテージがあり、いずれ恩恵に預かれるかもしれません。
コンフィギュレーションビット以外はプログラムの初期設定で直接記述します。レジスタに関連する設定であっても、わかりやすいように定数のような形になっていて、値は二進数や十六進数の数値で指定します。PIC12F675-I/Pの場合の基本設定には次のようなものがあります。
ADCON0 = 0; //
A/D変換しない
CMCON = 0x07; //
コンパレータは使用しない
ANSEL = 0; //
アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISIO = 0b00000000;
// ピンは全て出力に割当てる(GP3は入力のみとなる)
GPIO = 0b00000000; //
出力ピンの初期化(全てLOWにする)
姉妹モデルのPIC629-I/PではADCON0とANSELを指定するとエラーになります。A/Dコンバーターを内蔵しないので、I/Oは全てデジタルとして動作するようです。
それぞれの値はどのようにPICを使用したいかによって変わります。例えばGP0を入力に設定する場合は、
TRISIO = 0b00000001;
とします。GP5だけHIGHを出力したい場合には、
GPIO = 0b00100000;
になります。
準備中・・・
![]()