UARTの通信

UARTの通信で親機と子機間で通信を行っています。

親機、子機とも同じプログラムを動作させています。

親機はUART1でPCからデータを受信し、自分宛ではない場合子機にそのままデータを

UART3で送信します。

子機はUART3で受信した内容の処理を行い、UART3で親機にデータを返します。

親機はUART3で受信したデータをUART1でPCにデータを送信するプログラムです。

下記2点についてお教え下さい。

1.デバッガーを接続した状態だと上手く動作するのに、書き込んで動作させると

  正しく動作しない。

  症状は数バイト余分に0のデータを受信してしまいます。

2.送信をする時に受信割り込みを発生しないようにしたい。

以上、宜しくお願いします。

  • ・RS442トランシーバを使ってもRS485トランシーバを二つ使ってもRS422は実現できる
    ・RS422トランシーバを使ってもRS485は実現できない
    →これ重要です。ただ、配線が多くなるのでRS422ってのは全二重にしたいとかRS232のシステムの物理層のみアプグレードになるのでまだ実システムでRS422を見たことがないです。

    RS485を使う時、皆さんはどうやってDE信号線の操作させていますか?先日、送信終了後のDE信号線を操作してバス開放するまでの規定時間が短い案件(最大0.5us、RS485通信タイプのアブソエンコーダ)があって、他の処理との優先順位の関係で、RS485の自分自身の送信データによる受信完了の割り込みのタイミングではたまに規程時間をオーバーするという目に会いました。最終的にはDTCを使ってDEピンにつながるGPIO出力ピンを直接操作するという方法で解決できましたが、RS485対応はどのマイコンでも何かしら一手間ありますね。

  • 要望を出てても直らない。頭が硬いとかじゃなくてリソースが足りないんだろうな。。。そうであって欲しい。

    チョコさんの返答内容は私の知らなかったことで二点ありました。参考になります。自分のプロジェクトでもすぐに適用できそうな気がしますのでちょっと確認してみます。今までは#pragma interrupt行を検索してenableを追記していました。

  • >RS485を使う時、皆さんはどうやってDE信号線の操作させていますか?

     送信部の出力を切断する信号制御ですか?

     送信が終了のフラグが有るので、ポーリングで監視するか割り込み処理を使い制御します。

  • TEIフラグってスマートコンフィギュレータ生成コードだと要因にならないですよね?生成コードはTXIのタイミングで送信データバッファが空になったタイミングでの割り込みとなり、内部のシリアル送信は最後の1データを送信し切ってない状態ですからDE信号の処理に使いたいタイミングより前なのです。なので常時受信で受信完了タイミングでって実装をしたのですが、0.5usってあっという間にですので、モーター制御とかやってる処理の優先度の方が高く設定している都合、DTCを持ち出す必要が出ました(TEIはDTCの動作要因にならないので受信完了を要因としました)。スマートコンフィギュレータを使わなければって言われそうですが、初期化ルーチンなどを全て自分で書けるレベルまで到達できてない若輩者でした。

  • チョコです。

    >頭が硬いとかじゃなくてリソースが足りないんだろうな

    それが一番の理由だと聞いたことはあります。

    それと、通信は実際に使用していないと、単に動かしただけでは問題に気付けないのではないかと思います。

    以上

  • RX621のデータシートのSCI関係に次のフラグが有ります。

    29.2.1.7 シリアルステータスレジスタ(SSR)

    TEND  送信完了フラグ

    TDRE   送信データエンプティフラグ

    TDRE は送信データをバッファに書き込んで良いと言うフラグ。絶え間なく連続でデータを送信する時、次のデータをバッファに書き込めると言うフラグ。

    TEND は最後のデータが送られて、ストップビットが送られた後に立つフラグ。TEND のタイミングで RS422/RS485 の出力を遮断してハイインピーダンスにします。

    昔の8251と言う調歩同期式のLSIだと TxE と言う信号が出ているので、これで制御すれば速い。TxE は TEND と同じです。TxE はLSIの信号ピンの名前、TEND はステータスレジスタの、あるビットの名前です。

    >TEIフラグってスマートコンフィギュレータ生成コードだと要因にならないですよね?

     どこのフラグかな?僕はハードウェアマニュアルを見て全部のレジスタを書き出してプログラムしています。スマートコンフィギュレータの事は分かりません。

    >DE信号の処理に使いたいタイミングより前なのです。

     それは前述の TDRE による割り込みですね。TEND による割り込みはスマートコンフィギュレータには無いんですか?

     最初の  さんの質問からだいぶ横道に逸れちゃったけど。

  • ちょこさま

    色々ご教示ありがとうございます。

    何故か上手くログインできなくて、返信ができませんでした。

    受信割り込みを禁止にする件は、ご指摘いただいた内容で解決できました。

    デバッガを接続だと上手く動作し、書込みをすると上手く動作しなかった件は

    何が悪かったのか不明ですが、書込みでも上手く動作するようになりました。

    ありがとうございます。

  • チョコです。

    wakaさん、ともかく動くようになったとのこと、よかったですね。

    おかしいことがあったら、可能ならプロジェクトをzipで添付してもらうと、解析がしやすいです。

    以上

  • チョコです。

    Yamamoto さん、内部の人から、以下の情報を入手しました。これが、Yamamoto さんの欲していた機能ですね。

    RL78 スマート・コンフィグレータ V1.5.0 リリースノート (renesas.com)

    のP8です。

    以上

  • やりたいことが出来ました。これで安心して眠れます。

    これはどうやら生成コード部分の差分を厳密に管理しているみたいでコメント範囲以外の改行なりスペースなりがあった時に大変なことになるのも確認しました。再生成でも処理がちゃんと残るので多重割り込みで動くようになります。ビルドは確認しましたが、動作確認は明日に持ち越しです。

    大変有用な情報ありがとうございました。