前回まで一通り、書き込み、動作チェックを行いました。
今回は、用いるPICの概要とプログラム説明を行います。

用いる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へ接続します。


★入力ピンの処理

入力ピンは入力信号またはスイッチなどを接続しますが、スイッチなどを使用しなくても
必ずデジタルレベルの「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交互点滅

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

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

  GP0 = 1;
  GP1 = 0;

であれば、GP0は点灯、GP1は消灯です。


LED順送り点灯

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

今までの各ピンへの出力は

   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が順に増えていきます。


前回へはこちらへどうぞ
第1回 超入門編 目次
そもそもPICとは? PIC開発に必要なもの
開発手順 開発環境ソフトのインストール
PICライターキット一覧表はこちら
第2回 ビルド編はこちらへどうぞ
第3回 書込編はこちらへどうぞ


ページトップへ戻る