USARTの使い方


【USART】

USARTはシリアル通信を行うためのハードウェアモジュールで、高速のシリアル
通信を行うことが可能です。
USART:Addressable Universal Synchronous Asynchronous Receiver Transimitter

USARTは下記の機能を持っています。

(1) 調歩同期式(非同期式)全二重通信
  パソコンなどとの通信ができます。
(2) 同期式半二重通信(マスタ)
  A/Dコンバータやメモリなどのデバイスとの通信用に使います。
(3) 同期式半二重通信(スレーブ)
  他のマスタのデバイスとして動作させる時に使います。

《クロックとの関連》
 ボーレートを決めるクロックとして、システムクロックを使います。従って、
 内部発振器を使うときには、クロック精度が問題になるので注意が必要です。
 また省電力モードにするとクロックの周波数が変わるため、ボーレートが変わって
 しまいます。
 さらにSLEEPモードではクロックが停止してしまうため、USARTもい停止します。


【USART送信部内部構成】

USARTの調歩同期式の場合の送信部の内部構成は下図のようになっています。
調歩同期式の場合の動作は、まず送信データがTXREGに書き込まれると、直ぐ
そのデータをTSRレジスタに移送します。その時点で割込みが発生して次のデータ
の送信が可能になります。
送信出力部では、スタートビットを送ってから、データの各ビットを順次送信出力します。
9ビットモードのの時には、TX9ビットをセットしておけば、9ビットモードの送信動作を
行います。この時には、9ビット目のデータをTX9Dビットにセットすることで、アドレス
データと一般データを簡単に切り替えられます。
この9ビット目のデータは、パリティ信号としても使うことができますが、パリティビット
の自動生成機能は無いので、プログラムでパリティビットを作成する必要があります。

送信が完了するとTRMTビットが1になり、TXREGレジスタに次のデータが書き込まれて
いれば、連続して次のデータの送信動作を開始し、移送した時点で2バイト目のデータ
の送信完了割込みが発生します。






【USART受信部内部構成】

USARTの受信部の回路構成は下図のようになっています。
調歩同期の場合の動作としては、常時入力ピンをサンプリングしてスタートビットの
有無をチェックしています。そのサンプリングの速度がBRGHビットによって64回か
16回かが決まります。スタートビットを検出したら続く8ビットのデータをRSRレジスタ
にシフトしながら入力します。最後にストップビットを確認して終了し、誤りチェック後
受信割込みを発生します。

ここで特徴的なのは9ビットモードの動作です。つまり、TX9ビットが1になっていると
9ビットのデータを受信するようになります。
そして9ビット目の0,1によりその時の8ビットデータが、データかアドレスかを区別
出来るようになります。
さらに、ADDENビットを1にしておくと、9ビット目が1の時だけ、つまりアドレスの
データ受信の時にだけ受信動作をするようになります。このアドレス受信をして
アドレス一致をソフトウェアで検出し、ADDENを0にしてデータ受信を許可するまで、
データ受信を受け付けないようになります。
このような使い方はRS-485を使ったパーティラインのシステムで、相手を特定して
から送受信を行いたいときに使います。



【同期式の動作】

USARTを同期式で使う場合には、RC6とRC7のピンの機能が変わり下記のように
なります。
つまりRC6ピンはビット同期クロック信号の端子となり、マスターモードの場合には
内部で使うボーレートに従ったビットクロックを出力します。
RC7ピンは、そのビットクロックに同期させたデータが入出力されます。

スレーブモードの場合には、マスターが出力するビットクロックをRC6ピンから入力して、
それに同期させて、RC7ピンのデータの送受信を行います。

このようにRC7ピンが入出力で共用されるため、半二重通信しかできません。

ピン マスターモード スレーブモード
RC6 同期クロック出力 同期クロック入力
RC7 データ入出力 データ入出力

同期式の場合には、スタートビットもストップビットも無く、いきなりデータが送受信
されます。9ビットモードは、調歩同期式と同じようにアドレス指定かパリティビット
用として使うことができます。

同期式でスレーブ受信モードの場合には、SLEEP状態にあっても受信動作を行い、
受信完了時点でSLEEPからウェイクアップします。

【制御レジスタの内容】

USARTを使うためには下記の3個のレジスタの設定が必要です。

(1) TXSTAレジスタ
  送信部分の動作モードを設定します。
(2) RCSTAレジスタ
  受信部分の動作モードを設定します。
(3) SPBRGレジスタ
  通信速度を設定します。(ボーレートジェネレータ)

まずTXSTAレジスタは下図のような構成になっていて、PIC16と変更部分はありません。
非同期モードで使う時にはSYNCを0にします。アドレス選択機能を使う時には、TX9で
9ビットモードを指定し、TX9Dに9ビット目のデータを設定します。残りの8ビットのデータ
は上図のTXREGに書き込みます。







受信の方の設定では、非同期にするのはTXSTAで設定されているので連続受信を
許可します。アドレス選択機能を使う時には、やはりRX9を1にしてやると、受信した
9ビット目のデータがRX9Dで取り出すことが出来ます。残りの8ビットのデータは
RCREGから取り出せます。受信中のエラーチェックもRCSTAレジスタのビットで確認
することが出来ます。





【通信速度の設定】

通信速度を決めるのは、SPBRGレジスタによるボーレートジェネレータが制御
しています。このSPBRGレジスタへに設定する数値(X)と通信速度の関係は
下記関係式となっています。

条件 BRGHビット=0 BRGHビット=1
SYNCビット=0 通信速度=Fosc/(64(X+1)) 通信速度=Fosc/(16(X+1))
SYNCビット=1 通信速度=Fosc/(4(X+1)) なし

この関係式から、調歩同期式の場合のXの値を求めると、ぴったり整数には
なりません。しかしSPBRGには整数しか設定できませんので、本来の通信速度
にぴったりと合わない場合もあります。そのずれの誤差は、調歩同期式の場合
には、通常3%以下にすれば正常な通信ができます。

《表》 BRGH=0の時の通信速度とSPBRGの値と速度誤差
  クロック

ボーレート

40MHz

20MHz

10MHz

SPBRG
設定値

エラー
レイト

SPBRG
設定値

エラー
レイト

SPBRG
設定値

エラー
レイト

2400

129

0.16

64

0.16

9600

64

0.16

32

-1.36

15

1.73

19.2K

32

1.36

15

1.73

7

1.73

76.8K

7

1.73

3

1.73

1

1.73

115.2k 4 8.51 2 8.51 0 35.63

《表》 BRGH=1の時の通信速度とSPBRGの値と速度誤差
  クロック

ボーレート

40MHz

20MHz

10MHz

SPBRG
設定値

エラー
レイト

SPBRG
設定値

エラー
レイト

SPBRG
設定値

エラー
レイト

2400

255

103.5

255

1.73

9600

255

1.73

129

0.16

64

0.16

19.2K

129

0.16

64

0.16

32 -1.36

76.8K

32

-1.36

15

1.73

7

1.73
115.2k 21 -1.36 10 -1.36 4 8.51
230.4k 10 -1.36 5 -9.58 2 -9.58
  (注)エラーレイトとは、ボーレート周波数のズレの多さを%であらわしたもので
     1フレーム内でのズレになります。通常3%以下である必要があります。

【アドレス選択機能の使い方】

アドレス選択機能とは、RS-485方式などのシリアル通信で、1台のマスターに複数の
スレーブが同じ線で接続されているような場合に、マスター側からアドレス指定をする
ことで、特定のスレーブを指定してマスターから送信できるようにする機能です。

これで、いわゆる「ポーリング方式」により、マスターが中心となって順次スレーブに
送信するデータがあるかを問い合わせをすれば、複数のスレーブがあっても衝突せず
にスレーブからマスターへデータを送信することが出来ます。

アドレス選択方式を活用するためには下記手順でスレーブ側を動作させます。

(1) 適当な通信速度になるようSPBRGレジスタを設定する
(2) 非同期(調歩同期)に設定する、SYNC=0、SPEN=1
(3) 割込みを使う時は、RCIE=RCIP=1にする。
(4) 9ビットモードにする。(RX9=1)
(5) アドレス検出モードにする。(ADDEN=1)
(6) 連続受信可能にする。(CREN=1)
(7) RCIFフラグが1になるのをチェックするか、割込みにより受信検知する。
(8) RCSTAレジスタのRX9が1であることを確認することでアドレス受信を確認する。
(9) 8ビットのデータを取り出し、アドレス比較をする。
(10)ADDEN=0にすると次からはデータの受信状態となる。
(11)以降のデータを受信する。
(12)一定のバイト数か特定のデータ受信でデータ受信を完了しADDEN=1に戻す。


【アセンブラ言語での使い方】

USARTをアセンブラ言語で使う場合の使い方ですが、USARTはハードウェアが大部分
の機能を実行しますので、プログラム制御は簡単です。

(1) 動作モード設定
  例として調歩同期式で、115.2kbpsで送受信を行う場合には、下記のように設定
  します。

(2) 送信手順
  データ送信を行うサブルーチンは、下記のようになります。

(3) 受信手順
  1バイトのデータを受信するサブルーチンは、下記のようになります。


【C言語ライブラリ関数】

CCS社のPCHコンパイラには、USART用組込み関数として下表が用意されています。
使用宣言をするためのプリプロセッサも含まれています。

プリプロセッサ書式 機 能 内 容

#use delay(CLOCK=speed)
 speedは定数で1〜100000000

コンパイラに対してクロック速度の基準を与えます。
これにより内部遅延関数や、通信速度などのパラメータが決められます。
 speedにはクロック周波数を設定します。
  1Hzから100MHzが指定できますがハードウェアに合わせて指定します。
#use rs232関数より前に置くことが必須です。
このプリプロセッサにより下記の遅延関数が利用可能になります。
  delay_cycles(count) countサイクルの遅延
  delay_ms(time) time(msec)の遅延
  delay_us(time) time(μsec)の遅延
#use rs232(BAUD=baud,
  XMIT=pin, RCV=pin
...)

USARTを使う宣言とパラメータ設定を行います。
パラメータには下記の種類があり、コンマで並べて指定します。
《パラメータ》
 BAUD=x:通信速度を指定します。 (xは200?152000程度まで指定可能)
 XMIT=pin:送信のピンを指定(RC6に限定)
 RCV=pin:受信のピンを指定(RC7に限定)
   (RC6,RC7以外を指定するとUSARTは使わない)
 INVERT:信号の極性を反転する
 PARITY=x:パリティの指定、xはN,E,Oのどれか
 BITS=x:ビット長(xは5−9)
 FLOAT_HIGH:Float状態をHigh側に固定する
 ERRORS:エラー発生を保存する
 RS232_ERRORSに保存
 BRGH1OK:ボーレート設定エラーを無視する
 ENABLE=pin:送信中pinをhighにする

上記設定のデフォルトの設定は
 データ長=8ビット
 STOPビット=1ビット
 パリティ=無し



関数名 書式とパラメータ 機能と使用例

getc()
getch()
getchar()
どの書式でもよい

value = getc();

RS232の受信(RCV)ピンからのデータ入力を待ち、
入力があったら1バイトデータとして返す。
 do {
   answer = getch();
 } while(answer!=’Y’ && answer!=’N’);

gets()

value = gets(string);
stringは文字配列のポインタ

RS232からCRコードが入力されるまで文字列を配列に入力し
CRコード入力後00を配列最後に追加する。
 gets(string);
 if(strcmp(string, password))
   printf(“OK”);

kbhit() value = kbhit();

常時はFALSE(0)が返されるが、RS232に入力があると
TRUE(1)が返る。
getc()による永久待ち状態を回避したいときに使う。
 if (kbhit())
     return(getc());
 else
     return(0);

putc()
putchar()
どちらでも良い

putc(cdata);
 cdataは8ビットデータ

cdataをRS232の送信(XMIT)ピンからシリアルで出力する。
 putc(‘*’);
 for(i=0; i<10; i++)
   putc(buffer[i]);putc(0xD);

puts();

puts(string);
 stringは文字列定数か文字配列

stringの文字コードをRS232のXMITピンからシリアル出力する。
終わりは、00コードで判定する。
 puts(“--------“)
 ;puts(“|  HI  |”);
 puts(“--------“);

printf()

printf(string);
printf(cstring,string);
printf(fname,cstring,values...);
 stringは文字列定数か配列名
 valueは変数名
 cstringはフォーマット指定

stringのデータをRS232か指定関数fnameに順次出力する。
出力するフォーマットはcstringの内容に従う
(1) wは出力文字数指定で下記フォーマットのいずれかです。
  1〜9の1文字  :出力する文字数の指定
  01〜09の2文字 :ゼロサプレスなしの文字数指定
  1.1〜9.9の小数点つき:
      浮動小数点形式で整数部桁数.小数部桁数

(2) tは出力形式で下記のいずれか
  C :文字
  S :文字列か文字
  u :符号無し整数
  x :16進数形式(小文字)
  X :16進数形式(大文字)
  d :符号付10進数形式
  e :実数の指数形式
  f :浮動少数点の実数
  Lx :long型の16進数形式(小文字)
  LX :long型の16進数形式(大文字)
  lu :long型の符号無し整数10進数形式
  ld :long型の符号付整数10進数形式
  % :%文字そのもの

set_uart_speed()

set_uart_speed(baud);
 baudは100から115200の数値

内蔵USARTの通信速度を変更する
 switch(input_b() & 3) {
   case 0: set_uart_speed(2400);
      break;
   case 1: set_uart_speed(4800);
           break;
   default:set_uart_speed(9600);
}




【プログラム例】








  トップページへ