こんにちは、NAKAと言います。
初歩的な質問かもしれませんが........
ハードフロー制御機能を持たない、R8Cのようなマイコンでハードフロー制御を行いたい場合接続先のRTSをINPUTピンでモニタしながら行いたいと思っています。マイコン側から割り込みを使った、TX(送信)を行おうと思いますが、接続先のRTSの準備ができていない場合、①割り込み関数の中で、RTSがOKになるまで待つ(While(RTS)というように)②接続先が準備できていないので受け取れないことを期待し、再度、送信空割り込みを発生させる ため、ダミーデータを送信レジスタに書いて、割り込み処理を抜ける。
を考えたのですが、
①の方法はRTSが準備できる間、CPUはその部分で止まってしまう。②はダミーデータを送信レジスタに書いた直後にRTSが準備できた場合、不要なデータを送ってしまう。というデメリットがあります。
一般的には、どのような方法を取るのでしょうか?
NAKAさんおひさです。
RTSをエッジ割り込みで使えば、RTSが変化するまでCPUは別の処理ができるのでいいのかなと思います。
Kirinさんおひさです。
相変わらず大活躍ですね!流石ぁ~!僕の先生!
すいません!まだ呑み込めてません.......涙
RTS信号を外部割り込み(INT)のエッジ動作を使うという意味?
ドライバーの作り方が悪いのかなぁ~??
こんな感じで送信してます。(コード貼った方がいいのかな?)
◎送信関数
送信レジスタに1つ目のデータ書き込み
残りをバッファに書き込み
↓
送信レジスタが送信して"空"割り込み発生
◎送信"空"割り込み関数
バッファが最後でないなら
次のバッファの内容を送信レジスタに書き込み
割り込みを抜ける
バッファの最後まで送信空割り込み関数が回りつづける
どのタイミングでRTSのエッジ割り込みをかけて、送信を止める
のか理解できてない感じです...........はずかしー!!
途中で止めちゃったら、"空"割り込みが次から発生しなくなる?
RTSのエッジ割り込みの中で、どんな処理するんだろう?
P.S.
久しぶりの書き込みでしたので、聞きたい部分だけ(いきなりハードフロー制御とか)
書いちゃいました。調歩同期のシリアル通信で....とか書くべきでしたね!
LogINしておらず、NewPOSTボタンも探しちゃいました.....汗)
NAKAさん
思いついたら自動返信ですから(笑)
NAKAさんの処理にエッジ割り込みを足してみました。
◎送信関数 全データをバッファに書き込み RTSをチェックしてOKなら、送信レジスタに1つ目のデータ書き込み、バッファのポインタをインクリメントして関数から抜ける。 RTSがNGなら、何も送信せずに関数から抜ける。 ↓ 送信空割り込み もしくは エッジ割り込み発生 ↓ ◎送信"空"割り込み関数とエッジ割り込み関数から共通のサブルーチンをコール RTSをチェックしてOKなら、 バッファが最後でないなら次のバッファの内容を送信レジスタに書き込み割り込みを抜ける。 RTSがNGならなにもせず割り込みから抜ける。 ↓ 送信空割り込み もしくは エッジ割り込み発生
バッファの最後まで送信空割り込み関数もしくはエッジ割り込み関数(から呼ばれる共通サブルーチン関数)が回りつづける。
こんな感じでいかがでしょう?