今回はコンフィグレーション設定について詳しく解説します。回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分のプログラムの解説のステップになります。LEDを電池と抵抗のみで光らせる回路を組み立てるPICマイコンの回路を組み立てる前に、まずはブレッドボードに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドポード上に回路を組んでLEDを光らせてみます。ここでは電池、抵抗、LEDの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。ブレッドボードに慣れましょう!PICマイコンのベース回路を組むはじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。この回路をブレッドボードに組み立てます。プログラムを作るLEDを1秒に1回光らせるプログラムを作成します。PICマイコンに書き込んで動作させる作成したプログラムをPICマイコンに書き込んで動作させてみます。ベース回路にスイッチを追加LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部から信号を入力する方法を確認します。ベース回路にブザーを追加スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。意味を説明しましたので、あとは各設定項目を説明するだけです。「だけです」と書いてしまいましたが、今回説明するプログラムの中で、このコンフィグレーション設定部分の理解が一番大変だと思います。わかりやすく説明するよう心がけますが、うまく説明できないところもあると思いますので、わからないことなどありましたらコメントかお問い合わせフォームからご質問いただければと思います。コンフィグレーション設定は、以下のフォーマットで記述します。[設定値]のように記述します。[設定値]については、それぞれの設定項目で設定できる値が決まっていますので、これから順に説明していきます。ところで、各設定項目を詳しく説明すると、かなり長くなりますので、最初に概要を説明します。数が多くてげんなり、って感じもしますが、この段階で全部理解する、というより、まずはざっとどんなものがあるのか、ご確認いただければと思います。FOSCクロック設定を行います。具体的には、PICマイコンを動作させるクロックを外部から供給するのか、内部クロックを使うのか、またそれぞれに対してより詳細な設定を行います。WDTEウォッチドッグタイマー、というものを設定します。この設定をしておくと、PICマイコンがフリーズしてしまったときにPICマイコンを強制的にリセットしてプログラムのはじめから実行することができます。PWRTEパワーアップタイマ、というものを設定します。電源投入直後やリセット直後は、電源の状態やPIC内部の動作状態が不安定になるケースがありますので、安定するまでPICマイコンの動作を停止させておく、というタイマー設定です。MLCREPCとかゲーム機ってハード的なリセットボタンがありますよね。PICマイコンも同様に、スイッチなどの外部ハードウエアからリセット信号を与えることができます。CPDPICマイコンに書き込んだプログラムやデータはPICKit3を使って、MPLABXで読み取ることができます。製品にする場合など、読み取られないようにしたいことがあります。CPではプログラム、CPDではデータの外部からの読み取りをOKにするか禁止するか設定します。BOREN前回のエントリで説明しましたが、ブラウンアウトが発生したときのPICマイコンの動作設定を行います。CLKOUTENPICマイコンのクロック信号を外部に出力する設定です。PICマイコンのクロック信号を外部でも使用したい場合に使用します。IESOクロックを2段階で立ち上げる設定します。一般的に、PICマイコンの内部クロックはすぐにクロック信号が安定しますが、外部からクロックを供給する場合、クロック発生する電子部品は信号が安定するまで意外に時間がかかります。PICマイコンの起動をスムーズにするために、電源投入直後は内部クロックを使用して、ある程度時間が経ったら外部クロックに切り替える、という設定をします。ここで言っている「時間」はミリ秒の世界です。FCMENクロックはPICマイコンを動作させる一番基本的な信号です。この信号がなくなったら動作しなくなります。外部クロックが何かの原因で故障したとき、バックアップとして内部クロックに切り替えることが可能です。ここではこの設定を行います。WRTPICマイコンの中にはいろいろな種類のメモリがあります。プログラム実行時にデータ一時的に記憶しておく「RAM」と呼ばれる領域や、電源を切ってもデータが消えない「EEPROM」と呼ばれる領域があります。これらとは別に、プログラムを書き込む領域もあります。「プログラムを書き込む」ということは、このメモリは書き換えが可能ということですので、プログラムが自分自身を書き換え可能、ということになります。普通はプログラムが書き換えられたら動作しなくなってしまうので困りますよね。一方で、プログラム実行中にこの領域を変更したいケースもあるんです(詳しくは、この設定項目の時に説明します)。この項目は、プログラム領域を保護するかしないかの設定を行います。PLLENこの設定は、クロック周波数を4倍にする設定です。PIC12F1822の内部にあるクロック発生モジュールの最高周波数は8MHzです。この設定をONにすると4倍の32MHzになります。クロック周波数のターボチャージャーといったところでしょうか。STVRENこの項目の説明はなかなか難しいので後ほど詳しく説明します。概要としては、スタック領域が溢れた場合の動作を設定するものです。C言語をある程度学ばれた方であれば、ヒープ領域やスタック領域などという言葉が出てきたと思いますが、ここで設定する「スタック領域」は意味が異なりますので、この項目の説明をお読みいただければと思います。BORV上に出てきた「BOREN」をONに設定した場合のブラウンアウト判断する電圧を設定します。どのくらいまで電圧が下がったらブラウンアウトが発生したと判断するか、その電圧を2段階で設定します。LVPPICマイコンのプログラム記憶領域にプログラムを書き込む瞬間、ちょっと高めの電圧で書き込みを行っています。この電圧制御はPICKIT3が自動的に行っているので普段はあまり気にしなくて問題ありません。自作のプログラム書き込み装置などを作る場合、この高い電圧が用意できないこともあります。そこで、この設定をONにすると、プログラム書き込み電圧をマイコンの電源電圧(この記事で使用するPIC12F1822では5V)と同じにすることができます。PICKIT3を使用する限り、この設定はOFFにします。これだけでもなんかげんなりしますよね。普通に使う分にはお決まりの設定、という感じで毎回悩む必要はありません。以下に典型的な設定例を説明した後、各設定項目の詳細設定の説明をいたします。典型的なコンフィグレーション設定これだけの設定を検討するのはなかなか大変そうですが、一般的な使い方であればだいたいこうなるよね、という感じの設定があります。そこで、PIC12F1822を以下の条件で使用する場合の典型的なコンフィグレーション設定を説明します。プログラム書き込みはPICKIT3を使用クロックは内部クロックモジュールを使用(外部クロックを使用する場合、使用できるピンが1本か2本減ってしまいます。OFF使用しないこの設定を基本形として、必要な機能を実装するときに、このコンフィグレーション設定をどうすべきか、考えてみるのがよいと思います。それでは、それぞれの項目について詳しく説明します。FOSC(クロック設定)は重要ですのでかなり詳細に説明しますが、その他の項目の説明は入門的な範囲にとどめますのでご了承ください。FOSC(クロック設定)今まで何度か説明してきましたが、PICマイコンも含めて、世の中のプロセッサはクロック信号を元に動作します。FOSC設定では、PICマイコンを動作させるためのクロックの種類についての設定を行います。大きく分けて、外部からクロック信号を供給するか、PICマイコン内部に内蔵しているクロック発生モジュールを使用するか、の設定です。それぞれに対していろいろと細かい設定値が用意されています。今後いろいろなPICマイコンの回路図を見ることになると思います。その際、クロックについてはいろいろな形態がありますので、この設定は一通り読まれておいた方がよいと思います。長くなるかもしれませんが、FOSC設定に関しては詳しく説明しておくことにします。外部からクロック信号を供給する場合、クロック周波数は、そのクロック信号を発生する電子部品により決まります。クロックを発生する部品としては「水晶発振子」というものがあります。ネットの通販サイトなどでこの部品を探してみると、「8MHz水晶発振子」「12MHz水晶発振子」などがあります。USBデバイスを作りたい場合、正確な48MHzの周波数を生成する必要があるので、外部に12MHz水晶発振子をつけ、それを4倍にして(PLLENをONにして)使います。内部クロックを使う場合は、FOSCでは「内部クロックを使用する」という設定のみ行い、クロック周波数はプログラム(main関数の中など)で設定します。基礎編では内部クロックを使用しており、そのクロック周波数を1MHzに設定しますが、この設定はmain()関数の中で行っています。プログラムを掲載していますので気づかれた方もいらっしゃるかもしれませんね。ところで、クロック周波数の設定はマイコンの設定に関わるものなのだから、設定はプログラムの中で設定するというより、コンフィグレーション部分で行うのが妥当ではないか、と思われた方もいるかもしれません。クロック周波数はプログラムで実行途中に変更することができます。この背景を説明します。クロック周波数が高い(=早く動作する)と、プロセッサの消費電力は大きくなります。PICマイコンの場合、テレビやエアコンなどのリモコンに使われることもありますが、リモコンはいつも使っているわけではないので、使っていないときは消費電力は抑えたいですよね。このようなときのためにプログラム中で周波数を変更できるようになっています。リモコンの場合、ボタンが押されていないときは周波数を低くして待機、ボタンが押されたことを検知したら周波数をあげてリモコン信号を発生させる、などという使い方です。PICマイコンを始めとする、マイコンを使って電池動作させる機器を作る場合、このようにクロック周波数を制御して電池を長持ちさせる、というテクニックがあります。FOSC設定(クロック設定)の具体的な設定値を説明する前に、クロック信号を発生させるための電子部品やクロック信号、PIC12F1822のクロックに関するピンなどを説明します。PICマイコンの外部からクロック信号を供給する場合、クロック信号を発生させるための電子部品としては「水晶発振子(一般名)」や「セラロック(商品名)」というものがあります。水晶発振子は以下のようなものです。水晶発振子(20MHz)10個入り400円程度ですので、1個40円ぐらいです。個人で使用する分にはこんなもんか、と思われるかもしれませんが、製品として量産する場合、この金額は結構高いものとなります(大量購入の場合はもっと安くなりますがそれでも高い)。後でコストの観点で違う部品も出てきますので、この値段を参考として頭の隅に置いておいていただければと思います。水晶発振子の仕組みですが、水晶を薄く削り、その両側に電極をつけて電圧をかけると水晶が振動する性質を利用しています。薄ければ薄いほど高い周波数が得られますが、薄くするには限界があり、また薄くするほど発振周波数を調整するのが難しくなってくるので、あまり高い周波数には向いていません。水晶発振子単体では発振せず、コンデンサを外付けする必要があります。水晶発振子の電子回路記号は以下です。なんとなく、水晶を電極で挟んだ感じが出ていますよね。発振させるには、コンデンサを以下のように接続します。ひとつのクロック信号発生電子部品としてセラロックがあります。セラロック(20MHz)こちらも1個40円程度です。こちらは水晶の代わりにセラミックを使っています。圧電性セラミック、というものに電圧をかけると水晶と同様に振動するため、この性質を利用しています。水晶発振子と違って、コンデンサを内蔵しているため、後からコンデンサを外付ける必要はありません。電子回路記号ですが、セラロック専用の回路記号はないようで、以下のような書き方をよく見かけます。ようするに水晶発振子に外付けコンデンサをつけたものと同じで、それらを四角で囲ってあり、回路図に「セラロック」と書かれていることもあります。ところで、電子工作やコンピュータに興味がある方でしたら、もしかしたらクロック信号について書籍などで見かけたことがあるかもしれません。こんな感じの信号です。このような形の信号を「矩形波」あるいは「方形波」と呼びます。先ほど説明した水晶発振子やセラロックが発生する信号はこのような形ではありません。実際には以下のような形です。このような形の信号を「正弦波」あるいは「サイン波」と呼びます。外部からPICマイコンにクロック信号を水晶発振子やセラロックで供給する場合、このような正弦波を供給することになります。PICマイコンが動作するには矩形波のクロック信号を必要となるため、内部でこの正弦波を矩形波に整形(変換)しています。この整形(変換)する回路ですが、周波数によって最適な回路特性が異なります(増幅器の利得の値が異なる)。この回路特性が異なる、という点についても設定値の説明にちょっとだけ出てきますので、こちらも頭の片隅に置いておいてください。次にPIC12F1822のクロックに関するピンを説明します。詳しくはPIC12F1822のデータシートに説明されていますが、クロックに関する機能は、以下のように割り当てられています。クロックに関するピンは2番ピンと3番ピンになります。当然ながら、内部クロックを選択した場合はこれらのピンにクロックを発生する部品を接続する必要はなく、入出力ピンなどに利用できます。外部からクロックを供給する場合は、これらのピンに電子部品を接続することになります。それぞれ、複数の名前が振られていますが、FOSCで設定を行うことにより、各ピンの役割が決まります。それでは、PIC12F1822に外部クロックを接続する形態を一通り説明します。後でFOSCに設定する値を説明するときにわかりやすいように番号をつけておきます。これらの接続形態はほとんどのPICマイコンに共通ですので、他のマイコンを使われる際にも参考にしてみてください。それではこれから一通りの接続形態について説明します。[接続形態1]まずはじめの接続形態は、水晶発振子あるいはセラロックを接続する方法です。FOSCにこの接続形態を指定した場合、2番ピンはOSC1ピン、3番ピンはOSC2ピンとなります。”OSC”は発振素子、Oscillatorの略です。OSC1とOSC2の数字にあまり意味はなく、要するに発振素子の2本の線をこの2つのピンに接続すればOKです。接続方法は以下の回路図のようになります。この場合、2番ピンと3番ピンは外部クロック発生素子に占有されてしまいますよね。2番ピンと3番ピンはそれぞれ入出力ピンなどの用途には使えなくなることになります。[接続形態2]次の接続形態は、抵抗とコンデンサを接続する方法です。接続方法について以下の回路図を見てみましょう。接続形態1と異なり、外部からクロック供給するために2番ピンしか使用していませんよね。3番ピンは余りますので、普通に考えたら、入出力ピンとして使用することができそうですよね。使用することができます。この接続形態の場合、3番ピンは別の役割のピンに設定することもできます。以下の2通りの設定ができることになります。(3番ピンをCLKOUT(クロック出力)として使用する場合)なおこの接続形態は、水晶発振子より精度(温度による変化など)は劣りますが、コストを抑えたい、ということきに使われます。先ほど、水晶発振子やセラロックは40円ぐらいでした。この回路は、抵抗が1円程度、コンデンサも5円〜10円ですからかなりコストを抑えることができます。[接続形態3]次の接続形態は、2番ピンに整形された矩形波を入力する方法です。外部で矩形波の波形のクロック信号がある場合、その信号をこの番ピン(CLKINピン)に入力することができます。こちらも接続形態2と同様、クロック入力ピンとして2番ピンしか使用しません。接続形態2-2では、3番ピンはクロック信号出力ピンとして設定できましたよね。この接続形態ではすでに入力しているクロック信号は矩形波で整形されたものですので、それをCLKOUTピンからあえて出力する必要はありません。そのため、この接続形態の場合、3番ピンはGP4として入出力ピンとして使用することになります。[内部クロック]以上が外部からクロックを供給するときの接続形態ですが、内部クロックを使用する場合でも、2通りの設定が可能になっています。3番ピンを入出力ピンとして使用するか、クロック信号出力ピンとして使用するかの設定です。2番ピンはクロックの入力に使用されませんので、入出力ピンとして使用できます。内部クロックを使用する場合にこの値を設定します。この値を設定すると、2番ピンと3番ピンは入出力ピンとして使用できます。精度はそれほどよくありません。接続形態1で外部クロック周波数が4MHz〜20MHzの場合、FOSCにこの値を設定します。接続形態1の場合、HS/XT/LPのいずれかを指定しますが、これは先に説明したように、PICマイコン内部の回路特性の設定を変えるためです。以下、XT/LPについても同じです。接続形態1で外部クロック周波数が4MHz以下の場合にこの値を設定します。接続形態1で外部クロック周波数が32.768kHzの場合にこの値を設定します。これは時計用の32.768kHzの水晶発振子を使用するときに設定します。接続形態2の場合にこの値を設定します。Enable)で設定します。接続形態3の場合で、クロック周波数が4MHz〜32MHzの場合にこの値を設定します。接続形態3の場合で、クロック周波数が500kHz〜4MHzの場合にこの値を設定します。接続形態3の場合で、クロック周波数が500kHzまでの場合にこの値を設定します。基礎編と応用編では、内部クロックを使用します。INTOSCIOと設定を記述することになります。HSと設定することになります。ところで、クロック発生の形態がいろいろと出てきました。どれを選択すればよいのでしょうか。実はベストなものはなく、一長一短ですので、用途に合わせて選択することになります。一長一短とは、精度を高めると部品コストが高くなったり、という感じです。個人で使用する場合は、10円、20円のものがコストが高くなると言っても50円とかになる程度ですので、あまり関係ないかもしれませんね。時計などを作る場合、クロック周波数が不正確ですと、時刻も不正確になります。このような時は、内部クロックやRC発振に比較して、精度が高くて温度に対して比較的安定している水晶発振子を使った外部クロックが適しています。デメリットとしてコストが高いことがあります(といっても30円〜40円程度だったりしますが)。そのため、あまり精度や安定性が必要でない場合は、内部クロックやRC発振を使ったほうがよい、ということになります(といっても10円、20円を節約する程度ですが)。これから1秒に1回発光ダイオードを点滅させる回路とかタイマー回路など、時間に関する回路を作っていきますが、何十時間も動かすことは想定していないことと、回路を簡単にすることから、内部クロックを使っています。1日以上などの長時間を計測する場合は、クロック回路を見直す必要があります。補足ですが、FOSCの設定がLPの場合、時計用の水晶発振子で、その発信周波数は32.768kHz、となんだか中途半端な数字に見えますよね。この32.768kHzというのは、マイコンでは非常に扱い易い数字なんです。32.768kHzは、1kHzが1000Hzですので、32768Hz、ということになります。1秒間に32768回振動する、ということです。時計を作る場合、クロック信号を32768回数えたら1秒、ということになります。この32768、という数字は、実は2の15乗となっています。16進数で表すと0x8000、2進数では0b1000000000000000になります。shortを用意して、最上位ビットが1になったら1秒、ということでとても扱い易い数字(周波数)となっています。