第20回 コンフィグレーション設定 (2)

今回はコンフィグレーション設定について詳しく解説します。

今回の説明

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

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

 

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

前回 #pragma config の意味を説明しましたので、あとは各設定項目を説明するだけです。「だけです」と書いてしまいましたが、今回説明するプログラムの中で、このコンフィグレーション設定部分の理解が一番大変だと思います。なるべくわかりやすく説明するよう心がけますが、うまく説明できないところもあると思いますので、わからないことなどありましたらコメントかお問い合わせフォームからご質問いただければと思います。

コンフィグレーション設定は、以下のフォーマットで記述します。

#pragma config [設定項目] = [設定値]

例えば、前回説明しましたクロックに関する設定は、

#pragma config FOSC = [設定値]

のように記述します。[設定値]については、それぞれの設定項目で設定できる値が決まっていますので、これから順に説明していきます。

ところで、各設定項目を詳しく説明すると、かなり長くなりますので、最初に概要を説明します。かなり数が多くてげんなり、って感じもしますが、この段階で全部理解する、というより、まずはざっとどんなものがあるのか、ご確認いただければと思います。

これだけでもなんかげんなりしますよね。ただ、普通に使う分にはお決まりの設定、という感じで毎回悩む必要はありません。以下に典型的な設定例を説明した後、各設定項目の詳細設定の説明をいたします。

 

典型的なコンフィグレーション設定

これだけの設定を検討するのはなかなか大変そうですが、一般的な使い方であればだいたいこうなるよね、という感じの設定があります。

そこで、PIC12F1822を以下の条件で使用する場合の典型的なコンフィグレーション設定を説明します。

このような使い方であれば、以下の設定内容で問題ありません。

設定項目 内容 設定値
FOCS クロック設定 INTOSC
内部クロック使用
WDTE ウォッチドッグタイマー OFF
使用しない
PWRTE パワーアップタイマー ON
使用する
MCLRE リセット信号設定 OFF
使用しない
CP プログラム読み出しプロテクト OFF
読み出し可
CPD データ読み出しプロテクト OFF
読み出し可
BOREN ブラウンアウト時動作設定 ON
ブラウンアウト時リセット
CLKOUTEN クロック信号出力 OFF
クロック信号は出力しない
IESO 起動時クロック切り替え OFF
切り替えしない
FCMEN 外部クロック故障時切り替え OFF
切り替えしない
WRT プログラムメモリプロテクト OFF
プロテクトしない
PLLEN PLL(クロック4倍) OFF
クロックはそのまま使用
STVREN スタックオーバフロー時動作 OFF
何もしない
BORV ブラウンアウト電圧 LO
低い電圧
LVP 低電圧プログラム書き込み 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円ぐらいです。個人で使用する分にはこんなもんか、と思われるかもしれませんが、製品として量産する場合、この金額は結構高いものとなります(大量購入の場合はもっと安くなりますがそれでも高い)。後でコストの観点で違う部品も出てきますので、この値段を参考として頭の隅に置いておいていただければと思います。

水晶発振子の仕組みですが、水晶を薄く削り、その両側に電極をつけて電圧をかけると水晶が振動する性質を利用しています。薄ければ薄いほど高い周波数が得られますが、薄くするには限界があり、また薄くするほど発振周波数を調整するのが難しくなってくるので、あまり高い周波数には向いていません。また、水晶発振子単体では発振せず、コンデンサを外付けする必要があります。

水晶発振子の電子回路記号は以下です。

Crystal osc

なんとなく、水晶を電極で挟んだ感じが出ていますよね。発振させるには、コンデンサを以下のように接続します。

Crystal osc connection

もうひとつのクロック信号発生電子部品としてセラロックがあります。

セラロック(20MHz)

こちらも1個40円程度です。ちょっと高めです。こちらは水晶の代わりにセラミックを使っています。圧電性セラミック、というものに電圧をかけると水晶と同様に振動するため、この性質を利用しています。また水晶発振子と違って、コンデンサを内蔵しているため、後からコンデンサを外付ける必要はありません。電子回路記号ですが、セラロック専用の回路記号はないようで、以下のような書き方をよく見かけます。ようするに水晶発振子に外付けコンデンサをつけたものと同じで、それらを四角で囲ってあり、回路図に「セラロック」と書かれていることもあります。

Ceralock

ところで、電子工作やコンピュータに興味がある方でしたら、もしかしたらクロック信号について書籍などで見かけたことがあるかもしれません。こんな感じの信号です。

Wave square

このような形の信号を「矩形波」あるいは「方形波」と呼びます。しかし、先ほど説明した水晶発振子やセラロックが発生する信号はこのような形ではありません。実際には以下のような形です。

Wave sine

このような形の信号を「正弦波」あるいは「サイン波」と呼びます。外部からPICマイコンにクロック信号を水晶発振子やセラロックで供給する場合、このような正弦波を供給することになります。PICマイコンが動作するには矩形波のクロック信号を必要となるため、内部でこの正弦波を矩形波に整形(変換)しています。この整形(変換)する回路ですが、周波数によって最適な回路特性が異なります(増幅器の利得の値が異なる)。この回路特性が異なる、という点についても設定値の説明にちょっとだけ出てきますので、こちらも頭の片隅に置いておいてください。

次にPIC12F1822のクロックに関するピンを説明します。詳しくはPIC12F1822のデータシートに説明されていますが、クロックに関する機能は、以下のように割り当てられています。

Pic12f1822 clock related pins

クロックに関するピンは2番ピンと3番ピンになります。

当然ながら、内部クロックを選択した場合はこれらのピンにクロックを発生する部品を接続する必要はなく、入出力ピンなどに利用できます。

外部からクロックを供給する場合は、これらのピンに電子部品を接続することになります。それぞれ、複数の名前が振られていますが、FOSCで設定を行うことにより、各ピンの役割が決まります。それでは、PIC12F1822に外部クロックを接続する形態を一通り説明します。後でFOSCに設定する値を説明するときにわかりやすいように番号をつけておきます。

なお、これらの接続形態はほとんどのPICマイコンに共通ですので、他のマイコンを使われる際にも参考にしてみてください。

それではこれから一通りの接続形態について説明します。

[接続形態1]
まずはじめの接続形態は、水晶発振子あるいはセラロックを接続する方法です。FOSCにこの接続形態を指定した場合、2番ピンはOSC1ピン、3番ピンはOSC2ピンとなります。”OSC”は発振素子、Oscillatorの略です。OSC1とOSC2の数字にあまり意味はなく、要するに発振素子の2本の線をこの2つのピンに接続すればOKです。

接続方法は以下の回路図のようになります。この場合、2番ピンと3番ピンは外部クロック発生素子に占有されてしまいますよね。つまり、2番ピンと3番ピンはそれぞれ入出力ピンなどの用途には使えなくなることになります。

Pic12f1822 clock generation crystal

[接続形態2]
次の接続形態は、抵抗とコンデンサを接続する方法です。まずは接続方法について以下の回路図を見てみましょう。

Pic12f1822 clock generation rc

接続形態1と異なり、外部からクロック供給するために2番ピンしか使用していませんよね。3番ピンは余りますので、普通に考えたら、入出力ピンとして使用することができそうですよね。もちろん使用することができます。ただこの接続形態の場合、3番ピンは別の役割のピンに設定することもできます。以下の2通りの設定ができることになります。

・接続形態2-1 (3番ピンを入出力ピンとして使用する場合)

Pic12f1822 clock generation rc ra

・接続形態2-2 (3番ピンをCLKOUT(クロック出力)として使用する場合)

Pic12f1822 clock generation rc clkout

なおこの接続形態は、水晶発振子より精度(温度による変化など)は劣りますが、コストを抑えたい、ということきに使われます。先ほど、水晶発振子やセラロックは40円ぐらいでした。この回路は、抵抗が1円程度、コンデンサも5円〜10円ですからかなりコストを抑えることができます。

[接続形態3]
次の接続形態は、2番ピンに整形された矩形波を入力する方法です。例えばすでに外部で矩形波の波形のクロック信号がある場合、その信号をこの番ピン(CLKINピン)に入力することができます。

Pic12f1822 clock generation clock in

こちらも接続形態2と同様、クロック入力ピンとして2番ピンしか使用しません。接続形態2-2では、3番ピンはクロック信号出力ピンとして設定できましたよね。でも、この接続形態ではすでに入力しているクロック信号は矩形波で整形されたものですので、それをCLKOUTピンからあえて出力する必要はありません。そのため、この接続形態の場合、3番ピンはGP4として入出力ピンとして使用することになります。

[内部クロック]
以上が外部からクロックを供給するときの接続形態ですが、内部クロックを使用する場合でも、2通りの設定が可能になっています。3番ピンを入出力ピンとして使用するか、クロック信号出力ピンとして使用するかの設定です。

なお、2番ピンはクロックの入力に使用されませんので、入出力ピンとして使用できます。

 

FOSCの設定値

さて、以上でFOSCに設定する値の必要な情報を説明しましたので、以下にFOSCに設定する値についてまとめます。

設定値 設定内容
INTOSCIO 内部クロックを使用する場合にこの値を設定します。この値を設定すると、2番ピンと3番ピンは入出力ピンとして使用できます。ただし精度はそれほどよくありません。
HS 接続形態1で外部クロック周波数が4MHz〜20MHzの場合、FOSCにこの値を設定します。接続形態1の場合、HS/XT/LPのいずれかを指定しますが、これは先に説明したように、PICマイコン内部の回路特性の設定を変えるためです。以下、XT/LPについても同じです。
XT 接続形態1で外部クロック周波数が4MHz以下の場合にこの値を設定します。
LP 接続形態1で外部クロック周波数が32.768kHzの場合にこの値を設定します。これは時計用の32.768kHzの水晶発振子を使用するときに設定します。
RC 接続形態2の場合にこの値を設定します。なお、3番ピンを入出力ピンとして使用するか(接続形態2-1)、クロック出力ピンとして使用するか(接続形態2-2)は、コンフィグレーション設定のCLKOUTEN(Clock-out Enable)で設定します。
ECH 接続形態3の場合で、クロック周波数が4MHz〜32MHzの場合にこの値を設定します。
ECM 接続形態3の場合で、クロック周波数が500kHz〜4MHzの場合にこの値を設定します。
ECH 接続形態3の場合で、クロック周波数が500kHzまでの場合にこの値を設定します。

基礎編と応用編では、内部クロックを使用します。

#pragma config FOSC = INTOSCIO

と設定を記述することになります。また、他の例としては、12MHzの水晶発振子をを使用して外部からクロックを供給する場合は、

#pragma config FOSC = 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になります。32768まで数えたかどうかは、2バイトの変数、つまりunsigned shortを用意して、最上位ビットが1になったら1秒、ということでとても扱い易い数字(周波数)となっています。実際、この32.768kHzの水晶発振子は、時計用として売られていますし、クオーツ時計にはこの周波数の水晶発振子が内蔵されています。

時計用水晶発振子

残りの設定項目は次回の記事で説明します。

 

更新履歴

日付 内容
2016.9.18 新規投稿
2018.11.24 誤記訂正