【標準入出力とは?】
一般のCコンパイラでは標準入出力関数を持っており、コンソールに
表示したり、キーボードからの入力を行うことが出来ます。
CCS C Compiler も同様に標準入出力関数をサポートしています。
CCS C Compiler の場合の標準入出力デバイスは、RS232Cで接続
されたパソコンとなっています。
このRS232Cつまりシリアル通信を、どのPICでもサポートするように
するため、CCS C Compiler ではUSARTとソフト処理とを使い分けて
います。
つまり、PIC16F84の様にUSARTを持たないPICに対しては、ソフト処
理でシリアル通信を組込み、PIC16C73の様に、USARTを持つPICに
対しては、USARTハードウェアを使ってより効率的なシリアル通信を
生成して組み込みます。
さらに両方を一緒に使って複数チャンネルにしたり、ソフト処理だけで
複数チャンネル組込むことも可能になっています。
しかし、割込み処理は使っていませんので、同時送受信は出来ません。
1チャンネルの場合も半二重通信のみです。
【シリアル通信の設定】
シリアル通信を標準入出力デバイスとして組込むためには、下記の
関数を使います。
《シリアル通信用プリプロセッサ関数》
(注)指定速度の設定が指定クロックを使った内部設定で
プリプロセッサ関数
機能・その他
#USE DELAY(CLOCK=speed) コンパイラに対してクロック速度の基準を与えます。これにより通信速度などのパラメータが決められます。
#USE RS232関数より前に置くこと#USE RS232(BAUD=baud,
XMIT=pin, RCV=pin ... )標準入出力をどのようにするかを指定します。
代表的なオプションには下記があります。
BAUD:通信速度を指定します。
(1200〜38400程度まで指定可能)
XMIT:送信のピンを指定
RCV:受信のピンを指定
INVERT:信号の極性を反転する
PARITY:パリティの指定、N,E,Oのどれか
BITS:ビット長(5-9)
デフォルトの設定は
データ長=8ビット
STOPビット=1ビット
パリティ=無し
3%以内の誤差に出来なければコンパイルエラーとなります。
【パソコンとの接続】
シリアル通信でPICとパソコンを接続するには下図のようにします。
つまり、RS232C用のレベル変換IC(MAX232A)をPICに接続し、
そこから直接パソコンのシリアルポート(大抵はCOM2)に接続します。
下図では送信受信にRA3,4を使っていますが、好みの入出力ピンを
使って構いません。
但し、PIC16C73のようにUSARTを使う場合には、ピンが特定されます。
またレベル変換ICはこれ以外にも何種類かありますのでどれでも
構いません。
下図では省略していますが、PICのクロックは10MHzとなっています。
【プログラム例】
では実際のプログラムの作り方です。 上図の回路で標準入出力
デバイスとしてシリアルポートを動かすためには、下記のように
プログラムします。
例で判るように、#USE関数2個だけでシリアル通信が可能になる
というのは、とても便利なことだと思います。
下記のプログラムは、起動するとパソコンにCommand= と表示し
キーボードから1文字入力すると、Input=* と入力した文字を表示
します。以下同じことを繰り返します。
簡単なプログラムですが、これをアセンブラで作るのはかなりの
ステップ数を必要とします。C言語で簡単に目的を達成することが
できる良い例です。
この回路でクロックが10MHzの時の通信速度は、最大38400bps
まで可能でしたが、安定に使うには9600bps程度が良いと思います。
[実行結果例] (パソコン側ローカルエコーバック付き)
Command= a Input= a
《プログラム例》 漢字を含むのでこのままでは使えません
/////////////////////////////////////////////////
// This program is test program of standard io.
// PIC16F84 is target PIC and drive a LCD.
// The PORT for RS232 is below.
// 送信=RA3 受信=RA4
/////////////////////////////////////////////////
#include <16f84.h>
#use delay(CLOCK=10000000)
#use RS232(BAUD=9600, XMIT=PIN_A3 ,RCV=PIN_A4)
main() {
int cmnd; //変数定義
while(1) { //永久繰り返し
printf("\nCommand= "); //Command=表示
cmnd=getc(); //1文字入力
printf(" Input= "); //Input=表示
putc(cmnd); //入力文字表示
}
}
【標準入出力関数】
このシリアル通信を使った標準入出力関数には下表のような
ものがあります。
標準入出力関数
機能・その他
GETC()
GETCH()
GETCHAR()標準入出力デバイスからの入力があるまで待ち、あれば文字を読み込んで返す。 GETS(char *string) 文字を順次入力し文字配列に格納しCRで終了する。配列の最後に0を追加する。 PUTC()
PUTCHAR()1文字出力する PUTS(string) 文字列を出力し、最後にCR,LFを追加する PRINTF([function],
string, [values])フォーマット付き表示出力関数
・functionの指定が無い時は標準デバイス
へ、ある時はfunctionへ出力する。
・stringは固定の文字列と変数の
フォーマット指定の組合わせ
変数のフォーマットは%wtで表現する
・valuesは変数名を指定する
%wtフォーマットの指定方法は下記
wは 1-9は出力する文字数指定
0はゼロサプレス無し
1.1-9.9は浮動少数の指定
tは C :文字
U :符号無し整数
x :16進数小文字
X :16進数大文字
D :符号付き整数
%e :exp形式
%f :浮動少数
Lx :16進数long整数
LX:16進数long整数大文字
lu :符号無しlong整数
ld :符号付きlong整数
% :%そのもの
〈例〉
printf("Hello!\n");
printf("VALUE= %2x\r\n,value);
printf("%2u %X %4X\r\n,x,y,x);b=KBHIT() 受信ピンでスタートビットを検出したときTRUEになる。 SET_UART_SPEED(baud) UARTハードウェアの通信速度を変更する