UARTの通信で親機と子機間で通信を行っています。
親機、子機とも同じプログラムを動作させています。
親機はUART1でPCからデータを受信し、自分宛ではない場合子機にそのままデータを
UART3で送信します。
子機はUART3で受信した内容の処理を行い、UART3で親機にデータを返します。
親機はUART3で受信したデータをUART1でPCにデータを送信するプログラムです。
下記2点についてお教え下さい。
1.デバッガーを接続した状態だと上手く動作するのに、書き込んで動作させると
正しく動作しない。
症状は数バイト余分に0のデータを受信してしまいます。
2.送信をする時に受信割り込みを発生しないようにしたい。
以上、宜しくお願いします。
1)デバッガを接続した状態だと動作する。これは「デバッガーで一度、ブレイクが入った後の再開がある」からだと思います。他の通信ノードとデータをやりとるするにあたり、それぞれの初期化完了までのシーケンスのタイミングが取れないのだろうと思います。マイコンが中継リレーをする実装なのですよね?まずはPCと一台目のノード間で取りこぼしなく実装してみて様子を見た方がいいように思います。余分な0のデータの受信があるとのことですが、もしかするとmain関数の初っ端の実動作開始前の初期化ルーチン前で1秒弱のビジーウェイトを設けると解決するかもしれません。2)もし、送信中に受信割り込みを禁止すると自分の送信中に受信データが来たときに取りこぼしになると思います。私なら「受信割り込み優先度>送信割り込み優先度」として送受信ともバッファリングを使い取りこぼしをなくす作りにします。送信処理と受信データの解析はバックグランド処理で行うのが良いと思います(もしくは送受信より優先度の低いタイマ割り込みなどを作ってサイクリック処理)。
あとRXマイコンを使用していた場合、かつ、スマートコンフィギュレータの生成コードを利用している場合、多重割り込みが許可されないのがデフォルトなので要注意です。
チョコです。
RL78でも、コード生成やスマートコンフィギュレータは多重割り込みには対応出来ていませんよ。
(RL78のフォーラムなので、RXは関係ありません。)
以上
マイコン関係なく多重割り込み許可してないんですね。これはルネサス側の人間はどう考えて、今のままを継続しているだろうか?
トピック違いですが今のスマートコンフィギュレータ仕様は勘弁してほしい。せめて「コード生成」ボタンを押す以外での自動生成は禁止して欲しい。手で修正した後、クリーンビルドした時にも自動生成が勝手に走るのにもうんざり。SCI調歩同期モードの生成コード、せめて、バッファリング処理部分の前後にユーザー処理を追記できるコメント行を追加して欲しい。そうしたら割り込み許可マクロを割り込みハンドラの先頭で追記でき、コード生成のたびの修正作業に追われる心配がなくなるのに。バッファリング処理が生成コードで実現しているシリアル系のものはほぼ同じことを感じます(SPI動作モード、I2Cマスターモード)。
>これはルネサス側の人間はどう考えて、今のままを継続しているだろうか?
ずっと前から、要求はしているのですが、採用してもらえません。それ以外にも、シリアル系の処理には問題が大ありだと問題提起をしています。通信は、相手があるものだということをきちんと理解していない人がたくさんいますよ。
それでも、スマートコンフィギュレータでは、個々のコンポーネントで独立しているので、初期化だけを利用し、そのほか自作することで、比較的簡単に多重割り込みに対応できるようにはなります。
さらに、いつもクレームをつけているのが、通信完了まできちんとサポートしていないことです。割り込み処理の中で、コールバックで対応していると言っているようなのですが、割り込み処理の中で時間がかかるような処理をやらせることは問題だと思っています。(これでも、少しは進歩してきているのですが。)
>手で修正した後、クリーンビルドした時にも自動生成が勝手に走るのにもうんざり。
クリーンビルドは気にしたことはありませんが、最初から初期化以外は使わないのも選択肢の一つです。
また、RL78のアプリケーション・ノート(サンプル・コード)には、条件付きコンパイル(#ifdef)とユーザ領域を使って、コード生成された処理は全て無視してフルスクラッチのプログラムを使っているのを見たことがあります。これなんかは、Yamamoto の言っている「せめて、バッファリング処理部分の前後にユーザー処理を追記できるコメント行を追加して欲しい。」をができないので、強引にインプリメントしている例でしょうね。
要望を出てても直らない。頭が硬いとかじゃなくてリソースが足りないんだろうな。。。そうであって欲しい。チョコさんの返答内容は私の知らなかったことで二点ありました。参考になります。自分のプロジェクトでもすぐに適用できそうな気がしますのでちょっと確認してみます。今までは#pragma interrupt行を検索してenableを追記していました。
>頭が硬いとかじゃなくてリソースが足りないんだろうな
それが一番の理由だと聞いたことはあります。
それと、通信は実際に使用していないと、単に動かしただけでは問題に気付けないのではないかと思います。
Yamamoto さん、内部の人から、以下の情報を入手しました。これが、Yamamoto さんの欲していた機能ですね。
RL78 スマート・コンフィグレータ V1.5.0 リリースノート (renesas.com)
のP8です。
やりたいことが出来ました。これで安心して眠れます。
これはどうやら生成コード部分の差分を厳密に管理しているみたいでコメント範囲以外の改行なりスペースなりがあった時に大変なことになるのも確認しました。再生成でも処理がちゃんと残るので多重割り込みで動くようになります。ビルドは確認しましたが、動作確認は明日に持ち越しです。大変有用な情報ありがとうございました。