タイマー割込みができない

コード生成ツールを使用して

チャネル0と3でPWM生成

チャネル1で100usec

チャネル2で1msec

チャネル5で250msec

の割込みをするように設定しています。

R_TAU0_Channel0_Start()を実行するとPWM出力が確認できるのですが、

R_TAU0_Channel1_Start()

R_TAU0_Channel2_Start()

R_TAU0_Channel5_Start()

を実行してもどのチャネルも割込みが発生しません。

実行した状態でレジスタの値を確認すると

TAU0ENは1が立っています。

TE0は指定ビットに1が立っています。

TMIF01,TMIF02,TMIF05も1が立っていますが

TMMK01,TMMK02,TMMK05も1が立っています。

R_TAU0_Channel1_Start()でTMMK01を0にしていますが

1のままです。

これが原因でしょうか?

なぜ、R_TAU0_Channel1_Start()を実行してもTMMK01が0にならないのでしょうか?

ご教示下さい。

Parents
  • チョコです。

    >TMMK01,TMMK02,TMMK05も1が立っています

    >これが原因でしょうか?

    これが原因だと思われます。TMMK0nビットは割り込みのマスクフラグです。このフラグがセットされていたら,割り込みが発生していても割り込みは受け付けられません。

    >なぜ、R_TAU0_Channel1_Start()を実行してもTMMK01が0にならないのでしょうか?

    コード生成で,問題のチャネルで下の図のように,チェックを外していませんか?

    そうするとR_TAU0_Channel1_Start()関数は以下のようになります。

    これが原因だと思われます。使われているR_TAU0_Channel1_Start()関数の処理内容とコード生成での設定内容を確認してください。

  • チョコさん

    色々削除してコード生成ツールで作成しただけに近い状態にしても同じ現象です。

    最低限にしたソースを添付しますので、確認して何処が悪いかお教え下さい。

     

     

    MOTOR-RL78_20191119-TIMER.zip

Reply Children
  • チョコです。

    R_Systeminit関数の中でIAWCTLレジスタに0x87をセットしているのが原因です。

    IAWCTLレジスタのビット1はGINTビットでこのビットは割り込み機能のレジスタのガードを制御するものです。

    これを1にすると,以下のようになります。

    有効。割り込み機能の制御レジスタのライト無効。リード可能。

    [ガードされるSFR]IFxx, MKxx, PRxx, EGPx, EGNx

    このために,TMMK0nビットへの書込みが禁止されています。

    手元にQB-R5F100LE-TBしかなかったので,CPUを変更して確認した結果を下に示します。

    main関数の頭でブレークをかけて,IAWCTLレジスタの値を0x87から0x85に変更してEI();まで実行しました。

    TMMK01,TMMK02,TMMK05がクリアされているのが分かります。

    SFRを変更する時にはガード機能は設定しないでください。

  • チョコさん

    ありがとうございます。

    タイマー割込みするようになりました。
    コード自動生成するとIAWCTLが0x87になってしうのは何処の設定でしょうか?
  • チョコです。

    IAWCTLは安全機能です。

    提示されたプロジェクトでは,「コード生成」の「クロック発振回路」の「安全機能」が以下のように設定されています。これが原因です。

    より厳密には,「割り込みレジスタのガード機能設定」が「使用する」にチェックされています。このためです。

    この設定は,全て初期設定が終わった直後に設定されていますが,本来は,タイマやシリアル等を起動(通常R_MAIN_UserInitで起動)した後で設定すべきものです。