(3)PICマイコン入門-基礎PICマイコン入門-基礎コンティグレーション設定の残りの項目を説明します。回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分のコンフィグレーション設定の最後のステップになります。LEDを電池と抵抗のみで光らせる回路を組み立てるPICマイコンの回路を組み立てる前に、まずはブレッドボードに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドポード上に回路を組んでLEDを光らせてみます。ここでは電池、抵抗、発光ダイオードの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。ブレッドボードに慣れましょう!PICマイコンのベース回路を組むはじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。この回路をブレッドボードに組み立てます。プログラムを作るLEDを1秒に1回光らせるプログラムを作成します。PICマイコンに書き込んで動作させる作成したプログラムをPICマイコンに書き込んで動作させてみます。ベース回路にスイッチを追加LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部から信号を入力する方法を確認します。ベース回路にブザーを追加スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。今回の記事では、前回説明しましたFOSC以外の残りの設定項目について説明します。説明する設定項目は以下になります。FOSC(クロック設定)については重要ですので詳細に説明しましたが、以下の項目についての説明は入門的な範囲にとどめます。Enable」の略です。ウォッチドッグタイマーとはPICマイコン特有の機能ではなく、他のマイコンやCPUなどでも一般的に用いられている機能です。ウォッチドッグタイマーの「ウォッチドッグ」とは日本語に訳すと「番犬」という意味になります。実際に番犬のような役割を果たしている(?)のでこのように呼ばれるようになったようです。WDTE(ウォッチドッグタイマー設定)の設定値について説明する前に、そもそもウォッチドッグタイマーとは何かを説明します。PICマイコンを使って何か作る、ということは、PICマイコンに直接スイッチやセンサ、モーターや液晶ディスプレイなど様々な部品をつなげることになります。いろいろな入力、出力を制御する場合、入出力信号の状況によってはかなり複雑な信号処理となり、タイミングなどの問題で予期していなかった状態になって、結果、プログラムがフリーズしてしまうことがあるかもしれません。そのような時は、手っ取り早い解決策としては、PICマイコンをリセットしてしまうことですよね!まぁ、手っ取り早い、というのはちょっと乱暴ですが、作ったものによっては、フリーズしたら清くリセットしてしまった方がよいケースもあるかもしれません。ウォッチドッグタイマーはこのような時に用いられます。動作としては、PICマイコンのプログラムのバグったら、自分自身を自動的にリセットしてしまおう、というものです。PICマイコンはプログラムに従って動くわけですので、プログラムがバグったら自分自身が動作不良に陥っているわけですから、そもそも「バグった」という正しい判断はできないですよね。酔った人が「俺は酔ってない!」なんて言うのをたまに聞きますが、酔った本人は正常な判断ができなくなっているので「俺は酔ってない!」というのは正しい判断ではないという現象に似ているわけです。例えになってないですかね。やってフリーズを検知すればいいのでしょうか。一緒に考えてみましょう。LEDを永遠と点滅させるプログラムを書いた場合、ず〜っと同じ動作をします。これは正しい動作です。いうことは、ず〜っと同じ動作を繰り返していて怪しいからリセットする、というのはよくないですよね。したら他のケースでは、LEDが永遠点滅を繰り返す、というのは実はフリーズしてしまっている結果かもしれません。LEDが点滅を続けているからといって一概にフリーズしているとは判断できません。他にもいろいろなケースを考えてみると、どのような動作が正常で、どのような動作が異常なのかを判定するのはほぼ不可能です。最近の人工知能を搭載すればわかりそうな気もしますが、そもそもマイコンにそんなパワーはありません。なんだか解決不可能な問題に見えますね。これは以下のように解決しています。通常動作するプログラムとは別に、「ウォッチドッグタイマー」というプログラム動作とは別に動作するハードウエアモジュールがPICマイコンの中に組み込まれています。この「ウォッチドッグタイマー」というモジュールは、プログラムの動作を監視します。プログラムの動作がダメになったとき、その監視役であるウォッチドックタイマーがPICマイコンをリセットします。ウォッチドッグタイマーは何を持ってプログラムの動作がダメになった、と判断すればよいのか、その仕組みを見ていきましょう。最初にイメージで説明します。ウォッチドッグ(番犬)に餌を与える時間間隔を決めておきます。12時間に1回餌を与える、というように決めておきます。次にマイコンのプログラム動作を開始します。プログラムは自分のプログラム実行中に、必ず12時間以内の間隔で番犬に餌を与えるように、プログラム中に餌を与える命令を書いておきます(上限が12時間なので、餌を与える間隔はそれより短ければOKです)。このようにしておくと、もしプログラムがフリーズして番犬に餌を与える命令が実行されない場合、その時間が12時間を超えると、、、番犬はPICマイコンをリセットします。このように、何かゲームのような感じでプログラムのフリーズ検知、リセットを行います。それでは実際にマイコンではどのように実現しているか説明します。ウォッチドッグタイマーを有効にするには、このコンフィグレーション設定(WDTE)をONにします。この状態でPICマイコンが動作を開始すると、プログラムを動作させるハードウエアとは独立したハードウエアでウォッチドッグタイマーが動作を始めます。電源投入直後はウォッチドッグタイマーのカウント値はゼロです。ウォッチドッグタイマーの処理内容ですが、一定の時間毎にカウントを+1していきます。このカウンタが125になるとPICマイコンにリセット信号が出てリセットされるようになっています。このように、プログラムがウォッチドッグタイマーのカウントをゼロに戻さないと(番犬に餌を与えないと)、ウォッチドックタイマーがカウンタを+1し続け、遅かれ早かれPICマイコンがリセットされてしまいます。これを避けるには、プログラムは定期的に設定時間内にウォッチドッグタイマーのカウントをゼロにすればよいわけです。マイコンにはウォッチドッグタイマーのカウントをゼロにする命令が用意されています。プログラムは、ウォッチドッグタイマーが125を数える前に、カウンターをゼロにする必要があるわけです。ウォッチドッグタイマーが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にしています。ウォッチドッグタイマーを無効にします。ウォッチドッグタイマーを有効にします。プログラム実行中はウォッチドッグタイマーを有効にして、マイコンがスリープ中は無効にします。ウォッチドッグタイマーの有効/無効をソフトウエアで制御します。この基礎編ではウォッチドッグタイマーは必要性は低いためOFFにしています。興味があれば、この入門のプログラムでWTDEをONにして、ウォッチドッグタイマーがリセットを出さないようにプログラムを変更してみる、というのもいいかもしれません。補足ですが、ウォッチドッグタイマーにはもうひとつ使い方があります。PICマイコンは電池で動作する電子機器に使われることが多いので、電池を長持ちさせるためにPICマイコンの動作が必要ないときはスリープモードに移行できます(プログラムで制御します)。PICマイコンがスリープモードの時にウォッチドッグタイマーがカウントアップすると、PICマイコンのリセットではなく、ウエイクアップ動作(通常動作状態に戻す動作)となります。スリープモードを使用しながら何か定期的な処理をするときに、ウォッチドッグタイマーを利用する、ということもできます。Enable」の略です。PICマイコンを含む電子回路に電源をつなぎ、スイッチをONすると、、、当然動き出しますよね。実はスイッチを入れた直後の非常に短い時間で見ると、電源はすぐに電源電圧にはならず徐々に電圧が上がっていきます。そのためスイッチON直後はちょっと不安定な状態になります。この状態でPICマイコンが動き出してしまうと、電子回路によっては誤動作する可能性もありえます。パワーアップタイマーはそのような状況に対する設定です。パワーアップタイマーの指定はONとOFFで、ONにすると、一定時間PICマイコンを停止させます。一定時間が過ぎて、電源やクロック信号など、回路が安定してからPICマイコンの動作を開始する、ということになります。パワーアップタイマーを無効にします。パワーアップタイマーを有効にします。通常は、パワーアップタイマーはONの設定で問題ありません。ONと記述することになります。Enable」の略です。PICマイコンを使って電子回路を組むとき、常時動作させるような回路の場合、特に電源スイッチは付けずに、電源アダプタを直接作った回路に接続して動作させることがあります。気象データを24時間365日収集したり、時計だったり。その場合、例えば気象データ収集装置を一度リセットして、データをクリアしたい、などということがあるかもしれません。その場合、電源アダプタを抜き差しするよりは、リセットスイッチがあった方が便利ですよね。このリセット信号は外部からPICマイコンに伝える必要があります。そのためリセットスイッチ用にPICマイコンの1ピンを使用することになります。実際、どのPICマイコンもリセットピンとして1ピン用意されています。リセットスイッチが必要ないことも多いですよね。今回の入門で作るLED点滅制御回路も、リセットスイッチをつける意味って、、、あまりないですよね。このようにリセットスイッチが必要ないにもかかわらず、PICマイコンに常にリセットスイッチ専用のピンがあると、その1ピンはちょっともったいないです。今回使っているPIC12F684は8ピンしかなく、そのうち、2ピンは電源ですので、残りは6ピン。1ピンリセットスイッチ専用に取られてしまったら、残り5ピンとなってしまいます。このMCLRE設定は、PICマイコンのリセットスイッチ用として用意してある1ピンを、実際にリセットスイッチに使うのか、普通の入力ピンとして使うのかの設定ができます。設定はONとOFFです。PIC12F1822の場合、4番ピンがリセットスイッチ用のピンで、MCLRE設定をONにすると、4番ピンはリセットスイッチ機能のピンとなります。この場合、以下のように電子部品を接続すると、リセットできるようになります。この回路はあくまでも一例で、Microchip社推奨の回路です。これ以外の回路でもリセットできますが、この入門ではあまり深入りしないようにします。MCLRE設定をOFFにすると、4番ピンは入力ピンとして使用できることになります。(このピンはリセットスイッチに使用しない場合、入力ピンにしか使用できません。PIC12F1822の場合、4番ピンを入力ピンにします。PIC12F1822の場合、4番ピンをリセットスイッチ用のピンにします。この入門では4番ピンはあとで入力ピンとして使用しますので、MCLREはOFFに設定します。OFFと記述することになります。Protection」の略です。PICマイコンに書き込んだプログラムは、MPLABXとPICKit3を使うと読み出すことができます。自分でかなりすごいPICマイコンを使用した電子回路を作ったら、もしかしたらヤフオクで売れるかもしれませんよね。プログラムが読み出しできてしまうと、その読み出したプログラムを他のPICマイコンに書き込めばコピーできてしまいます。プログラムの読み出しを許可します。プログラムの読み出しを禁止します。(プログラム読み出しプロテクト=読み出し保護をONにします)この入門で作成する回路は、特に読み出しプロテクトする理由もないので、OFFに設定しています。OFFと記述することになります。Protection」の略です。(なんか略語の順番が違うような...)先ほどはプログラムですが、こちらはデータです。データの読み出しを許可します。データの読み出しを禁止します。(データ読み出しプロテクト=読み出し保護をONにします)この入門で作成する回路は、特に読み出しプロテクトする理由もないので、CPと同様にOFFに設定しています。OFFと記述することになります。Enable」の略です。先ほどで出てきたパワーアップタイマー(PWRTE)はスイッチを入れた直後の電源不安定の期間をどうするか、という設定でした。こちらは、何らかの理由で電源が低下するなど不安定な状態になったらどうするか、という設定です。具体的には、電池切れが間近で、電源がある電圧以下になった場合、PICマイコンを一時停止させます。その状態からまた復活した場合、PICマイコンの動作を再開します。電源が不安定になることをブラウンアウトと呼んでいます。ブラウンアウト発生時、PICマイコンを停止します。この機能をOFFにします。ブラウンアウトが発生しても成り行きに任せます。PICマイコンが通常動作しているときはON、スリープ中はOFFにします。この機能のON/OFFをプログラム中で設定します。この設定をすると、プログラムでONとOFFを随時切り替えることができます。この入門で作成する回路は、LEDがピカピカ光るだけなので、電源不安定になってもあまり問題ありません。逆に、電源不安定になったら、この回路がどうなるのか見てみたい気もします。一般的にはONにしておいた方がよいと思います。ONと記述することになります。Enable」の略です。前回の記事のクロックの説明で、内部クロックと外部クロックがでてきました。この内部クロックと外部クロックはそれぞれ特徴があります。そのひとつに、クロック発振が安定するまでの時間があります。一般に、外部クロックはクロック発振が安定するまで意外に時間がかかります。内部クロックはすぐに(といってもちょっとは時間がかかりますが)クロック信号が安定します。タイミングが非常にシビアな回路など、立ち上がりをスムーズにするために、電源投入直後は内部クロックで動作させ、ある程度時間がたったら外部クロックに切り替える、ということができます。これを2段階クロック、と呼んでいます。2段階クロックをOFFにします。2段階クロックをONにします。通常はOFFで問題ないので、OFFに設定しておきます。OFFと記述することになります。Enable」の略です。こちらもクロックの設定です。外部クロックをつけて動作させている場合に、もし外部クロックがぶっ壊れたらPICマイコンが止まってしまいますよね。これはこれで当たり前なんですが、それでも何とか動作を続ける方法があります。内部クロックがありますので、それを代替として使う方法です。外部クロックが壊れてクロック信号がなくなってしまったら、それを検知して内部クロックに切り替えて動作を続ければなんとか動作しつづけられることになります。外部クロックが壊れてクロック信号がなくなったら、悲しいですがそのまま動作しなくなります。外部クロックが壊れてクロック信号がなくなったら、内部クロックに切り替えて頑張って動作を続けます。内部クロックが壊れるまで......この入門の回路では、内部クロックで動作させるので、この機能は関係ないためOFFにします。OFFと記述することになります。考えると、外部クロックが壊れたら多分その作品は寿命なのだと思います。外部クロックが壊れても頑張って動作する、というのはなんだかある意味作品がかわいそうな気もします。OFFとON、人生に置き換えるとどちらが幸せなのでしょうかね。このとき「外部クロック」とは何なんでしょうかね。Enable」の略です。前回の記事の外部クロックを接続する方法として、2番ピンのみ使用する形態がありました。このクロック指定の場合に、3番ピンの役割をどうするか、という設定になります。1つは以下のようにクロック信号を外部に出力する設定です。1つは入出力ピンとして使用する設定です。3番ピンをクロック信号出力ピンにします。3番ピンを入出力ピンにします。上記のように外部クロックを2番ピンのみに接続する場合のみ、設定が有効です。内部クロックを使用する場合などはOFFにしておきます。OFFと記述することになります。Protection」の略になります。Protection」ということで、「書き込み禁止」設定なのですが、これは何に対して禁止するかというと、プログラム領域の書き込み禁止設定になります。この設定は、通常はあまり気にしなくてもいいと思いますが、例えば以下のような場合にこの設定は有効です。PICマイコンに書き込むプログラムを以下のようにします。「PICマイコンが動作を開始したら、外部からのデータが受信されるのを待って、データを受信したらプログラム記憶領域に書き込む。データ受信が終了したら、そのデータの先頭から実行する」という内容です。上の内容で、赤文字の「データ」がプログラムだったら、、、外部から読み込んだデータ(=プログラム)を実行できますよね。基礎編としてはちょっと難しい内容ですが、このように後からプログラムを読み込んでそのプログラムを実行するプログラム、つまり元のプログラムをブートローダーと呼ぶこともあります。PICマイコンに興味があれば、Arduinoをご存知かもしれません。Arduinoに搭載しているマイコンにはブートローダーが書き込んであり、そのプログラム(=ブートローダー)の動作は、「USB経由で受信したデータをプログラム領域に書き込み、データ受信が終わったら書き込んだデータの先頭から実行する」という内容です。この時、ブートローダーは後から読み込んだプログラムに書き換えられては困るので、ブートローダーのプログラム領域は書き込み禁止にしたい、ということがあります。すべての領域を書き込み可能にします。000h〜1FFhの領域を書き込み禁止にします。000h〜3FFhの領域を書き込み禁止にします。すべての領域(000h〜7FFh)を書き込み禁止にします。なんだかちょっと難しいですよね。通常のプログラムではプログラム領域を書き換えることはないと思いますので、よくわからないようでしたらOFFの設定で問題ありません。OFFと記述することになります。Enable」の略です。PLLを制御する設定なのですが、そもそもPLLって何なんでしょう。Loop」の略なんですが、こんなことを説明してもさらにわからなくなってしまいますよね。このPLLはマイコンに限らず、FMラジオなどのアナログ回路にも出てくる、かなり応用範囲の広い技術です。一言で説明すると、周波数を逓倍(ていばい)する機能です。(「逓倍」とは周波数などを2倍とか3倍とか整数倍にすることです)PIC12F1822のPLLEN設定はONとOFFです。発生したクロックを4倍にします。発生したクロックをそのまま使用します。今回は内部クロックを1MHzに設定してそのまま使用しますので、OFFに設定します。OFFと記述することになります。Enable」の略です。C言語の応用的な内容を勉強された方であれば、スタックオーバーフローやスタックアンダーフローという言葉は聞かれたことがあるかもしれません。C言語のスタックは、関数の引数やリターンアドレスを保存していくメモリ領域を意味しています。PICマイコンの場合は、単にリターンアドレスを保存していくメモリ領域で16個分用意されています。スタックオーバー/アンダーフローの場合、リセットする。スタックという言葉を聞かれたことがない場合、何が何だか、、、という感じですよね。この設定はどちらにしたところで、問題が発生した時にプログラムをリセットするか(ON)、何もしないか(=OFF)で、どちらも動きはおかしくなります。通常はOFFで問題ないので、OFFに設定しておきます。OFFと記述することになります。Voltage」の略です。BOREN設定では、ブラウンアウトが発生した場合、プログラムの動作をどうするか設定しました。このBORV設定は、ブラウンアウトが発生した、と判断する電圧を設定します。何ボルト、という設定ではなく、高い、低いの設定になります。電源電圧が設定電圧より低くなるとリセットするので、このBORVを高い電圧に設定するとちょっと電圧が下がるとリセットします(電源の電圧低下に敏感になる)。高い電圧に設定します。通常はLOで問題ないので、LOに設定しておきます。LOと記述することになります。Programming」の略です。概要のところでちょっと説明しましたが、PICKIT3を使用してプログラムを書き込む際、実際の書き込み時には高い電圧で書き込みがされています。PICKIT3を使用してプログラムを書き込む場合は意識する必要はありませんが、書き込み回路を自作する場合など、この高い電圧を用意するには追加の回路が必要になってしまいます。低電圧書き込みを無効にします。低電圧書き込みを有効にします。PICKIT3を使用して書き込む場合は、OFFに設定しておきます。OFFと記述することになります。PICマイコンコンフィグレーション設定コードの自動生成これでコンフィグレーション設定の説明は終わりましたが、このコンフィグレーション設定を自分でキーボードで打たなくてもMPLABXで自動生成することができます。Bits”メニューを選択します。すると、ウインドウの下の方にPIC12F1822のコンフィグレーション設定がプルダウンメニュー選択方式で設定できる領域が表示されます。この領域で、各コンフィグレーション設定項目をプルダウンメニューから選択します。デフォルトから変更した項目は赤で表示されます。いうボタンっぽいところをクリックします。すると、以下のようにコンフィグレーション設定のコードが生成されます。Cキー)、自分のソースコードにペーストします。以上でコンフィグレーション設定の説明は終わりですが、基礎編にしてはかなり難しかったと思います。わからないところがありましたらコメントいただくかお問い合わせページからご質問いただけれぱと思います。