[H8-ML(3278)] Re: 割込みによるシリアル通信について
From: suzuki@xxxxxxxxxx (鈴木 政之)
Date: 2003年05月26日(月)10時14分29秒
鈴木です。
 割込みによるシリアル通信について
たくさんの方から回答をいただきましてありがとうございます。
ご返事を出せなかった方もおりましたが
たいへん感謝いたしております。

さて、皆様からの回答を元にイエローソフト環境での
割り込み処理の技術要素をまとめてみました。

1)#include <sysio.h>の記述

2)イエローソフトの割り込み関数は
 引数をとることも返すこともできないので
 割り込み関数とメイン側でやりとりする変数は
 グローバル変数をもちいなければならない。

3)割り込み関数の記述には、
  interrupt void 関数名(){
   
  }
  のように記述する。

4)割り込み有効 _ei();
  割り込み無効  _di();
  を用いる。

  尚、受信フルの個別ビットでの書き方は、
    SCI0.SCR.BIT.RIE = 1;	/* 受信割込み許可 */
    SCI0.SCR.BIT.RIE = 0;	/* 受信割込み禁止 */


5)初期化関数の記述方法
  下記pログラムに掲載。

6)ベクトルテーブルは、
 「プロジェクトの設定」の中に
 自動生成機能あり。
 ・受信フル割り込みのベクタ番号は、
  SCI0で、53番である
  (ハードウェアマニュアルp.130-参照)

です。

ところで、これをもとに下記のプログラムを作ってみました。
が、「1文字通信エラー」で延々とループしてしまいます。
(送った文字の数分のエラー以上、CRが来るまでループ)
おかしなところを、ご指摘いただけましたら幸いに存じます。
                (鈴木 政之)

-----------------------------------------------------------------
#include <3064.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysio.h>


char STR;		/*文字列の最初の文字*/

volatile int FLG;
unsigned char data;


/* シリアル通信初期化*******************************/
void sci0_init(void){
	SCI0.SCR.BYTE = 0x00;   /* SCI0設定 stop,内部クロック */
	SCI0.SMR.BYTE = 0x00;   /* data8.stop1,pari non Clockφ/4(1) */
	SCI0.BRR = 80;	        /* 25MHz Clockφ/4(1) 2400bps */
	#asm nop                /* Wait 1bit transfer time */
	SCI0.SCR.BYTE = 0x70;   /* Tx,Rx有効 ,受信割込み有効 */
	SCI0.SSR.BYTE &= 0x80;  /* エラーフラグのクリア */
	return;
}

/* SCI0から割込みで1文字受信する***************************/
intrxi1(void){
	switch(SCI0.SSR.BIT.RDRF)		/* 受信状態判定 */
	{
		case 1:				/* RDRF=1 正常受信 */
			data = SCI0.RDR;	/* data 取り出し */
			SCI0.SSR.BIT.RDRF = 0;	/* 受信フラグクリア*/
			break;
		default:			/* エラー発生時 */
			SCI0.SSR.BYTE &= 0xc7;	/* エラーフラグクリア */
	※ここがループ	→	printf("1文字受信エラー\n");
			return;
	}
}

/*1データブロック読み込み関数***************************************/
interrupt void intprg(void){
	char *p;			/*ポインタ変数*/
	p = &STR;			/*STR変数のアドレスにする*/

	/* STX-種別データ検出 */
	do{
		intrxi1();		/* 1文字受信 */
		*p = data;		/* 1文字を文字列に格納 */
		p++;			/* 次の文字アドレスへ */
	}while(data != '\r');	/* CRを検出 */
	FLG = 1;			/* 受信完了フラグ */                   
}

/* メイン関数***********************************************/
void main(void){
	printf("プログラム開始\n");
	sci0_init();	/*シリアルポート0の初期化*/
	SCI0.SCR.BIT.RIE = 1;		/* 受信割込み許可 */
	_ei();
	while(1){
		if (FLG) {
			printf("%s\n",STR);
			FLG = 0;
		}
	}
}

-----------------------------------------------------------------

----
鈴木 政之  suzuki@xxxxxxxxxx

スレッド概略
[3239(R)](起点)
 └[3260(U)]
   └[表示中]
     ├[3283(1)]
     └[3289(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]