ここでは、型番16F648(あるいは16F88)のPIC(以後単にPICと呼びます)を利用します。PICは組込み制御用のコンピュータで、プログラム実行をするための機能がすべて一つのIC(集積素子)に内臓されています。PICからは、片側9ピン、両側で18ピンの端子が出ています。ピン間は0.1インチ(2.54mm)です。
PICの外部のピンはプログラムによって制御されます。この例では2進数を計数しその値を出力ピンに出力します。出力ピンにはLEDを接続し、出力の値を表示します。
下は、ICを上側から見た図です。PICの左下(マークがあります)が1ピンです。上の図で右端が9ピンとなり、その反対側が10ピンになります。各ピンについた英字はその機能を意味しています。
ここでは、17,18,1,2 の4個のピンのみを利用します。これらのピンは、RA0,RA1,RA2,RA3 で、Aポート(PORT A)の下位4ビットを構成します。ポートはディジタルの値をそのまま出力する機能です。各ピンはプログラムにより複数の機能を切り替えて利用できます。たとえば、1ピンは PORT A のビット2の信号として利用できるほか、AN2としてアナログ入力、Vrefとして比較電圧に利用することができます。
端子番号 | 端子名 | 注意 | 用途 |
---|---|---|---|
1 | RA2 | I/O | PORT A(bit2) |
AN2 | アナログ比較1入力 | ||
Vref | アナログ参照電圧生成 | ||
2 | RA3 | PORT A(bit3) | |
AN3 | アナログ比較2入力 | ||
3 | RA4 | PORT A(bit4) | |
TOCKI | 外部カウンタクロック入力端子 | ||
CMP2 | 比較器2出力 | ||
4 | RA5 | 入力専用 | PORT A(bit5) |
MSCLR | マスタークリア | ||
VPP | プログラム書き込み | ||
5 | VSS | 電源(グラウンド) | |
6 | RB0 | 割込使用しないとき | PORT B(bit0) |
INT | 割り込み | ||
7 | RB1 | PORT B(bit1) | |
RX | USART入力 | ||
DT | 同期データ信号 | ||
8 | RB2 | PORT B(bit2) | |
TX | USART出力 | ||
CK | 同期用クロック | ||
9 | RB3 | PORT B(bit3) | |
CCP1 | 比較、PWM出力 | ||
10 | RB4 | PORT B(bit4) | |
PGM | ST | プログラム入力 | |
11 | PB5 | PORT B(bit5) | |
12 | PB6 | PORT B(bit6) | |
T1OSO | タイマー1発振出力 | ||
T1CK1 | ST | タイマー1クロック | |
13 | RB7 | PORT B(bit7) | |
T1OSI | タイマー1発信入力 | ||
PGD | プログラムデータ | ||
14 | VDD | 電源 | |
15 | RA6 | 内部発振のとき | PORT A(bit6) |
OSC2 | 振動子1 | ||
CLKOUT | 外部クロック出力 | ||
16 | RA7 | 内部発振のとき | PORT A(bit7) |
OSC1 | 振動子1 | ||
CLKIN | 外部クロック | ||
17 | RA0 | PORT A(bit0) | |
AN0 | アナログ比較1入力 | ||
18 | RA1 | 要プルアップ | PORT A(bit1) |
AN1 | アナログ比較1入力 |
set_tris_a(値)関数で設定します。値は2進数で 0B11110000 のように指定できます。最初の 0B は2進数の意味で残りの8個の0,1で値を設定します。値0は出力、値1は入力を指定します。したがって、11110000 はRA7からRA4は入力端子、RA3からRA0は出力用の端子に設定します。
set_tris_a(0B11110000)を実行すると、ポートは次のように構成されます。
output_a(値)値には、変数が指定できます。たとえば変数 count の値を出力するには
output_a(count)とします。
ここでのC言語のプログラムを示します。
#include <16f648a.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし #use delay(CLOCK=4000000) //クロック4MHz int count; void main(){ count=0; set_tris_a(0B1110000);//Aポート下位4ビット出力 while(1){//繰り返す count = count + 1; //countを増す output_a(~count); //ポートAに出力 delay_ms(1000); //1秒待つ } }#include <16f648a.h> は PIC 16f648a の属性が記述されたファイル16f648a.h を取り込む指示です。このファイルはコンパイラ側で用意されています。標準のC言語では #include <stdio..h>
#fuses INTRC_IO,NOWDT,NOLVP,NOMCLはPIC特有の記述で、PICの利用法を指定しています。 INTRC_IO はプロセッサのクロックとして内部クロックを利用することを指定します。NOWDT,NOMCLR、はWDT、NCLRを利用しないことの指定でづが、説明は省略します。
#use delay(CLOCK=4000000)はプロセッサのクロックの指定で、秒あたり4000000Hz(周波数単位) のクロック(これは内臓クロック)を利用することを指定します。
int countは数学の変数の宣言に相当します。count を8ビットの符号なし整数として使用することを宣言しています。
count=0;は変数 count の値を0とします。
while(1) { }は、無条件に { } の間を繰り返し処理する指定です。1はtrue を意味し、「常に」とか「無条件」の指定です。繰り返しの中で、まず、
count = count + 1;で count に1を加えます。 = は右辺の値を左辺に代入し、countの値を count + 1 に等しくすることを意味します。
output_a(~count);で、count をビット反転した値をポートAに送ります。ポートAには発光ダイオードが接続されていますから、countの2進数の値に従い発光ダイオードが点灯します。countのビットが0の場合、ビット反転するので出力端子は1になり、LEDは発光しません。countのビットが1の場合、ビット反転するので出力端子は0になり、LEDは発光します。
delay_ms(1000);のdelay は遅延の意味で、1000ミリ秒経過してから次の処理に進むことを指定する。この遅延処理を入れないと、人の目に見えない速度で発光ダイオードが点滅してしまいます。
0000>0001>0010>0011>0100>0101>0110> 。。。>1100>1101>1111>0000と表示します。1が点灯、0は消燈です。