[H8-ML(3292)] Re: [H8-ML(3291)] Re: 割込みによるシリアル通信について
From: "Masanobu Suzuki" <signas@xxxxxxxxxxxxxxx>
Date: 2003年05月26日(月)20時49分43秒
鈴木さん>
> 第2番目のプログラムですが、受信フルの割り込みが起こると
> 割り込み処理(RXI0_Interrupt関数)に飛んでいますが、
>   while((SCI0.SSR.BYTE & 0x40) == 0x40){    /* RDRF(受信データフル)の確認
*/
>    RXBUF[rx_len++] = SCI0.RDR;              /* バッファへの書き込み */
>    rx_phase = 1;                                     /* 受信データがあ
るよん */
>   }
> で、無限ループになってしまい、メインルーチンに戻らなくなってしまいます。

H8のステータスレジスタは、レジスタをread後、ゼロクリア(0をwrite)
するまでは値を保持します。
従って、RDRFbitはいつまでも'1'になっていますから無限ループする
はずです。


>while((SCI0.SSR.BYTE & 0x40) == 0x40){   /* RDRF(受信データフル)の確認 */

これはRDRFbitによる受信割り込みですから、RDRFbitはチェックする
までもなく必ず'1'です。従って、SSRレジスタをread後、RDRFbitを落と
すだけで十分です。
尚、RDRFbitをクリアするタイミングは、受信割り込みルーチンの先頭
で行なった方が良いです。

まぁ、おまじないだと思って、

interrupt void RXI0_Interrupt(void) {
    SCI0.SSR.BYTE &= ~(0x40);	/* RDRFフラグをクリア */
    ・・・(必要な処理)・・・・・・
}
の構成とされた方が良いでしょう。他の割り込みもルーチンも、基本的には
このスタイルです。

また、While文で
>RXBUF[rx_len++] = SCI0.RDR;             /* バッファへの書き込み */

でバッファにデータを蓄積しようとしていますが、SSRは1バイトのバッファ
ですから、割り込みの中で複数の文字を受け取ることはできません。
受信割り込みは、あくまでも1文字を受信することが基本です。

鈴木(正)

スレッド概略
[3288(R)](起点)
 └[3291(U)]
   └[表示中]
     ├[3293(1)]
     └[3304(2)]


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


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