第20回 プログラム解説 〜 コンフィグレーション部続き 〜

引き続きPICマイコンのコンフィグレーション設定について説明します。

本シリーズ記事の内容を改訂して、基礎編、応用編、実践編として以下のリンクに公開しています。以下のシリーズはさらにいろいろなPICマイコンの機能をご紹介しています!

PICマイコン電子工作入門 〜基礎編〜
PICマイコン電子工作入門 〜応用編〜
PICマイコン電子工作入門 〜実践編〜

今回の説明

発光ダイオード点滅回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分の、プログラム作成のステップになります。

  1. 発光ダイオード(LED)を電池と抵抗のみで光らせる回路を組む
    PICマイコンの回路を組む前に、まずは電池、抵抗、発光ダイオードのみを使って、ブレッドポード上に回路を組んで発光ダイオードを光らせてみます。ここでは電池、抵抗、発光ダイオードの回路記号、回路図と、回路図からブレッドボードに組む方法を説明します。
  2. PICマイコンのベース回路を組む
    はじめの一歩の回路は、発光ダイオードを1秒に1回光らせるだけの回路です。この回路を組みます。
  3. プログラムを作る
    発光ダイオードを1秒に1回光らせるプログラムを作成します。
  4. PICマイコンに書き込んで動作させる
    作成したプログラムをPICマイコンに書き込んで動作させてみます。
  5. ベース回路にスイッチを追加
    発光ダイオードの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまでは発光ダイオードを光らせる、という出力制御をしましたが、PICマイコンで外部から信号を入力する方法を確認します。
  6. ベース回路にブザーを追加
    スイッチ付きの1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーを作ってみます。

 

説明するコンフィグレーション設定項目

このエントリでは、前回のFOSC以外の残りの設定項目について説明します。説明する設定項目は以下になります。FOSC(クロック設定)については重要ですので詳細に説明しましたが、以下の項目についての説明は入門的な範囲にとどめます。

 

WDTE(ウォッチドッグタイマー)

ウォッチドッグタイマーとはPICマイコン特有の機能ではなく、他のマイコンやCPUなどでも一般的に用いられている機能です。ウォッチドッグタイマーの「ウォッチドッグ」とは日本語に訳すと「番犬」という意味になります。実際に番犬(かな〜?)のような役割を果たしているのでこのように呼ばれるようになったようです。WDTE(ウォッチドッグタイマー)の設定値について説明する前に、そもそもウォッチドッグタイマーとは何かを説明します。

PICマイコンを使って何か作る、ということは、PICマイコンに直接スイッチやセンサ、モーターやLCDディスプレイなど様々なデバイスがつなげることになります。いろいろな入力、出力を制御する場合、入出力信号の状況によってはかなり複雑な信号処理となり、タイミングなどの問題で予期していなかった状態になって、結果、プログラムがフリーズしてしまうことがあるかもしれません。そのような時は、手っ取り早い解決策としては、PICマイコンをリセットしてしまうことですよね!まぁ、手っ取り早い、というのはちょっと乱暴ですが、作ったものによっては、暴走したら清くリセットしてしまった方がよいケースもあるかもしれません。

ウォッチドッグタイマーはこのような時に用いられます。動作としては、PICマイコンが自分のフリーズを検知したら、自分自身を自動的にリセットしてしまおう、というものです。でもPICマイコンが自分自身のフリーズをどうやって検知するのでしょうか。自分自身がフリーズ(動作不良)していたら、そもそもそのような時は正しい判断ができないですよね。どうやってフリーズを検知すればいいのでしょうか。例えば、発光ダイオードを永遠と点滅させるプログラムを書いた場合、ず〜っと同じ動作をします。ず〜っと同じ動作をしていて怪しいからリセットする、というのもよくないですよね。もしかしたら他のケースでは、発光ダイオードが永遠点滅する、というのはフリーズしてしまっている結果かもしれません。これはどのように正常かどうか判別すればよいのでしょうか。なんだか判別つかなそうな難しい問題に見えますね。

これは以下のように解決しています。

PICマイコンで通常動作するプログラムとは別に、ウォッチドッグタイマーという、プログラム動作の監視役を設けて、プログラムの動作を監視します。プログラムの動作がダメになったとき、その監視役であるウォッチドックタイマーがPICマイコンをリセットします。このこの方法について詳しく説明します。

ウォッチドッグタイマーを有効にしてPICマイコンを動作させると、動作プログラムとは別に、ウォッチドッグタイマーが動作を始めます。まず、電源投入直後はウォッチドッグタイマーのカウンタ値はゼロです。ウォッチドッグタイマーの処理内容ですが、一定の時間毎にカウンタを+1していきます。このカウンタが125になるとPICマイコンにリセット信号が出てリセットされるようになっています。このままですと、PICマイコンのスイッチを入れるとウォッチドックタイマーがカウンタを+1し続け、遅かれ早かれPICマイコンがリセットされてしまいますよね。

一方で、通常動作するプログラムには、ウォッチドッグタイマーのカウンタをゼロにする命令が用意されています。つまりプログラムは、ウォッチドッグタイマーが125を数える前に、カウンターをゼロにしないとPICマイコンがリセットされてしまう、という仕組みになっています。ウォッチドッグタイマーを有効にした場合、動作プログラムは適当なタイミングでウォッチドッグタイマーのカウンタをゼロにする命令が実行されるようにプログラムしておくことになります。なんだかこんな感じのゲームがあったような気がします…

Wd timer

なお、ウォッチドッグタイマーが125を数える時間、つまりカウンタを+1する時間は指定することができて、設定はプログラムの始めに行います。時間の設定はこのWDTEで設定するわけではない点に注意してください。デフォルトの状態では、+1する時間は約32.258マイクロ秒です(31kHzの信号を使用しています)。これを125カウントすると、つまり約4.03ミリ秒でカウントアップしてしまいます。ただし、このカウンタを+1する時間は最大32,768倍まで設定できるので、125カウントする最大の時間は約132秒となります。最大に設定した場合、動作プログラムは最大で132秒に1回ウォッチドッグタイマーにカウンタリセット命令を出せばよい、ということになります。

プログラムのどこかでフリーズしてしまったとき、だいたいのケースで何かの命令を永遠に繰り返すことになります。このとき、その永遠繰り返す命令の中にウォッチドッグタイマーのカウンタリセット命令がないと、ウォッチドッグタイマーは125までカウントしてしまい、PICマイコンにリセットがかかる、という仕組みになります。

あと、そもそもウォッチドッグタイマー自身がフリーズしてしまうことはないのか気になっちゃいますよね。実はウォッチドッグタイマーはプログラムではなくハードウエアで構成されていて、プログラム的なフリーズをすることはありません。プログラムはプログラム自身にバグがあるとフリーズすることがありますが、ウォッチドッグタイマーはプログラム的なフリーズはしないようになっています。ただ、ハードウエア的な問題があれば別ですが、そのような時はそもそも周囲の温度が異常に高いなど、PICマイコン全体が動作がおかしくなる状況です。

WDTEの設定値はONかOFFです。この入門ではもちろんWDTEはOFFにしています。

以下、WDTEの設定値です。

設定値 設定内容
OFF ウォッチドッグタイマーを無効にします。
ON ウォッチドッグタイマーを有効にします。

ウォッチドッグタイマーをOFFにする場合は、

#pragma config WDTE = OFF

と記述します。この入門ではウォッチドッグタイマーは必要あまりせんのでOFFにしています。もし興味があれば、この入門のプログラムでWTDEをONにして、ウォッチドッグタイマーがリセットを出さないようにプログラムを変更してみる、というのもいいかもしれません。

あと補足ですが、ウォッチドッグタイマーにはもうひとつ使い方があります。PICマイコンは電池で動作する電子機器に使われることが多いので、電池を長持ちさせるためにPICマイコンの動作が必要ないときはスリープモードに移行できます(プログラムで制御します)。PICマイコンがスリープモードの時にウォッチドッグタイマーがカウントアップすると、PICマイコンのリセットではなく、ウエイクアップ動作(通常動作状態に戻す動作)となります。スリープモードを使用しながら何か定期的な処理をするときに、ウォッチドッグタイマーを利用する、ということもできます。

 

PWRTE(パワーアップタイマー)

PICマイコンを含む電子回路に電源をつなぎ、スイッチをONすると、、、当然動き出しますよね。でも、実はスイッチを入れた直後の非常に短い時間で見ると、電源はすぐに電源電圧にはならず徐々に電圧が上がっていきます。そのためスイッチON直後はちょっと不安定な状態になります。

この状態でPICマイコンが動き出してしまうと、電子回路によっては誤動作する可能性もありえます。

パワーアップタイマーはそのような状況に対する設定です。パワーアップタイマーの指定はONとOFFで、ONにすると、一定時間PICマイコンを停止させます。一定時間が過ぎて、電源やクロック信号など、回路が安定してからPICマイコンの動作を開始する、ということになります。

なお、どの程度の時間停止させるかは、実は他の設定とも絡んできますので、ここでは、電源投入直後、PICマイコンが安定するまで動作停止させる設定、と理解しておけばよいと思います。

設定値 設定内容
OFF パワーアップタイマーを無効にします。
ON パワーアップタイマーを有効にします。

通常は、パワーアップタイマーはONの設定で問題ありません。ONの場合、

#pragma config PWRTE = ON

と記述することになります。

 

MCLRE(ハードウエアリセット)

PICマイコンを使って電子回路を組むとき、常時動作させるような回路の場合、特に電源スイッチは付けずに、電源アダプタを直接作った回路に接続して動作させることがあります。例えば気象データを24時間365日収集したり、時計だったり。その場合、例えば気象データ収集装置を一度リセットして、データをクリアしたい、などということがあるかもしれません。その場合、電源アダプタを抜き差しするよりは、リセットスイッチがあった方が便利ですよね。

このリセット信号は外部からPICマイコンに伝える必要があります。そのためリセットスイッチ用にPICマイコンの1ピンを使用することになります。実際、どのPICマイコンもリセットピンとして1ピン用意されています。

でも、リセットスイッチが必要ないことも多いですよね。今回の入門で作る発光ダイオードの点滅制御回路も、リセットスイッチをつける意味って、、、あまりないですよね。このようにリセットスイッチが必要ないにもかかわらず、PICマイコンに常にリセットスイッチ専用のピンがあると、その1ピンはちょっともったいないですよね。特に今回使っているPIC12F684は8ピンしかなく、そのうち、2ピンは電源ですので、残りは6ピン。さらに1ピンリセットスイッチ専用に取られてしまったら、残り5ピンとなってしまいます。

このMCLRE(ハードウエアリセット)設定は、PICマイコンのリセットスイッチ用として用意してある1ピンを、実際にリセットスイッチに使うのか、普通の入出力ピンとして使うのかの設定ができます。設定はONとOFFです。

PIC12F683の場合、第4ピンがリセットスイッチ用のピンで、MCLRE設定をONにすると、第4ピンはリセットスイッチ機能のピンとなります。この場合、以下のように電子部品を接続すると、リセットできるようになります。

Mlcr reset sw

なお、この回路はあくまで例で、Microchip社推奨の回路です。これ以外の回路でもリセットできますが、この入門ではあまり深入りしないようにします。

また、MCLRE設定をOFFにすると、第4ピンは入出力ピンとして使用できることになります。

設定値 設定内容
OFF PIC12F683の場合、第4ピンを入出力ピンにします。
ON PIC12F683の場合、第4ピンをリセットスイッチ用のピンにします。

この入門では第4ピンはあとで入出力ピンとして使用しますので、MCLREはOFFに設定します。

#pragma config MCLRE = OFF

と記述することになります。

 

CP(プログラムプロテクト)

PICマイコンに書き込んだプログラムは、MPLABXとPICKit3を使うと読み出すことができます。例えば自分でかなりすごいPICマイコンを使用した電子回路を作ったら、もしかしたらヤフオクで売れるかもしれませんよね。でもプログラムが読み出しできてしまうと、その読み出したプログラムを他のPICマイコンに書き込めばコピーできてしまいます。このCP(プログラムプロテクト)設定は、このようなことを避けるために、書き込んだプログラムの読み出しを許可するかを設定します。

設定値 設定内容
OFF プログラムの読み出しを許可します。(プログラム読み出しプロテクト=読み出し保護をOFFにします)
ON プログラムの読み出しを禁止します。(プログラム読み出しプロテクト=読み出し保護をONにします)

この入門で作成する回路は、特に読み出しプロテクトする理由もないので、OFFに設定しています。

#pragma config CP = OFF

と記述することになります。

 

CPD(データプロテクト)

先ほどはプログラムですが、こちらはデータです。データを読み出し保護したい場合、このCPD(データプロテクト)設定をONにします。

設定値 設定内容
OFF データの読み出しを許可します。(データ読み出しプロテクト=読み出し保護をOFFにします)
ON データの読み出しを禁止します。(データ読み出しプロテクト=読み出し保護をONにします)

この入門で作成する回路は、特に読み出しプロテクトする理由もないので、CPと同様にOFFに設定しています。

#pragma config CPD = OFF

と記述することになります。

 

BOREN(ブラウンアウト)

先ほどのパワーアップタイマー、スイッチを入れた直後の電源不安定の期間をどうするか、という設定でした。こちらは、何らかの理由で電源が低下するなど不安定な状態になったらどうするか、という設定です。具体的には、電池切れが間近で、電源がある電圧以下になった場合、PICマイコンを一時停止させます。もしその状態からまた復活した場合、PICマイコンの動作を再開します。なお、電源が不安定になることをブラウンアウトと呼んでいます。

BOREN(ブラウンアウト)設定は、ONとOFF以外にいくつか設定があります。

設定値 設定内容
ON ブラウンアウト発生時、PICマイコンを停止します。
OFF この機能をOFFにします。ブラウンアウトが発生しても成り行きに任せます。
NSLEEP PICマイコンが通常動作しているときはON、スリープ中はOFFにします。
SBODEN この機能のON/OFFをプログラム中で設定します。この設定をすると、プログラムでONとOFFを随時切り替えることができます。

この入門で作成する回路は、ピカピカ光るだけなので、電源不安定になってもあまり問題ありません。逆に、電源不安定になったら、この回路がどうなるのか見てみたい気もします。ただ、一般的にはONにしておいた方がよいと思います。

#pragma config BOREN = ON

と記述することになります。

 

IESO(2段階クロック)

前回のクロックの説明で、内部クロックと外部クロックがでてきました。この内部クロックと外部クロックはそれぞれ特徴があります。そのひとつに、クロック発振が安定するまでの時間があります。一般に、外部クロックはクロック発振が安定するまで意外に時間がかかります。一方、内部クロックはすぐに(といってもちょっとは時間がかかりますが)クロック発振が安定します。

タイミングが非常にシビアな回路など、立ち上がりをスムーズにするために、電源投入直後は内部クロックで動作させ、ある程度時間がたったら外部クロックに切り替える、ということができます。これを2段階クロック、と呼んでいます。

外部クロックを付けて、この2段階クロックスタートアップをしたい場合はこの設定をONにします。

設定値 設定内容
OFF 2段階クロックをOFFにします。
ON 2段階クロックをONにします。

通常はOFFで問題ないので、OFFに設定しておきます。

#pragma config IESO = OFF

と記述することになります。

 

FCMEN(バックアップクロック)

こちらもクロックの設定です。外部クロックをつけて動作させている場合に、もし外部クロックがぶっ壊れたらPICマイコンが止まってしまいますよね。これはこれで当たり前なんですが、それでも何とか動作を続ける方法があります。内部クロックがありますので、それを代替として使う方法です。つまり、外部クロックが壊れてクロック信号がなくなってしまったら、それを検知して内部クロックに切り替えて動作を続ければなんとか動作しつづけられることになります。

この設定は、このような動作を行うかどうかの設定です。

設定値 設定内容
OFF 外部クロックが壊れてクロック信号がなくなったら、悲しいですがそのまま動作しなくなります。
ON 外部クロックが壊れてクロック信号がなくなったら、内部クロックに切り替えて頑張って動作を続けます。内部クロックが壊れるまで……

この入門の回路では、内部クロックで動作させるので、この機能は関係ないためOFFにします。

#pragma config FCMEN = OFF

と記述することになります。でもちょっと考えると、外部クロックが壊れたら多分その作品は寿命なのだと思います。外部クロックが壊れても頑張って動作する、というのはなんだかある意味作品がかわいそうな気もします。OFFとON、人生に置き換えるとどちらが幸せなのでしょうかね。また、このとき「外部クロック」とは何なんでしょうかね。

 

PICマイコンコンフィグレーション設定コードの自動生成

これでコンフィグレーション設定の説明は終わりましたが、このコンフィグレーション設定を自分でキーボードで打たなくてもMPLABXで自動生成することができます。

以下はその手順です。

まず、以下のようにMPLABXの “Window”メニュー → “PIC Memory Views”メニューから、”Configuration Bits”メニューを選択します。

Config menu

すると、以下のようにPIC12F683のコンフィグレーション設定がプルダウンメニュー選択方式で設定できる領域が表示されます。

Pic config menu

この領域で、各コンフィグレーション設定項目をプルダウンメニューから選択します。デフォルトから変更した項目は赤で表示されます。設定が終わったら、下の方にある “Generate Source Code to Output” というボタンっぽいところをクリックします。

Pic config set

すると、以下のようにコンフィグレーション設定のコードが生成されます。

Pic config code

このコードで必要なところを選択し、クリップポードにコピーして(commandキー + Cキー)、自分のソースコードにペーストします。

Pic config copy

以上でコンフィグレーション設定の説明は終わりですが、入門にしてはかなり難しかったと思います。もしわからないところがありましたらコメントいただくかお問い合わせページからご質問いただけれぱと思います。

次回からメイン関数を説明します。

 

更新履歴

日付 内容
2015.9.22 新規投稿
2018.12.3 新シリーズ記事紹介追加