標準入出力の使い方


【標準入出力とは?】

一般の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は浮動少数の指定
 は 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ハードウェアの通信速度を変更する





       目次ページへ