鈴木です。
割込みによるシリアル通信について
たくさんの方から回答をいただきましてありがとうございます。
ご返事を出せなかった方もおりましたが
たいへん感謝いたしております。
さて、皆様からの回答を元にイエローソフト環境での
割り込み処理の技術要素をまとめてみました。
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