前へ 目次 次へ
調歩同期式シリアルデータ「受信」関数
 

SCI3(シリアルコミュニケーションインタフェース)で、 データを受信するプログラムを考えてみましょう。

今回も、BestTechnologyの、 GCC Developer Liteに付属する sci.cの関数を利用することにします。

/* sci.cのデータ受信部分 */

// 受信データバッファより1文字読み出し
char rs_getc (void)
{
  char  c;

  while (!((SCI3.SSR.BYTE & 0x78) != 0)) ; // 受信バッファ|エラーフラグ待
  if (SCI3.SSR.BIT.RDRF == 1) {
    c = SCI3.RDR;                       // データ取り出し
    SCI3.SSR.BIT.RDRF = 0;              // 受信フラグクリア
  } else {
    SCI3.SSR.BYTE &= 0x80;              // エラーフラグクリア
    c = 0;
  }
  return c;
}

 
1文字受信関数 rs_getc
 

while (!((SCI3.SSR.BYTE & 0x78) != 0)) ;

SCI3(シリアルコミュニケーションインタフェース)の初期化のところで説明したように、 シリアルステータスレジスタ(SSR)は、 送受信やエラーの状態を格納しています。。 ここでは、

SCI3.SSR.BYTE & 0x78

は、受信用のレジスタとエラーの状態を抜き出していることになります。。

この行は、、受信用のレジスタが利用不可であったり、エラーが発生している場合には、 何もしないというプログラムになっています。


SCI3.SSR.BIT.RDRF == 1;

レシーブデータレジスタにデータが書き込まれると、 RDRFが1になるので、この場合にはレシーブデータレジスタから値を読み取ることができます。


c = SCI3.RDR;

char型の変数cに、レシーブデータレジスタの値を代入しています。


SCI3.SSR.BIT.RDRF = 0;

レシーブデータレジスタにデータが書き込めるように、 SCI3.SSR.BIT.RDRFを1に設定します。


SCI3.SSR.BYTE &= 0x80;

レシーブデータレジスタにデータが書き込まれていない場合には、 TDRE以外を0に設定します。


c = 0;

ここでは、返り値が0の時にはエラーということにしているようです。

 
やってみよう
 
  1. シリアルデータ「受信」関数rs_getcは どのように使うのか、サンプルプログラムを用いて使い方を説明してください。
  2. シリアルの割り込み関数int_sci3を用いて、 1が送られて来たら左のLED、2が送られてきたら真中のLEDを点灯するプログラムを作ってみましょう (初期化関数は、割り込みを設定できるものを使ってください)。 その際、右のLEDは1秒ごとに点滅を繰り返すようにしておいてください。
  3. シリアルの割り込み関数を用いて、 周期が2.5mS、パルスのON時間が受け取った値によって0.3mS-2.1mSの間(180段階)で 変わるプログラムを作ってみましょう。 送信するデータは0から179の間とし、 0でパルスのON時間が0.3mS、179で2.1mSになるようにしてください。
 
2003/11/11(Tue)
AKI-H8/3664 QFP版のトップページへ
トップページへ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送