[H8-ML(645)] Re: H8 SCU1 文字抜け、化け 解決
From: Masataka Hirota <mhirota@xxxxxxxxxxxxx>
Date: 2000年06月07日(水)14時18分17秒
ROMのmhirotaです。
"Henry Sugimoto of O.B." wrote:

> 1msec の タイマー 割り込みで 、多重割り込み許可した上で、2
> msec間 通せんぼ(1msec タイマー値更新をループで待つ)したら、
> SCI1 の、送信で 再送信直後の 1文字が 抜け、化けを おこして
> いました。  原因は SSR をバイトで 読んでいなかった点でした。
> if(1==SSI1.SSR.BIT.TDRE); 等のみでは、動作が おかしくなって
> います。       フェイクで、RE,RI,TI,TEI 割り込みの最初に
>             int i;  
>             i=SCI1.SSR; 
> 
> を 行うと、動作が 正常になりました。  割り込み動作で、クリティカ
> ルなタイミングが ない場合、ビット操作のみで正常動作していました。
> 各フラグ ビットの 確認ではなく、SSR そのものを読むことで、改善
> された様に 感じます。  関連の、経験をされた方、ご意見をお聞か
> せ下さい。
 i=SCI1.SSR;
だけでは 根本的な解決にはなっていないと思います。各チャネルのSSRのフラグは
「書き込み」に行かないと消えません。SSRレジスタは「READ RESET REGISTER」
ではありません。
ですから、TDREビットが立っているとき「送信器が空になったな」と思って
データを書きますね。これだけではTDREが立ったままなので、次の送信データ
を書くためにTDRE=1の条件を待つループを作るとすぐにTDRE=1の条件一致
となるため、前にTDRに書かれてまだTSRに転送されていないデータの上に上書き
されてしまうおそれがあります。
 ですから、
 1:TDRE=1の条件成立を待つ。
 2:条件が成立したら、送信データをTDRに書く。
 3:TDRE=0とする処理を行う。
	:
	:
という一連の処理が無いと正常に動作しません。
また、杉本さんは「送信終了時割り込み=TEI」を使った送信処理をやっているよう
ですがこのときも送信割り込み発生要因フラグ(TEI)の解除には上記のTDREの
「リードモデファイライト動作」が必ず必要です。これをちゃんとやっていますか?

同様に、SSR内のRDRF,ORER,RER,PERフラグもリセットにはリードモデファイライト
が必要です。
-- 
/******************************************************************************
Name: "Masataka Hirota"
E-mail address:  mhirota@xxxxxxxxxxxxx
                 GCD03040@xxxxxxxxxxx
******************************************************************************/
スレッド概略
[644(R)](起点)
 └[表示中]


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


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