超入門 PICマイコンの使い方

はじめに

電子工作の記事を見ていると、マイコンを用いた製作例が良く登場します。 以前はマイコンを扱うとなると、それなりの動作原理の理解と製作が必要でしたが、 最近は「ワンチップ・マイコン」のおかげで気軽に製作できる時代になりました。 そこで、ワンチップ・マイコンの1つである「PIC」を例として、PICを用いての開発手順、 ソフト導入など、一連の流れについて解説します。 これをきっかけとしてPICに親しんでいただければ幸いです。

必要な開発用ソフトMPLAB IDEをダウンロードする。(無料)

必要な機材、部品

PICライタ、ブレッドボード、ジャンプワイヤ、PICなど

開発手順

開発手順

以下、それぞれの項目について、詳しく解説します。

そもそもPICとは?

パソコンとマイコン

PICは「ピック」と発音し、マイコンの一種です。
マイコンはmicro computerの略で「超小型コンピュータ」を意味するものですが、 近年はさまざまな機器の制御用としての マイクロコントローラ(micro controller)の意味合いが強く、 家電品のエアコン、炊飯器、電気ポットなどにも使われています。
例えばパソコンはワープロ、TVチューナー、各種アプリケーションソフトなどで、 汎用的に便利に使うことが出来ますが、「LEDを点滅させる」ことを 簡単に行うことはむずかしいものです。これに対しマイコンを用いると 簡単に安くLEDを点滅させることが出来ます。

マイコンの役割、用途



パソコンはテレビも見れて画像編集などができるが、LED点滅などを簡単に行うことが難しい。


マイコンの役割、用途


マイコンは汎用的な使い方には向いていないが特定の用途(制御)が得意


また、部屋の温度を測定し表示させることなどはパソコンでも可能です。
しかし、温度測定のためにわざわざパソコンを用いると価格が高くなり、 このような用途には不向きです。
そこで、「LEDを点滅させる」、「温度を測る」などの特定用途の制御に用いるのが マイコンの仕事(役目)です。

PICはワンチップ・マイコン

PICもマイコンの一種でマイクロチップテクノロジー社の製品です。
PICはPeripheral Interface Controller の略で「ピック」と発音します。 直訳すると、Peripheralは「周辺機器」、Interfaceは「接続部分」ですから、 「周辺機器の接続部分を制御する」ものです。

外観は写真1のようにさまざまでそれぞれ機能、性能が異なり、用途によって選択します。

※PICマイコンの各種ラインナップ
半導体:マイコン:PICマイコン各種

picの外観

図2はPICの内部構造(概略)です。
 (CPU) Central Processing Unit の略で「中央処理装置」と訳されます。 この部分がマイコンの中心部で、プログラムを実行します。
 (プログラムメモリ) このメモリにプログラムを入れ、この事を「書き込む」と言います。 プログラムは何度も書き換えることが出来、電源をOFFしても プログラム内容は保持されます。 プログラムの書き換えは後述する「PICライタ」で行います。
なお、新品のPICにはプログラムは書き込まれていません。 必要な機能(動作)となるようにプログラムを作成し、PICライタ で書き込みます。
 (データメモリ) プログラム中に計算結果などを一時的に保存したい場合に 自由に利用できるメモリと、各機能の設定を決めるメモリが この部分に入っています。
 (入出力制御、タイマ、その他機能) PICに入力されたパルス数をカウントしたり、 一定時間の生成(タイマ)を行うなどの機能があり、 型番によってはADコンバータなどの機能が入っています。

以前は図2のような各ブロック(CPU、プログラムメモリ、・・・)がそれぞれ1個の ICになったものを基板上で接続したものをマイコンボードと言っていました。
現在はこれらの各ブロックを1つのICに収めたものを「ワンチップ・マイコン」と呼び、 PICはワンチップ・マイコンの1つです。(図3)

PICの概略内部構造 マイコンボードとワンチップ・マイコン(PIC)

PICの用途

写真1のようにPICは色々なピン数がありますが、 ピン数が多いほど相手側と接続できる数が多くなります。
ただし、図4のようにLEDを1個(または複数)接続するような場合、 8ピンのPICで間に合いますし、小型に仕上がります。

LED点滅の最小構成例

また、図5はソーラーパネルの電気を鉛蓄電池に溜めて、 夜間にソーラーパネルが使えない時に非常用電源として用いた例で、 これも8ピンPICで制御可能です。
8ピン以外にもピン数の多いもの、高機能のものもありますので、 用途に応じて使い分けます。

ソーラーパネルと充放電制御

PIC開発に必要なもの

図6にプログラム開発に必要なものを示します。

PIC開発に必要なもの

MPLAB IDE

統合開発環境(IDE:Integrated Development Envirronment)と呼ばれるソフトウェアで マイクロチップ社からダウンロードします。(無料)
統合開発環境という少しむずかしい言葉ですが、簡単に表現すると以下の機能を このソフトウェアで行います。
 ①プログラムを書く
 ②PICに書き込むためのデータに変換する
 ③PICライタにプログラム(データ)を書き込む
 ④パソコン上(MPLAB IDE)で動作確認などのシミュレーションが出来る
④以外にもさまざまな機能があります。 上記①~③が開発に必要な最小限の機能で、慣れないうちはこの機能操作で十分です。

PICライタ

PICはプログラムを格納するための「プログラムメモリ」を内蔵しています。 新品のPICはプログラムメモリにはプログラムが書き込まれていませんので、 PICライタを用いて書き込みます。 また、プログラムを変更、修正したい場合にもその都度PICライタにより書き換えます。 マイクロチップ社から何種類か販売されていて、これは購入します。 他社からも完成品またはキットが販売されていますが、マイクロチップ社のPICライタであれば MPLAB IDEでのプログラム書き込みメニューからPICライタ型番を簡単に選択して 書き込むことが出来ます。 写真2に製品例を示します。

PICライタの製品例
型番 品名 メーカー 値段
PICライターキット キットで遊ぼう電子回路 PICライターキット アドウィン
アドウィン社の学習キットである「キットで遊ぼう電子回路 PIC入門」で使用しているPICライタです。ゼロプレッシャーソケット採用なので、DIPパッケージのPICを簡単に抜き差しできます。ただし、対応品種が少なく、ICSP非対応です。
PIC-WT-AP PICプログラマー A+ アドウィン ¥7,600 (税抜)
上記のPICライターキットに、ICSP機能を追加したモデルです。
PG164130 pickit3単体 Microchip ¥5,450 (税抜)
PICマイコンの製造元であるMicrochip社の純正ツールです。基板にPICマイコンを搭載したままで書き込みを行うICSP(In Circuit Serial Programming)に対応しています。ブレッドボードなどを使えば、簡易的なDIP版PIC用ライタとしても使用できます。簡単なデバッグ作業にも対応しています。純正ツールなので対応デバイスも豊富で、新しいデバイスへの対応も早く、価格も手ごろなので入門用としては最適です。
上記のPICkit3に、PIC18F45K20を搭載したデモボード付きのキットです。PICマイコンの開発を初めて行う方などは、あらかじめボードが用意されたパッケージ品を使うと良いでしょう。
DV164035 インサーキットデバッガ Microchip ¥23,625 (税抜)
ICSPによる書き込みのほか、本格的なデバッグにも対応するインサーキットデバッガ(ICD)です。プログラムを任意の場所で停止したり、内部メモリの状態を動作中に読み込んだり、マイコンの挙動すべてを把握することができます。

ブレッドボード

電子工作は「はんだ付け」が基本です。ただし、PICのような小規模のマイコンでの動作確認には 「ブレッドボード」を用いると便利です。ブレッドボードは「はんだ付け」する必要が無く、 簡単に回路を作ることが出来ます。
写真3のように「ジャンプワイヤ」という線を用いて接続します。

ブレッドボードによる製作例

開発手順の概要

図7に開発手順の概要を示します。

開発手順

プログラムを書く

マイコンで、ある仕事(例えば、LEDを点滅させる)をさせたい時、 その作業手順を細かく指示する必要があります。
1つ1つの作業の最小単位を「命令」と言い、「LEDを点滅する」という命令はありません。
このようなLEDを点滅させるなどの仕事の作業手順を「プログラム」と言い、 一連の作業を「プログラミング」と言います。

機械語



図8のようにマイコンは1と0の世界です。 命令も1/0の組み合わせで、 これを機械語(マシン語)と言います。 機械語では人間には分かりにくいので 「プログラミング言語」というものを用いて プログラムを行います。
プログラミング言語としては 「アセンブリ言語(アセンブラ)」、 「C言語」などがあります。(図9)
注意:C言語のCはアルファベットのC


アセンブリ言語とC言語

アセンブリ言語

機械語は「00111000・・・」などの1/0のデータですが、 これに文字を対応させて人間が覚え易くしたものです。
例えば CLRF XXX というアセンブラ命令は「XXX番地のメモリの値をゼロにする」という 意味でCLRは「クリヤー」の意味があり、分かり易くなっています。
PICの命令は35個です。 アセンブリ言語は機械語と対応していますので、人間の意図した プログラムがそのまま反映されます。 ただし、命令が少ないので少し複雑な仕事をさせるには 色々な命令を組み合わせてプログラムする必要があります。

C言語

C言語ではPICの命令を直接的に用いないでプログラムし、 図9 b ) のようにさらに人間が楽になるようにした言語の1つです。
例えば図9 b ) の意味は
もし(if)、aaの値が5より小さければbbの値を1にする。
そうでなければbbの値を0にする。

また複雑な数値計算などはC言語の中で用意されているものがあり、 このような用途(プログラム)では特に開発時間を 短縮することができるのも特徴の1つです。
以上、アセンブリ言語およびC言語はそれぞれ特徴がありますが、趣味の電子工作であれば 自分に合ったプログラミング言語を用いれば良く、MPLAB IDEのメニューの中から選択します。 プログラムはMPLAB IDEに付属の「エディタ」と呼ばれるソフトを用いて行います。 エディタとはワープロのようなもので、プログラムの作成、修正、保存などを行い、 保存されたプログラムファイルを「ソース・ファイル」と言います。

アセンブル

人間には分かりやすいアセンブリ言語でプログラムしても、マイコンは機械語で動作します。 そこでマイコンが理解する機械語に変換する必要があり、機械語に変換することを 「アセンブル」と言います。

往路グラムのアセンブル

C言語でプログラムしても機械語に変換する必要があり、この場合「コンパイル」と言い、 機械語に変換するプログラムを「コンパイラ」と言います。
MPLAB IDEではこのコンパイル作業も「ビルド」と言います。

プログラムのアセンブル

アセンブリ言語またはC言語で書いたソースファイルをビルドし、文法にエラーが無ければ PICライタで書き込むためのデータ(プログラム)が自動的に出来上がり、 このデータを「HEX(ヘキサ)ファイル」と言います。
これで書き込むための準備が出来たわけですが、プログラムの文法に間違いがあると 「エラーメッセージ」が出て、メッセージをダブルクリックするとエラーした行に矢印が表示されます。




文法に誤り(elseが正解)があるとエラーになり書き込みデータができない。

このように、プログラムを書いている時点では文法エラーには気がつかないことが ビルドを行うことで分かります。 エラー時はもう一度ソースファイルを修正し再度ビルドを行いエラーが無くなるまで繰り返します。 注意:エラーは、いわゆる「バグ」を指摘してくれるものではありません。

PICライタで書き込み

マイクロチップ社のライタであれば一連の書き込み操作はMPLAB IDEでの 書き込みメニューにより行うことが出来ます。

ソフト開発ツールMPLAB IDEインストール編

次に、ソフト開発に必要なMPLAB IDEのインストールについて解説します。
MPLAB IDEのインストール手順は画面指示に従うだけですが、C言語の場合、C言語で開発したものをマイコンが理解できる機械語に変換する必要があります。
C言語から機械語に変換するソフトを「Cコンパイラ」と言います。 アセンブリ言語の場合も機械語に変換する必要があり、この場合の変換ソフトを 「アセンブラ」と言います。 このアセンブラはMPLAB IDEの場合、「MPASM」と呼ばれ、図14のようにMPLAB IDEを インストールすると自動的(意識しないで)にインストールされます。
Cコンパイラは有料、無料のものがあり、有料のCコンパイラは別途インストールを行い、 MPLAB IDEと統合して用いることになります。 この記事では開発言語にC言語を用い、コンパイラに無料のHI-TECH PRO Liteを用いることを 前提として解説します。 HI-TECH PRO LiteのインストールはMPLAB IDEのインストール途中に選択画面があり、 そこでインストールを選択することになります。 これにより、アセンブリ言語およびC言語で開発が出来ることになります。

アセンブラとCコンパイラ

ソフト開発ツールMPLAB IDEインストール編

検索エンジンで探す

MPLAB IDEはマイクロチップ社のサイトからダウンロードしますが、 MPLAB IDEの場所が分かりにくいと思います。
そこで、検索エンジンでMPLAB IDEをダウンロードする方法、 インストールの手順を解説します。
 1.パソコンのwebブラウザを起動し、各種検索サイトで「MPLAB IDE」と入力して検索。
 2.MPLAB IDEに関する検索結果が色々出てきますが「MPLAB IDE Archives」(英語)
 3.過去のバージョン一覧が表示されますので、その中にある「MPLAB IDE V8.84」をクリックする。

注意:
2012年現在、V8.84以降があるようですが、
手順を合わせる意味でV8.84を使います。

インストール

4.クリックすると「このファイルを開くか、または保存しますか?」といったメッセージが出てくるので

5.フォルダの中にある「setup」をダブルクリック。
6.セキュリティ警告が出るかもしれませんが「実行」を選択し、インストールが開始される。
7.以下、画面イメージにて手順を解説します。

以上の手順でインストールを行ってみてください。成功すると、下記の画面が表示されます。

MPLAB IDEの起動を確認

インストールが完了するとデスクトップにMPLAB IDEのショートカットができ、 ダブルクリックするとMPLAB IDEが起動します。

今回はここまでとし、「×」ボタンでMPLAB IDEを終了します。

プロジェクトの作成からビルド

今回は プロジェクトの作成からビルドについて解説します。 図15に手順を示します。

手順

プログラムが書いてあるファイルを「 ソース・ファイル」と言いますが、 MPLAB IDE ではソース・ファイルやPICに書き込むための「HEXファイル」などを 「プロジェクト」という単位でまとめています。
プログラム開発は 最初にプロジェクト(名)をMPLAB IDEに登録(作成)すること から始めます。
新規にプロジェクトを作成した後 では プログラム(ソース・ファイル)が書かれていませんので、 プログラムを作成し、これもプロジェクトに追加することにより ビルドを 行うことが出来ます。

用いるPICとプログラムの概要

PICは色々な種類と機能があります。
ここでは学習目的として8ピンの「PIC12F683-I/P」を用い、 LEDを点滅動作させるプログラムを作成することにします。

8ピンPICによるLEDの点滅

プロジェクトの新規作成

フォルダの作成

プロジェクトを作成すると関連する色々なファイルが出来ますが、 これらを1つのフォルダの中にまとめておくと管理が簡単です。
そこで、新規プロジェクトを作成する前にフォルダを作成しておきます。 フォルダの場所は任意ですが、 フォルダ階層が深すぎるとパス名が長くなり MPLAB IDEでエラーが出る場合があります。
MPLAB IDEではパス名の限界値は62文字です。
フォルダ名およびファイル名に日本語を使用することは不可です。
また、C言語では定数などを除き小文字が基本です。(H→大文字、h→小文字) ここでは、ローカルディスク(C)の下に「ledtp1」というフォルダを作成 することにします。(大文字で書くと LEDTP1)

プロジェクトウイザードでプロジェクトを作成

プロジェクトの作成はMPLAB IDEのプロジェクトウイザードを用います。 以下、MPLABI IDEの画面で説明します。

①MPLAB IDEを起動

2つのウインドウが開きます。 各ウインドウは大きさの調節が出来ます。

②「Project」 → 「Project Wizard」を選択。

これにより、Project Wizardのウインドウが開きます。

③Welcome!画面の「次へ」を選択。(クリック)

④Step One画面。

ここで用いるデバイス(PIC)を選択します。 「PIC12F683」を選んで、「次へ」を選択。(クリック)

⑤Step Two画面。

Active Toolsuiteで用いる言語を選択します。 ここでは「HI-TECH C PRO Lite」を用いますので 「HI-TECH Universal Toolsuite」を選択します。 これによりToolsuite Contents部が「HI-TECH ANSI C Compiler」となりますので、 「次へ」を選択(クリック)してください。

⑥Step Three画面。

この画面でプロジェクトのフォルダと名前を設定します。 手動で入力することも出来ますが、ここではBrowseボタンで フォルダを選択し、ファイル名を入力する方法で行ってみます。
Browseボタンをクリックし、ローカルディスク(C)の中にある 「ledtp1」フォルダ を開きます。 ファイル名に「ledtp1」と入力し、「保存」をクリックします。 これによりCreate New Project Fileが「C:\ledtp1\ledtp1」となり、 「次へ」をクリック。

⑦Step Four画面。

ここは何もしないで「次へ」をクリック。

⑧Summary画面。

この画面にて「完了」をクリックします。

これにより、 Untitleed Workspaceが「ledtp1.mcw」になり、 いくつかの フォルダがウインドウの中に出来ます。

これで新規プロジェクト作成が完了しますが、 このままではプログラムが書いてありませんので、 以下の方法にてプログラムを作成し、プロジェクトに追加します。

ソース・ファイルの追加(登録)

⑨「File」 → 「New」を選択。

これにより「Untitled」という新たなウインドウが作成されます。 このウインドウの中にプログラムを書くのですが、 まずは、このウインドウをソース・ファイルとして保存します。

⑩「File」 → 「Save As」を選択。

この場合、3つのウインドウが開いていますので、Untitledのウインドウに一旦、 カーソルを置いてから、「File」 → 「Save As」を選択します。 画面下の「Add File To Project」をチェックする(ONする)。 LEDTP1のフォルダを指定し、「ledtp1.c」のファイル名で保存。 (フォルダは「C:\ledtp1」)

ビルドの際は「Add File To Project」の操作が必要です。

これにより⑨の「Untitled」のウインドウが「C:\ledtp1\ledtp1.c」の名前 になります。

プログラムの作成

⑩で作成した「ledtp1.c」というソース・ファイルにプログラムを書いていくわけですが、 ここでは後記するリスト1を入力します。 入力またはプログラム修正した場合、「File」 → 「Save」しておきます。

ビルドする

C言語で作成したソース・ファイル を機械語に変換します。 C言語の場合、この変換作業を「コンパイル」と言いますが、 MPLAB IDEの場合、「ビルド」と言います。
ビルドは「Project」 → 「Build」で行います。
これによりOutputウインドウがアクティブになり、自動的にビルド作業が始まります。

ビルドの成功

プログラムの文法にエラーが無ければ、 最後のメッセージが 「Build successful!」となればビルドの成功です。

ビルドの失敗

以下はビルドの失敗例で、リスト1のプログラムにおいて、 わざと、1か所を文法ミスさせたものです。 (while(1) のwを大文字として While(1))
Outputウインドウの途中でエラー箇所が指摘され、 最後の「Build failed!」のメッセージになります。

プロジェクトのオープンとクローズ

プロジェクトのオープン

プロジェクトの登録(作成)後は「Project」 → 「Open」で行います。
例えば、今回登録したledtp1の場合、ledtp1のフォルダを指定し、 「ledtp1.mcp」をダブルクリックするか、クリックしてから「開く」を選択します。

プロジェクトのクローズ

プロジェクトをクローズ(閉じる)場合は、「Project」 → 「Close」で行います。

MPLAB IDEの終了

MPLAB IDEの終了は「×」(閉じる)をクリックします。
この時、プロジェクトがオープンのままですと、 「Do you wish to save the workspace before closing?」のメッセージが出ます。 このメッセージは、 「PICマイコン、PICライタ、開いたウインドウの位置などを保存してからクローズしますか?」 の意味です。 この場合、「はい」を選択して終了します。
なお、すべてのプロジェクトをクローズしてから「×」(閉じる)をクリックする場合、 このようなメッセージは出ません。

用いるプログラム

リスト1に用いたプログラムを示します。

リスト1

#include <htc.h>
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON 
& BOREN_ON & MCLRE_OFF & CP_OFF & IESO_OFF & FCMEN_OFF);
#define _XTAL_FREQ 1000000

void main()
{
OSCCON = 0x40;
ANSEL = 0;
CMCON0 = 0x07;
TRISIO = 0x08;

while(1)
{
GP2 = 1;
__delay_ms(300);
GP2 = 0;
__delay_ms(300);
}
}

書式説明

C言語のプログラムは定数などを除いて「小文字」で統一され、 ビルド時に大文字と小文字を識別します。
スペース(空白)は「半角」。全角のスペースはエラーになる。

かっこ  < >  < > { } の違いに注意。 < >

 < > 山かっこ
 ( ) 丸かっこ
 { } 波かっこ
O(オー)と0(ゼロ)に注意。
また、行の最後は「;」(セミコロン)があるものと無いものがあるので注意。

#include
#include はすべて小文字で、セミコロンを付けないで改行
シャープ、アイ、エヌ、シー、エル、ユー、ディー、イー、山かっこ始め、 エッチ、ティー、シー、ドット、エッチ、山かっこ終わり
#includeは書式に間違いが無ければ、MPLAB IDEのソースファイルでは 「青色」になっている。 ちなみに、この部分で大文字(例えば、i→I)にするとエラー(赤色) になる。
この状態で、「Project → Build」でビルドを行うと、 エラーメッセージが出て、「Build failed」


__CONFIGからFCMEN_OFF);
すべて大文字。
__CONFIGからFCMEN_OFF);までが1つの命令です。 文字数が多いので見やすくするために途中で改行しています。 &の前後は見やすくする目的で1文字のスペースを入れています。

__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON
CONFIGの前は「アンダーバー」が2つ。 1つにするとエラーが出る。(ソースファイルでは赤色にならないので 注意)
アンダーバー、アンダーバー、シー、オー、エヌ、エフ、アイ、ジー 丸かっこ始め、エフ、オー、エス、シー、アンダーバー、アイ、エヌ、ティー、 オー、エス、シー、アイ、オー、スペース、アンド、スペース、ダブリュー、 ディー、ティー、イー、アンダーバー、オー、エフ、エフ、スペース、 アンド、スペース、ピー、ダブリュー、アール、ティー、イー、アンダーバー、 オー、エヌ、改行

& BOREN_ON & MCLRE_OFF & CP_OFF & IESO_OFF & FCMEN_OFF);
アンド、スペース、ビー、オー、アール、イー、エヌ、アンダーバー、 オー、エヌ、スペース、アンド、スペース、エム、シー、エル、アール、 イー、アンダーバー、オー、エフ、エフ、スペース、アンド、スペース、 シー、ピー、ンアーバー、オー、エフ、エフ、スペース、アンド、スペース、 アイ、イー、エス、オー、アンダーバー、オー、エフ、エフ、スペース、 アンド、スペース、エフ、シー、エム、イー、エヌ、アンダーバー、 オー、エフ、エフ、丸かっこ終わり、セミコロン、改行
__CONFIGからFCMEN_OFF);は1行にしてもかまいません。


#define _XTAL_FREQ 1000000
行の最後にセミコロンはありません。
defineは小文字 シャープ、ディー、イー、エフ、アイ、エヌ、 イー、スペース、アンダーバー、エックス、ティー、 エー、エル、アンダーバー、エフ、アール、 イー、キュー、スペース、数字の1000000、改行


void main()
行の最後にセミコロンはありません。
#define _XTAL_FREQ 1000000との間に見やすくする目的で1行の空白。
void mainは小文字 ブイ、オー、アイ、ディー、スペース、エム、エー、アイ、エヌ、丸かっこ始め 丸かっこ終わり

{
波かっこ始め、改行

OSCCON = 0x40;
波かっこ始めの下に見やすくする目的でTAB1個のスペース エックスは小文字 オー、エス、シー、シー、オー、エヌ、スペース、イコール、スペース、 ゼロ、エックス、ヨン、ゼロ、セミコロン、改行

ANSEL = 0;
見やすくする目的でTAB1個のスペース エー、エヌ、エス、イー、エル、スペース、イコール、スペース、 ゼロ、セミコロン、改行

CMCON0 = 0x07;
見やすくする目的でTAB1個のスペース エックスは小文字 シー、エム、シー、オー、エヌ、ゼロ、スペース、イコール、スペース ゼロ、エックス、ゼロ、ナナ、セミコロン、改行

TRISIO = 0x08;
見やすくする目的でTAB1個のスペース エックスは小文字 ティー、アール、アイ、エス、アイ、オー、スペース、 イコール、 スペース、ゼロ、エックス、ゼロ、ハチ、セミコロン、改行

while(1)
CMCON0 = 0x07;の下に見やすくする目的で1行のスペース 行の最後にセミコロンはありません。
whileは小文字
見やすくする目的でTAB1個のスペース、丸かっこ始め、改行 ダブリュー、エッチ、アイ、エル、イー、丸かっこ始め、数字の1、 丸かっこ終わり、改行


{
見やすくする目的でTAB1個のスペース、波かっこ始め、改行

GP2 = 1;
見やすくする目的でTAB2個のスペース すべて大文字 ジー、ピー、数字の2、スペース、イコール、スペース、数字の1、セミコロン、 改行

__delay_ms(300);
見やすくする目的でTAB2個のスペース delay_msは小文字 delay_msの前にアンダーバー2個 ディー、イー、エル、エー、ワイ、アンダーバー、エム、エス 丸かっこ始め、数字の300、丸かっこ終わり、セミコロン、改行

GP2 = 0;
見やすくする目的でTAB2個のスペース すべて大文字 ジー、ピー、数字の2、スペース、イコール、スペース、数字のゼロ、 セミコロン、改行

__delay_ms(300);

{
見やすくする目的でTAB1個のスペース、波かっこ終わり、改行

{
波かっこ終わり、改行


以上ここまでとなります。

プログラムをマイコンに書き込むための道具

プログラムを書き込むPICライタには色々ありますが、 今回はPICkit3と書き込みアダプタを用います。

PICkit3

マイクロチップ社の小型のライタでパソコンとはUSBケーブルにて接続します。 書き込みはMPLAB IDEの書き込みメニューからPICkit3を選択して行います。

PICkit3 PICkit3での構成例

MPIC-DPPA

PICkit3を用いる場合、図17のように出来上がった基板(またはブレッドボード)に 書き込むための回路を搭載して行います。
このように基板にPICを実装した状態で書き込む方式をICSP (In Circuit Serial Programming)方式と言います。
PICkit3を基板に実装した状態でプログラムの実行、変更(書き換え)が出来ますが、 慣れないうちは基板に直接PICkit3を接続しないで「書き込みアダプタ基板」 による方法をお勧めします。 ここでは、PICkit3用の書き込みアダプタ「MPIC-DPPA」を用いる方法で説明します。  ①PICをMPIC-DPPAに実装
 ②PICkit3にて書き込み。
 ③PICを実際の基板(またはブレッドボード)に実装して動作チェック。

【MPIC-DPPA】 DIPパッケージ・PICマイコンプログラミング・アダプタキット


MPIC-DPPAを用いた手順概要

(MPIC-DPPAの特徴)
・対応PICライタPICkit2およびPICkit3
・ゼロプレッシャーソケットによるPICの抜き挿し
・ICSP対応の8ピン、14ピン、18ピン、20ピン、28ピンのDIPパッケージに対応
・PICのピン数に応じて、ジャンパー設定。


表1 主な対応PIC


▼マルツ PICマイコンラインナップ 半導体:マイコン:PICマイコン各種

書き込み方法、手順

パソコンにPICkit3を接続

パソコンにPICkit3を接続

MPIC-DPPAの設定とIC実装

MPIC-DPPAは各種PICに対応しています。
PIC12F683は8ピンですから、ジャンパーを8ピン用に設定し、 ICをソケットに実装します。

MPIC-DPPAの設定とIC実装

PICkit3とMPIC-DPPAを接続

PICkit3との接続 PICkit3とMPIC-DPPAの接続

書き込み準備

MPLAB IDEのメニューからPICkit3を選択 「Programmer」→「Select Programmer」→「6.PICkit3」 これにより、Output画面に以下のメッセージが出てきます。

PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.27.XX
Firmware type......................Midrange

ここで、以下の警告文が出るかもしれません。 この警告文は「3.3Vのデバイスに5Vを接続するとデバイスに ダメージを与えます」の意味です。 用いるデバイスPIC12F683は最大5.5Vまで動作し、問題ありませんので、「OK」を選択します。

Voltage Caution

CAUTION:Check that the device selected in MPLAB IDE (PIC12F683)is the same one that is physically attached to the debug tool.Selected a 5V device when a 3.3V device is connected can result in damage to the device when the debugger checks the device ID.

OKCancel

「OK」を選択後、画面が進み、以下の赤部のメッセージが出ます。

PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.27.XX
Firmware type......................Midrange PICkit 3 Connected.
PK3Err0045: You must connect to a target device to use PICkit3.

このメッセージの意味は「PICkit3が使えるようにターゲット デバイスを接続してください」です。
つまり、ターゲットデバイス側(MPIC-DPPA)の電源を入れてください になりますが、MPIC-DPPAは電源を搭載していないので、 PICkit3からターゲットデバイス(MPIC-DPPA)へ電源供給します。
この方法は以下のようにします。
MPLAB IDEのメニューから
「Programmer」→「Settings」
ここから「Power」のなかで、 Power target circuit from PICkit3 にチェックを入れ、Voltageを5.000にする
最後に「OK」 ここで、「Voltage Caution」の警告文が出るかもしれませんが、 「OK」を選択。
これによりさきほどの赤部から先に進んで、Device IDを表示し、 書き込みの準備が完了します。

PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.27.XX
Firmware type......................Midrange
PICkit 3 Connected.
PK3Err0045: You must connect to a target device to use PICkit3.
Device ID Revision = XXXXXXXX

注意
警告メッセージは「Voltage Caution」以外に「PICkit3 Upgrade」が 出るかもしれません。 これは、選択されたPIC型番用のPICkit3のソフトを書き換える 必要があり、このような場合、「OK」を選択すれば自動的に ダウンロードを開始します。

書き込み

MPLAB IDEのメニューから 「Programmer」→「Program」
ここで、「Program Warning」の警告文が出る場合がありますが、 そのまま「OK」を選択。 これによりOutput画面が進み、以下のメッセージが出れば、 書き込みが正常に完了です。

Programming... Programming/Verif] complete

ブレッドボードを用いた動作チェック

プログラムを書き込んだPICをブレッドボードにて動作チェックします。

LED点滅回路



5ピンに接続したLEDを点滅させる回路で、電源は単3電池を3本用い、 これにより4.5V動作です。

部品表

表2

部品番号 品名 型番 メーカー 数量
LED1 Φ5LED 青 BL503B2CA1A01 Linkman 1
IC1 PIC PIC12F683-I/P   1
R1 カーボン抵抗 10K     1
R2 カーボン抵抗 220Ω     1
  ブレッドボード 165408010E   1
  ジャンプワイヤ各種     適量
  単3用電池ケース BH331B Linkman 1
  006P用ジャンプワイヤ 006P-P Linkman 1
  単3乾電池     3

LEDは青を用いましたが、他の色(赤、緑等)でも良いです。

図24に実装例を示します。

動作

電源を入れるとLEDが点滅します。 もし点滅しない場合、LEDの極性が逆か、どこかの接続ミスが考えられますので、 一旦、電源を切ってから配線、極性を確認します。
点灯パターンは図25のように300msecの周期で点灯/消灯を繰り返します。

LED実装表

点灯パターンを変える場合

プログラム変更箇所

点灯パターン(周期)を変えたい場合、次のようにプログラム変更します。
__delay_ms(300); のかっこの中の数値を変更します。
この数値は点灯/消灯時間を決めていて、単位はmsecです。
GP2 = 1; の後が点灯時間、GP2 = 0; の後が消灯時間です。
点灯/消灯はかならずしも同じ時間でなくとも良く、例えば、

GP2 = 1;
__delay_ms(1000);
GP2 = 0;
__delay_ms(500); とすれば、
点灯 → 1000msec(1秒)
消灯 → 500msec になります。

#include <htc.h>
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_OFF & CP_OFF & IESO_OFF & FCMEN_OFF);
#define _XTAL_FREQ 1000000 void main()
{
OSCCON = 0x40;
ANSEL = 0;
CMCON0 = 0x07;
TRISIO = 0x08;
while(1)
{
GP2 = 1;
__delay_ms(300);
GP2 = 0;
__delay_ms(300);
}
}

変更方法

ソースファイル(LEDTP1.C)を修正し、
「Project」→「Build」
Output画面にてビルドが進み、「Build successful!」のメッセージ でビルド成功を確認
MPIC-DPPAにPICを装着し、PICkit3に接続
「Programmer」→「Program」で書き込み
ブレッドボーでの動作チェック

用いるPICの概要

PIC12F683のピン配置

PICマイコンのうち、PIC12F683を事例に取り上げます。図17にピン配置を示します。
1ピンと8ピンは電源/GNDに接続します。それ以外のピンを入力または出力として用います。
PIC12F683はアナログ信号を入力できる機能もあり、ピン毎に複数の機能を持っています。



図17はデジタル信号のみを扱う(接続)ことを考慮し、各ピン名称を表現しています。 PIC12F683の動作電圧は2.0V~5.5Vです。消費電流も少ないので、単3乾電池であれば 2本直列(3V)または3本直列(4.5V)で動作します。


I/Oポート

デジタル信号を入出力できるピンを「I/Oピン」と言い、これを複数の本数にまとめたものを 「I/Oポート」と言います。 PICの場合、これを「GPIOポート」と言い、PIC12F683ではGP0~GP5の6本です。
図17で各ピン名称の後に(I/O)の文字が付いているものは入力(INPUT)または出力(OUTPUT) どちらでも使用できることを意味し、4ピンのGP3のみは入力専用です。
LEDを点灯、点滅させる場合、「PIC→LED」へ出力として用いますから、GP3以外へ接続します。

回路

LEDへの接続

LEDを点滅する回路を図19に示します。 出力はGP3以外ですから、どれに接続しても良いです。 ここでは5ピンのGP2へ接続します。

8ピンPICによるLED点滅

入力ピンの処理

入力ピンは入力信号またはスイッチなどを接続しますが、スイッチなどを使用しなくても 必ずデジタルレベルの「L」または「H」へ接続します。
入力ピンとして用いた場合、何も接続しないとデジタル的にH/Lが不定になり、 誤動作の原因になります。したがって、機能として用いていない入力ピンをH/Lどちらかに接続し、 このことを「入力ピン処理」と言います。

入力ピン処理方法

今回は4ピンのGP3が入力ですから、このピンを抵抗R1を介して1ピンのVDDへ 接続しておきます。 抵抗を介して、電源へ接続することを「プルアップ」と言い、この状態で4ピンは デジタル的に「H」レベルです。
抵抗を介さないでGND(8ピン)へ接続しても良いですが、あとで4ピンにスイッチが 接続できるようにこのようにしています。 LEDは5ピンへ接続しますので、GP0,GP1,GP4,GP5は入力ピンの設定でも良いのですが、 この場合、入力ピン処理が必要になります。 したがって、使わないピンは出力設定にしておけば入力ピン処理が不要になり 余計な配線をしなくて済みます。

プログラムの説明

以下に5ピンをON/OFFすることによりLEDを点滅するプログラムを示します。

一般的なC言語のプログラム構成例を図21に示します。
「プリプロセッサ部」、「メイン関数部」、「その他の関数部」の構成で、 その他の関数部が無い構成もあり、今回のプログラムはこの部分がありません。

アセンブリ言語の場合、35個の命令を組み合わせてプログラムしますが、C言語は 「関数」というものでプログラムします。
この関数は数学などの関数ではなく、「ある機能を行うための小さなプログラムの集まり」 のことを言います。



実行文が命令に相当するもので、図22では関数の中身は実行文とデータ定義ですが、 さらに関数の中に別の関数もあります。


プリプロセッサ部

必要な外部ファイルを取り込むための命令、プログラムでは出来ない設定を この部分で行います。

必要な外部ファイルを取り込む命令で、最初にこの記述を行います。


CONFIG(コンフィグ)とは「設定」などの意味で、プログラムでは設定出来ない 内蔵ハードウェアの設定をここで行います。
この部分で記述しておくと、自動的にPICに書き込んでくれます。 内蔵ハードウェアの設定は、 外部リセットの使用有無 発振回路の選択 ウォッチドッグ・タイマの使用有無 その他 などで、PIC12F683を用いたLEDの点滅用途ではこの設定で良いです。

ハードウェアにてクロックの周波数を設定しても、プログラム上では周波数の値が分かりません。 例えば、待ち時間処理(関数)などの場合、クロック周波数が分からないと計算できません。
そこで、コンパイラにクロック周波数を知らせるためにこの記述を行います。 FREQの後ろに周波数値を記述し、この例では1000000、つまり1MHzです。 後述するOSCCONレジスタの値と一致させます。

メイン関数部

電源ON後にこの部分からプログラムが開始されます。
(初期設定部)
ここで、ピンの機能等を何にするかなどの初期設定を行います。
(実行文)
機能設定する各レジスタ(内部メモリ)へ数値を設定します。
OSCCON = 0x40;
PIC12F683は内蔵クロックがあり、31KHz,125KHz,250KHz500KHz,1MHz,2MHz,4MHz, 8MHzの8通りの中から選ぶことができ、OSCCONレジスタというものに値を設定し選択します。 0x40の値でクロックが1MHzになります。
ANSEL =0;
PIC12F683はデジタルI/O以外にAD入力としても使える機能があり、 どちらの機能にするか設定する必要があります。
ANSEL = 0; とすることによりデジタルピンになります。
CMCON0 = 0x07;
ここもピン機能の選択で「コンパレータ」機能有無の選択で、 0x07の値で使わない設定です。 TRISIO = 0x08; これにより、ピンを入力か出力にするかを設定します。 TRISIOレジスタと各ピンとの関係は以下のとおりです。


  TRISIO5 TRISIO4 TRISIO3 TRISIO2 TRISIO1 TRISIO0
対応bit bit5 bit4 bit3 bit2 bit1 bit0
対応GP GP5 GP4 GP3 GP2 GP1 GP0


注意:レジスタの中は8bitでbit6,bit7もあるがこれは未使用 bit0がLSB
1を設定 → 入力
0を設定 → 出力
設定値は0x08ですが、最初の0xは16進数であることを表しています。 0xの後ろ08は16進数で、これを2進数で表すと、
16進数の08 → 2進数では 00001000
つまり、bit3のみ1です。


  TRISIO5 TRISIO4 TRISIO3 TRISIO2 TRISIO1 TRISIO0
対応bit 0 0 1 0 0 0
対応GP GP5 GP4 GP3 GP2 GP1 GP0
  出力 出力 入力 出力 出力 出力


これにより、
GP3 → 入力
それ以外 → すべて出力
以上の4つの実行文により、 内蔵クロックは1MHz デジタルピンに設定 コンパレータは使わない GP3を入力、それ以外は出力に設定



かっこの中の実行文を永久に繰り返します。


GP2 = 1;
入出力制御用の関数で、GP2は5ピンのGP2を意味し、 GP2 = 1; でGP2の出力を「H」にします。
__delay_ms(300);
時間待ちの関数で単位はmsec、かっこの中が時間値。 この例ではかっこの中が300なので、300msecの間 なにもしないで待ちます。
GP2 = 0;
数値がゼロの場合、出力が「L」になります。
__delay_ms(300);
この4つの関数はwhile(1)の中にありますので図22のように永久に 繰り返し、これによりLEDの点滅動作になります。

LEDの点滅

LED交互点滅

2個のLEDを交互に点滅する回路を図23に示します。 7ピンのGP0と6ピンのGP1にLEDを接続し、交互に点滅します。

LEDの交互点滅

メイン関数のwhileの中で、GP0,GP1をそれぞれ1/0にすることにより交互に点滅し、例えば、
GP0 = 1;
GP1 = 0;
であれば、GP0は点灯、GP1は消灯です。

LED順送り点灯

図24に5個のLEDを順番に、1個のみを点灯する回路を示します。

LED順送り点灯

今までの各ピンへの出力は
GP0 = 1;
などで、ピン毎に行っていましたが、同時に複数ピンへ出力するには以下の ようにします。
GPIO = 0x00;
xの後が8ビットのデータで、各ピンとは以下のように対応します。


            LSB
対応bit bit5 bit4 bit3 bit2 bit1 bit0
対応GP GP5 GP4 GP3 GP2 GP1 GP0

ただし、入力に設定されているピンと存在しないピンには影響しません。 PIC12F683はGP3が入力専用ですから、このピンとbit6,bit7には反映されません。 例えば、
GPIO = 0X01;
でGP0の出力が1でそれ以外は0です。 以下に順送り点灯のプログラムを示します。
whileの中で、1つのピンのみ1を出力し、500msecの待ち時間後に、次のピンを1にしています。 この場合の点灯パターンを図25に示します。 LED1 → LED2 → LED3 → LED4 →LED5 の順に点灯し、各点灯 時間は500msecです。
Whileの中に入っていますから、LED5の後はLED1に戻ります。

点灯パターン

今回はこのような点灯パターンにしましたが、例えば、LED5まで行った後、 LED4 → LED3 → LED2 を追加すれば、LED列を往復するような パターンになります。 また、データを
0x01
0x03
0x07
0x1F
0x3F
などのようにすれば、点灯するLEDが順に増えていきます。





Page Top