お世話になっております。RX651のSCI通信で、接続先の機器でフレーミングエラーを発生させても、グループ化された割込み(Excep_ICU_GROUPBL0(void))に飛んで来ません。そもそも他のプログラムではフレーミングエラーが発生した場合グループ化された割込みに飛んできて、そこでエラー処理して継続動作が可能でした。
その実績があるコードを流用していますが割込みに飛んでこない原因が分かりません。どのたかご教授お願いします。
こんにちは、hira です。
情報が少なくて、適切なコメントが出来ないのですが・・・
エラー発生時「エラー割り込みが発生しない」事は通常起こらないので、
SCI8、SCI9、SCI10、SCI11を使っていますか?
SCI8、SCI9 のエラー割り込みは「GROUPBL1」
SCI10、SCI11 のエラー割り込みは「GROUPAL0」です。
※違うのなら、スルーして下さい。
こんにちは、hiraさん
Replyありがとうございます。こちらの情報が少なくて申し訳ありません。SCI6を使っています。
>エラー発生時「エラー割り込みが発生しない」事は通常起こらないこの言葉は心強いです。なにか設定がたりないのかとも思いましたがドキュメント読んでも見当たらず悩んでいます。別のプログラムでは、同じハード上で割り込んでくるのでその差が理解できていません。
念の為、「GROUPBL1」と「GROUPAL0」にブレークポイントを設定してエラーを発生させましたが、どちらもブレークしませんでした。
ありがとうございました。
初期化方法の確認、スマートコンフィギュータを利用すると良いと思います。
もちろんスマートコンフュギュレータにバグが完全にないとは言いませんが、チャンネルごとの細かい違いなどもちゃんと考慮してコードを生成してくれます。
Yamamotoさん、
ありがとうございます。自分にとってスマートコンフィギュータのハードルが高くて使っていませんでしたが、スマートコンフィギュータなら今回のような事で悩むこともなさそうです勉強してみます。
リカルドです。
RX621を使っています。H8からRX621に移った時、次の点が違っていました。 省電力のために、I/O装置の電源制御が有る。 SCIの割り込みをイネーブルするだけでは無く、割り込みコントローラを制御する必要が有る。 SCIは割り込みに設定しておいて、割り込みコントローラを制御する使い方が良さそうだ。
ちょっと試してみました。
// SCI6 RXI6 #pragma interrupt Intr_SCI6_RXI6(vect=86) void Intr_SCI6_RXI6(void); // SCI6 TXI6 #pragma interrupt Intr_SCI6_TXI6(vect=87) void Intr_SCI6_TXI6(void); // GROUPBL0 #pragma interrupt Intr_GROUPBL0(vect=110) void Intr_GROUPBL0(void); #ifdef __cplusplus //#include <ios> // Remove the comment when you use ios //_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios #endif void main(void); #ifdef __cplusplus extern "C" { void abort(void); } #endif void main(void) { SYSTEM.PRCR.WORD = 0xA502; MSTP(SCI6) = 0U; //割り込み優先度 IPR(SCI6, RXI6) = 4; IPR(SCI6, TXI6) = 4; IPR(ICU,GROUPBL0) = 4; SCI6.SCR.BYTE = 0x00; SCI6.BRR = 0xC2; //9,600bps(PCLKB=60MHz) SCI6.SMR.BYTE = 0x00; SCI6.SCMR.BYTE = 0x00; MPC.PWPR.BIT.B0WI = 0; MPC.PWPR.BIT.PFSWE = 1; //RXD6->P01 MPC.P01PFS.BYTE = 0x0A; PORT0.PMR.BIT.B1 = 1; //TXD6->P00 MPC.P00PFS.BYTE = 0x0A; PORT0.PMR.BIT.B0 = 1; //グループBL1割り込み ICU.GENBL0.BIT.EN12 = 1; //TEI6 ICU.GENBL0.BIT.EN13 = 1; //ERI6 //割り込みフラグクリア IR(SCI6, TXI6) = 0; IR(SCI6, RXI6) = 0; IR(ICU,GROUPBL0) = 0; //割り込み許可 IEN(SCI6, TXI6) = 1; IEN(SCI6, RXI6) = 1; IEN(ICU,GROUPBL0) = 1; //通信開始 SCI6.SCR.BYTE = 0xF0; //ここではTEI割り込みは有効化しない while(1) { __nop(); } } #ifdef __cplusplus void abort(void) { } #endif void Intr_SCI6_RXI6(void) { unsigned char dummy; dummy = SCI6.RDR; } void Intr_SCI6_TXI6(void) { __nop(); } void Intr_GROUPBL0(void) { //TEI6 if (ICU.GRPBL0.BIT.IS12 == 1) { __nop(); } //ERI6 if (ICU.GRPBL0.BIT.IS13 == 1) { SCI6.SSR.BYTE &= ~0x38; //エラークリア } }
添付のソースで動かしたところ、思ったところに飛んできています。
SCIを動かすのに(ほぼ)最低限のコードで構成していますので、何か抜けている設定がないか見てみてください。
リカルドさん、こんばんは
ご指摘の件で問題があるとSCIそのものが動作しないかと思います。通常の送受信は正常で、受信割込みはかかります。念の為確認します。ありがとうございます。
tfさん、こんばんは
サンプルコードありがとうございました。結論を言えば、このコードでエラーの割込み発生しました。自分のRX651は100ピンなのでSCI6のポート番号はサンプルと異なりますが、100ピンのP32とP33に変更したところ問題なくフレーミングエラー発生で割込みかかります。自分のコードに足りない部分をこれから検証します。逆に自分が作った他のプログラムで動いているのが不思議で、たまたま動いているだけで正しく動いていないのだと思います。
tfさん
こんばんは、サンプルコードありがとうございました。このコードで動かしたところ、GROUPBL0に飛んできました。これから自分のコードに何が足りなかったかを調べます。また、自分が作成した他のプログラムでは正常に動作していたのが不思議で、たまたま動いていただけで正しく動作していなかったのではないかと思います。ありがとうございました。