鈴木さん>
> 第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文字を受信することが基本です。
鈴木(正)