今回は、プログラムの中のPICマイコンのコンフィグレーション部分を説明します。して以下のリンクに公開しています。発光ダイオード点滅回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分の、プログラム作成のステップになります。発光ダイオード(LED)を電池と抵抗のみで光らせる回路を組むPICマイコンの回路を組む前に、まずは電池、抵抗、発光ダイオードのみを使って、ブレッドポード上に回路を組んで発光ダイオードを光らせてみます。ここでは電池、抵抗、発光ダイオードの回路記号、回路図と、回路図からブレッドボードに組む方法を説明します。PICマイコンのベース回路を組むはじめの一歩の回路は、発光ダイオードを1秒に1回光らせるだけの回路です。プログラムを作る発光ダイオードを1秒に1回光らせるプログラムを作成します。PICマイコンに書き込んで動作させる作成したプログラムをPICマイコンに書き込んで動作させてみます。発光ダイオードの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまでは発光ダイオードを光らせる、という出力制御をしましたが、PICマイコンで外部から信号を入力する方法を確認します。ベース回路にブザーを追加スイッチ付きの1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーを作ってみます。今回はプログラムのPICマイコンコンフィグレーション設定部分を説明します。このコンフィグレーション設定部分では、PICマイコンの基本動作関連の設定を行います。「基本動作」って言われても何のことかわかりませんよね。この設定のすべての項目の説明は後ほど行いますが、例えば以下のような設定を行います。軽くイメージをつかんでいただければと思います。[クロック設定]例えばMacOSXの左上Appleメニューから「このMacについて」というメニューを選択するとこんなダイアログが表示されますよね。このダイアログの「プロセッサ」と書いてあるところに「2.8GHz」とありますが、これはこのMacのCPUクロック周波数が2.8GHz、ということを意味しています。CPUはこのクロックをタイミングとして処理を進めていきます。クロック周波数が高いほど処理速度が高くなります。PICマイコンもクロックをタイミングとして処理を進めていきます。このクロックをPICマイコンにどのように供給するのか、その方法として2通りあります。PICマイコンの外部にクロック信号を発信する電子部品用意して、PICマイコンのクロックのピンにそれをつなげる方法(外部供給方法)と、PICマイコン内部のクロック発振器を使う方法(内部供給方法)です。この「クロック設定」では、クロックをどのように供給するかを設定します。内部クロックを使用する、などという設定を行います。[ブラウンアウト設定]PICマイコンは3.3Vや5Vで動作しますが、何かの原因で電源電圧が低くなることがあります。それは電源の故障だったり、電源の電池がなくなってきたときなどです。このように電源の電圧が低くなってくると、PICマイコンの動作が不安定になってきます。以前説明しましたが、発光ダイオードの点滅制御などでは、点滅がおかしくなる程度で済みますが、モーター制御している場合などは危ない動作になる可能性もあります。電源の供給電圧が低くなることをブラウンアウトと呼び、この「ブラウンアウト設定」では、ブラウンアウトが発生したときに、例えばPICマイコンの動作を一時停止する、などの設定を行います。非常におおざっぱですが、このコンフィグレーション設定部分でどんな感じの設定をするかイメージつかめていただけたでしょうか。他にもいろいろ設定がありますが、この後すべてを詳しく説明していきます。説明するコンフィグレーション設定は、PIC12F683のものですが、もちろん他のPICマイコンでも同様の設定があります。すべてのPICマイコンでこれらの設定項目が同じ、というわけではありません。高機能のPICマイコンになると、これ以外にも設定項目が追加されていたりします。PIC12F683の設定項目はどのPICマイコンにも見られる基本的なものですので、是非一通り確認いただければと思います。それでは早速、それぞれのコンフィグレーション設定項目を説明します、といきたいところですが、その説明する前に#pragmaについて説明します。INTOSCIOという記述がありますよね。返し構文(while文、for文)条件判断構文(if文、switch文)2進数、16進数これらの項目については予め確認しておいてください、と書いていました。そのためプログラムの説明では、これらの項目は知っているものとして説明をしてきました。ついてはC言語入門の部分ではあまりでてこないのですが、PICマイコンのプログラムではコンフィグレーション設定に使用されています。XCコンパイラを使う限り、どんな簡単なプログラムでも避けて通れない構文となっています。ついてここで詳しく説明しておきます。この#pragmaは、難しく言うと、特定のコンパイラや特定の統合開発環境に特化した命令を記述するための指示子ということになります。働きのイメージをつかんでいただければと思います。INTOSCIOという文をどのように解釈するか説明します。XC8コンパイラはコンパイル時に、”#pragma”という文字列を見つけると「自分向けに特化して書かれた何かが、このあとに書かれているかもしれない」と判断します。いう文字列を見つけると、「あ〜、configね。configってことは、PICマイコンのコンフィグレーション設定をしたいんだね。[設定値]とかかれているはずだから、その後もみてみよう」と判断していきます。INTOSCIOと書かれているので、FOSC(クロック設定)はINTOSCIO(内部クロック)に設定する、という処理を行います。INTOSCIO”というXCコンパイラ向けの記述があるソースコードを他のコンパイラでコンパイルしたらどうなるのでしょうか。MacOSXやiOSのアプリを開発するXcode上で、ソースコードにこの記述をしてビルドしてみると、、、何も起こりません。Xcodeでビルドを実行すると、裏ではLLVMというコンパイラがプログラムをコンパイルします。見つけると、自分宛に特別な何かが書かれているかもしれない、と判断します。#pragmaの次を見ると、config、とありますが、LLVMコンパイラはこのconfigは何のことか知りません。そこで、この記述は他のコンパイラ向けに書かれたものなんだな、と判断してこの記述は無視する、という動作をします。後に書かれている文字列が、自分が理解できない場合、エラーにするコンパイラもあります。(次の説明でこの例がでてきます)次に統合開発環境の例です。PICマイコン関係から外れてしまいますが、MacOSXやiOSアプリを開発するための統合開発環境、Xcode(特定の統合開発環境)の具体例を説明します。サンプルとして、function_a()、function_b()、function_c()とmain()関数があるプログラムを作ります。以下のような感じです。このサンプルでは、各関数は何もないので非常に短く、スクロールしなくても全体のプログラムを表示できてしまいますが、もしこのプログラムが非常に長い場合に、例えばfunction_c()を編集したい場合、いちいちfunction_c()が表示されるまでスクロールするのは大変ですよね。そこで、一発でfunction_c()の部分を表示するショートカットがあります。ここでfunction_c()を選択すると、function_c()の部分が表示されます。(実際はすでに表示されていますので何も変化がありませんが)ところで、この関数の数か多くなってくると、このメニューの表示項目数も増えて、メニューから探すのすら大変になるかもしれませんよね。そこで、関数を分類しておくことができます。function_a()、_b()、_c()を「ユーティリティ関数」、main()を「メイン関数」と分類しておきたいとします。[分類名]と記述します。以下のように記述してみます。–も記述しておきました。markで指定した「ユーティリティ関数」という文字列が表示されます。markで指定した「メイン関数」という文字列が表示されます。「メイン関数」の一つ上に区切り線が入っています。この#pragmaの使い方は、始めに説明したXCコンパイラとはちょっと違いますよね。XCコンパイラはコンパイルするときに、その過程で#pragmaを見つけると、特定の処理をしていました。Xcodeでは、コンパイルを指示したときではなく、随時#pragmaが認識されています(正確にいうと、裏でLLVMが部分コンパイルしてその結果をXcodeがもらってこのように処理しています)。mark、という記述は、Xcodeが関数ジャンプメニューを表示するときに、メニューに分類文字列を表示するために使用されている構文です。markという記述をMPLABX上で記述してビルドすると、エラーになります。MPLABX(XC8コンパイラ)は、#pragmaの後の文字列が解釈できないと、エラーにする、という仕様のようです。余計な説明が多かったですが、#pragma、というのは特定のコンパイラや特定の統合開発環境に対して、それらに特化した特定の処理を指示する、ということがおわかりいただけたでしょうか。