引き続きPICマイコンに書き込むプログラムを詳しく説明します。今回はPICマイコンコンフィグレーション設定の中身の説明です。
本シリーズ記事の内容を改訂して、基礎編、応用編、実践編として以下のリンクに公開しています。以下のシリーズはさらにいろいろなPICマイコンの機能をご紹介しています!
PICマイコン電子工作入門 〜基礎編〜
PICマイコン電子工作入門 〜応用編〜
PICマイコン電子工作入門 〜実践編〜
今回の説明
発光ダイオード点滅回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分の、プログラム作成のステップになります。
- 発光ダイオード(LED)を電池と抵抗のみで光らせる回路を組む
PICマイコンの回路を組む前に、まずは電池、抵抗、発光ダイオードのみを使って、ブレッドポード上に回路を組んで発光ダイオードを光らせてみます。ここでは電池、抵抗、発光ダイオードの回路記号、回路図と、回路図からブレッドボードに組む方法を説明します。 - PICマイコンのベース回路を組む
はじめの一歩の回路は、発光ダイオードを1秒に1回光らせるだけの回路です。この回路を組みます。 - プログラムを作る
発光ダイオードを1秒に1回光らせるプログラムを作成します。 - PICマイコンに書き込んで動作させる
作成したプログラムをPICマイコンに書き込んで動作させてみます。 - ベース回路にスイッチを追加
発光ダイオードの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまでは発光ダイオードを光らせる、という出力制御をしましたが、PICマイコンで外部から信号を入力する方法を確認します。 - ベース回路にブザーを追加
スイッチ付きの1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーを作ってみます。
説明するコンフィグレーション設定項目
前回 #pragma config の意味を説明しましたので、あとは各設定項目を説明するだけです。「だけです」が意外に大変だったりします。なるべく詳しく説明しますので、わからないことなどありましたらコメントかお問い合わせいただければと思います。
これから説明するコンフィグレーション設定項目は以下になります。プログラム上では、各設定項目は英文字で記述されます。プログラムに記述する際は、
#pragma config [設定項目] = [設定値]
というフォーマットになります。例えば、以下、一番はじめの項目はクロック設定に関するもので、プログラム上では、
#pragma config FOSC = [設定値]
という記述をすることになります。以下は設定項目の概要、その後に各設定項目について、設定値とその意味を説明します。まずはざっと説明したあと、それぞれの項目について、なぜこのような設定項目があるのかという背景も含めて詳しく説明します。
- FOSC
クロック設定を行います。PICマイコンを動作させるクロックを外部から供給するのか、内部クロックを使うのか、またそれぞれに対してより詳細な設定もします。 - WDTE
ウォッチドッグタイマー、というものを設定します。この設定をしておくと、PICマイコンがフリーズしてしまったときにPICマイコンを強制的にリセットしてプログラムのはじめから実行するようになります。 - PWRTE
パワーアップタイマ、というものを設定します。電源投入直後やリセット直後は電源の状態やPIC内部の動作状態が不安定なケースがありますので、その間ちょっとだけPICマイコンの動作を停止させておく、というタイマー設定です。 - MLCRE
PCってハード的なリセットボタンがありますよね。PICマイコンも外部からリセット信号を与えることができます。その設定を行います。 - CP, CPD
PICマイコンに書き込んだプログラムやデータはPICKit3を使って、MPLABXで読み取ることができます。ただし、製品とする場合など、読み取られないようにしたいことがあります。CPではプログラム、CPDではデータの外部からの読み取りをOKにするか禁止するか設定します。 - BOREN
前回のエントリで説明しましたが、ブラウンアウトが発生したときにPICマイコンを停止させるかという設定を行います。 - IESO
クロックを2段階で立ち上げるかの設定します。一般的に、PICマイコンの内部クロックはすぐに発振を始めますが、外部からクロックを供給する場合、外部クロックの電子部品(水晶発振子など)は発振が安定するまで意外に時間がかかります。PICマイコンの起動をスムーズにするために、電源投入直後は内部クロックで、ある程度時間が経ったら外部クロックに切り替える、という設定をします。なお、ここで言っている「時間」はミリ秒の世界です。 - FCMEN
クロックはPICマイコンを動作させる一番基本的な信号です。この信号がなくなったら動作しなくなります。もし外部クロックが何かの原因で故障したとき、バックアップとして内部クロックに切り替えることが可能です。ここではこの設定を行います。
それでは、それぞれの項目について説明します。なお、FOSC(クロック設定)は重要ですので詳しく説明します。その他の項目の説明は入門的な範囲にとどめますのでご了承ください。
FOSC(クロック設定)
今まで何度か説明してきましたが、PICマイコンも含めて、世の中のプロセッサはクロック信号を元に動作します。FOSC設定では、PICマイコンを動作させるためのクロックの種類についての設定を行います。大きく分けて、外部からクロック信号を供給するか、PICマイコン内部に内蔵しているクロックを使用するか、の設定です。それぞれに対していろいろと細かい設定値が用意されています。今後いろいろなPICマイコンの回路図を見ることになると思います。その際、クロックについてはいろいろな形態がありますので、この設定は一通り理解しておいた方がよいと思います。ちょっと長くなるかもしれませんが、FOSC設定に関しては詳しく説明しておくことにします。
なお、外部からクロック信号を供給する場合、クロック周波数(速度)は、そのクロック信号を発生する電子部品により決まりますが、内部クロックを使う場合は、何MHzで動作させる、というクロック周波数(速度)の設定が必要です。しかし、FOSCではその値は設定しません。内部クロックの場合、クロック周波数の値はプログラム中で設定します。この入門編では内部クロックを使用しており、そのクロック周波数を1MHzとしますが、この設定はmain()関数の中で行っています。すでにプログラムを掲載していますので気づかれた方もいらっしゃるかもしれませんね。
ところで、クロック周波数の設定はマイコンの設定に関わるものなのだから、設定はプログラムというよりコンフィグレーション部分で行うのが妥当ではないか、と思われた方もいるかもしれません。しかしクロック周波数はプログラムで実行途中に変更することができます。この背景を説明します。
クロック周波数が高い(=早く動作する)と、プロセッサの消費電力は大きくなります。PICマイコンの場合、テレビやエアコンなどのリモコンに使われることもありますが、リモコンはいつも使っているわけではないので、使っていないときは消費電力は抑えたいですよね。このようなときのためにプログラム中で周波数を変更できるようになっています。例えばリモコンの場合、ボタンが押されていないときは周波数を低くして待機、ボタンが押されたことを検知したら周波数をあげてリモコン信号を発生させる、などという使い方です。PICマイコンを始めとする、マイコンを使って電池動作させる機器を作る場合、このようにクロック周波数を制御して電池を長持ちさせる、というテクニックがあります。
FOSC設定(クロック設定)の具体的な設定値を説明する前に、クロック信号を発生させるための電子部品やクロック信号、PIC12F683のクロックに関するピンなどを説明します。
PICマイコンの外部からクロック信号を供給する場合、クロック信号を発生させるための電子部品としては「水晶発振子(一般名)」や「セラロック(商品名)」というものがあります。
まず水晶発振子は以下のようなものです。
10個入り400円程度ですので、1個40円ぐらいです。個人で使用する分にはこんなもんか、と思われるかもしれませんが、製品として量産する場合、この金額は結構高いものとなります(大量購入の場合はもっと安くなりますがそれでも高い)。後でコストの観点で違う部品も出てきますので、この値段を参考として頭の隅に置いておいていただければと思います。
水晶発振子の仕組みですが、水晶を薄く削り、その両側に電極をつけて電圧をかけると水晶が振動する性質を利用しています。薄ければ薄いほど高い周波数が得られますが、薄くするには限界があり、また薄くするほど発振周波数を調整するのが難しくなってくるので、あまり高い周波数には向いていません。また、水晶発振子単体では発振せず、コンデンサを外付けする必要があります。
水晶発振子の電子回路記号は以下です。
なんとなく、水晶を電極で挟んだ感じが出ていますよね。発振させるには、コンデンサを以下のように接続します。
もうひとつのクロック信号発生電子部品としてセラロックがあります。
こちらも1個40円程度です。ちょっと高めです。こちらは水晶の代わりにセラミックを使っています。圧電性セラミック、というものに電圧をかけると水晶と同様に振動するため、この性質を利用しています。また水晶発振子と違って、コンデンサを内蔵しているため、後からコンデンサを外付ける必要はありません。電子回路記号ですが、セラロック専用の回路記号はないようで、以下のような書き方をよく見かけます。ようするに水晶発振子に外付けコンデンサをつけたものと同じで、それらを四角で囲ってあり、回路図に「セラロック」と書かれていることもあります。
ところで、電子工作やコンピュータに興味がある方でしたら、もしかしたらクロック信号について書籍などで見かけたことがあるかもしれません。こんな感じの信号です。
このような形の信号を「矩形波」あるいは「方形波」と呼びます。しかし、先ほど説明した水晶発振子やセラロックが発生する信号はこのような形ではありません。実際には以下のような形です。
このような形の信号を「正弦波」あるいは「サイン波」と呼びます。外部からPICマイコンにクロック信号を水晶発振子やセラロックで供給する場合、このような正弦波を供給することになります。PICマイコンが動作するには矩形波のクロック信号を必要となるため、内部でこの正弦波を矩形波に整形(変換)しています。この整形(変換)する回路ですが、周波数によって最適な回路特性が異なります(増幅器の利得の値が異なる)。この回路特性が異なる、という点についても設定値の説明にちょっとだけ出てきますので、こちらも頭の片隅に置いておいてください。
次にPIC12F683のクロックに関するピンを説明します。PIC12F683のピンは以下のようになっています。
この中から、クロックに関するものを抜き出すと、以下のようになります。
クロックに関するピンは2番ピンと3番ピンになります。外部からクロックを供給する場合は、これらのピンに電子部品を接続することになります。それぞれ、複数の名前が振られていますが、FOSCで設定を行うことにより、各ピンの役割が決まります。それでは、PIC12F683に外部クロックを接続する形態を一通り説明します。後でFOSCに設定する値を説明するときにわかりやすいように番号をつけておきます。
[接続形態1]
まずはじめの接続形態は、水晶発振子あるいはセラロックを接続する方法です。FOSCにこの接続形態を指定した場合、2番ピンはOSC1ピン、3番ピンはOSC2ピンとなります。”OSC”は発振素子、Oscillatorの略です。OSC1とOSC2の数字にあまり意味はなく、要するに発振素子の2本の線をこの2つのピンに接続すればOKです。
接続方法は以下の回路図のようになります。この場合、2番ピンと3番ピンは外部クロック発生素子に占有されてしまいますよね。つまり、2番ピンと3番ピンはそれぞれ入出力ピンとしてのGP5、GP4としては使えなくなることになります。
[接続形態2]
次の接続形態は、抵抗とコンデンサを接続する方法です。まずは接続方法について以下の回路図を見てみましょう。
接続形態1と異なり、外部からクロック供給するために2番ピンしか使用していませんよね。3番ピンは余りますので、普通に考えたら、GP4として入出力ピンとして使用することができそうですよね。もちろんGP4として使用することができます。ただこの接続形態の場合、3番ピンは別の役割のピンに設定することもできます。以下の2通りの設定ができることになります。
・接続形態2-1 (3番ピンをGP4の入出力ピンとして使用する場合)
・接続形態2-2 (3番ピンをCLKOUT(クロック出力)として使用する場合)
接続形態2-1の3番ピンを入出力ピンGP4として使用する場合はいいとして、CLKOUTピン(クロック出力ピン)、って具体的にどういう機能なのでしょうか。詳しく説明するためにちょっと遠回りします。
上の回路図で、2番ピンに抵抗とコンデンサを接続してクロックを発生させていますが、実は抵抗とコンデンサのみではクロック信号を発生させることはできません。これは、PICマイコン内部に「あと抵抗とコンデンサを付けてもらえば発振できる回路」が予め入っていて、その回路と、外に付けた抵抗とコンデンサによってクロック発振をしています。
唐突ですが、ホットケーキミックスだけではホットケーキはできませんよね。ホットケーキミックスは、あと牛乳と卵を追加すれば作れますよ、っていうものですよね。さらに牛乳や卵の量を変えるとクレープやパンケーキ、ホットケーキなどいくつかの種類が作れるようになっています。この接続形態2も似たような感じのもので、ホットケーキミックスに相当するのがPICマイコンの中に予め用意されている発振回路の一部、牛乳と卵に相当するのが、後から接続する抵抗とコンデンサ、っていう感じです。その抵抗とコンデンサの値を変えるとクロック周波数を自由に変えることができます。(例えにちょっと無理があるか…)
この接続形態の場合、PICマイコン内部の回路と外に付けた抵抗とコンデンサを使用して、PICマイコン内部で矩形波のクロック信号が作られます。この内部で作られた矩形波のクロック信号を外に取り出して使用したいケースがあります。例えば、他のPICマイコンでもそのクロック信号を使って動作を同期させたい、などのときです。そのときは接続形態2-2のように設定して、3番ピンからPICマイコン内部でつくられたクロック信号を取り出して利用することができます。
なおこの接続形態は、精度はそれほど必要ないけれど、コストを抑えたい、ということきに使われます。先ほど、水晶発振子やセラロックは40円ぐらいでした。この回路は、抵抗が1円程度、コンデンサも5円〜10円ですからかなりコストを抑えることができます。
[接続形態3]
次の接続形態は、2番ピンに整形された矩形波を入力する方法です。例えばすでに他のPICマイコンやICで矩形波の波形のクロック信号がある場合、その信号をこの番ピン(CLKINピン)に入力することができます。
こちらも接続形態2と同様、クロック入力ピンとして2番ピンしか使用しません。接続形態2-2では、3番ピンはクロック信号出力ピンとして設定できましたよね。でも、この接続形態ではすでに入力しているクロック信号は矩形波で整形されたものですので、それをCLKOUTピンからあえて出力する必要はありません。そのため、この接続形態の場合、3番ピンはGP4として入出力ピンとして使用することになります。
[内部クロック]
以上が外部からクロックを供給するときの接続形態ですが、内部クロックを使用する場合でも、2通りの設定が可能になっています。3番ピンをGP4ピン(入出力ピン)として使用するか、CLKOUTピン(クロック信号出力ピン)として使用するかの設定です。
なお、2番ピンはクロックの入力に使用されませんので、入出力ピンGP5として使用できます。
FOSCの設定値
さて、以上でFOSCに設定する値の必要な情報を説明しましたので、以下にFOSCに設定する値についてまとめます。
設定値 | 設定内容 |
---|---|
HS | 接続形態1で外部クロック周波数が4MHz〜20MHzの場合、FOSCにこの値を設定します。接続形態1の場合、HS/XT/LPのいずれかを指定しますが、これは先に説明したように、PICマイコン内部の回路特性の設定を変えるためです。以下、XT/LPについても同じです。 |
XT | 接続形態1で外部クロック周波数が4MHz以下の場合にこの値を設定します。 |
LP | 接続形態1で外部クロック周波数が32.768kHzの場合にこの値を設定します。これは時計用の32.768kHzの水晶発振子を使用するときに設定します。 |
EXTRCIO | 接続形態2-1の場合にこの値を設定します。 |
EXTRCCLK | 接続形態2-2の場合にこの値を設定します。 |
EC | 接続形態3の場合にこの値を設定します。 |
INTOSCCLK | 内部クロックを使用する場合にこの値を設定します。この値を設定すると、3番ピンはクロック出力となります。2番ピンはGP5として使用できます。 |
INTOSCIO | 内部クロックを使用する場合にこの値を設定します。この値を設定すると、3番ピンは入出力ピンGP4となります。INTOSCと同様、2番ピンはGP5として使用できます。 |
今回の入門では、内部クロックを使用して、3番ピンはGP4の入出力ピンとして使用しますので、
#pragma config FOSC = INTOSCIO
と設定を記述することになります。また、他の例としては、12MHzの水晶発振子をを使用して外部からクロックを供給する場合は、
#pragma config FOSC = HS
と設定することになります。
ところで、クロック発生の形態がいろいろと出てきました。どれを選択すればよいのでしょうか。実はベストなものはなく、一長一短ですので、用途に合わせて選択することになります。一長一短とは、精度を高めると部品コストが高くなったり、という感じです。ただ個人で使用する場合は、10円、20円のものがコストが高くなると言っても50円とかになる程度ですので、あまり関係ないかもしれませんね。
でも例えば時計などを作る場合、クロック周波数が不正確ですと、時刻も不正確になります。このような時は、内部クロックやRC発振に比較して、精度が高くて温度に対して比較的安定している水晶発振子を使った外部クロックが適しています。ただしデメリットとしてコストが高いことがあります(といっても30円〜40円程度だったりしますが)。そのため、あまり精度や安定性が必要でない場合は、内部クロックやRC発振を使ったほうがよい、ということになります(といっても10円、20円を節約する程度ですが)。
この入門では1秒に1回発光ダイオードを点滅させる回路とかタイマー回路など、時間に関する回路を作っていますが、何時間も動かすことは想定していないことと、回路を簡単にすることから、内部クロックを使っています。もし何時間も計測する場合は、クロック回路を見直す必要があります。
また補足ですが、FOSCの設定がLPの場合、時計用の水晶発振子で、その発信周波数は32.768kHz、となんだか中途半端な数字に見えますよね。でもこの32.768kHzというのは、マイコンでは非常に扱い易い数字なんです。32.768kHzは、1kHzが1000Hzですので、32768Hz、ということになります。つまり、1秒間に32768回振動する、ということです。時計を作る場合、クロック信号を32768回数えたら1秒、ということになります。この32768、という数字は、実は2の15乗となっています。16進数で表すと0x8000、2進数では0b1000000000000000になります。32768まで数えたかどうかは、2バイトの変数、つまりunsigned shortを用意して、最上位ビットが1になったら1秒、ということでとても扱い易い数字(周波数)となっています。実際、この32.768kHzの水晶発振子は、時計用として売られていますし、クオーツ時計にはこの周波数の水晶発振子が内蔵されています。
すみません。また説明が長くなってしまいましたので、以降の設定項目は次回にします。
更新履歴
日付 | 内容 |
---|---|
2015.9.22 | 新規投稿 |
2018.12.3 | 新シリーズ記事紹介追加 |
いつも勉強させていただいております。とても感謝しています。
今回はちょっとつまずいたのでご報告いたします。
説明とは別のマイコンになりますが、PIC16F886をいじっており、FOSCにINTOSCCLKを設定したところ、ビルドエラー「unknown configuration setting/register (FOSC = INTOSCIO) used」が発生しました。
・どこかのヘッダファイルに書かれているかと探したのですが見つからず。
・PIC16F886のデータシートを見ても、INTOSCCLKが設定可能であるが「#pragma config」の書き方については記述されてない状態。
・xc8のdocsを探し回り、pic_chipinfo.htmlを見たところ、マイコン毎の設定値が書かれてありようやく正解に辿り着きました。
非常にわかりやすいご説明で助かります。今後ともよろしくお願いします。
福岡市の田﨑と申します。
田崎様、
コメントどうもありがとうございます。
自分で読み返すと、まだちょっとわかりづらいかな、と思うところもありますので、わからないところなどございましたらコメント欄かお問い合わせフォームでご質問いただければと思います。