コード生成ツールを使用して
チャネル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にならないのでしょうか?
ご教示下さい。
チョコです。
>TMMK01,TMMK02,TMMK05も1が立っています
>これが原因でしょうか?
これが原因だと思われます。TMMK0nビットは割り込みのマスクフラグです。このフラグがセットされていたら,割り込みが発生していても割り込みは受け付けられません。
>なぜ、R_TAU0_Channel1_Start()を実行してもTMMK01が0にならないのでしょうか?
コード生成で,問題のチャネルで下の図のように,チェックを外していませんか?
そうするとR_TAU0_Channel1_Start()関数は以下のようになります。
これが原因だと思われます。使われているR_TAU0_Channel1_Start()関数の処理内容とコード生成での設定内容を確認してください。
チョコさん
色々削除してコード生成ツールで作成しただけに近い状態にしても同じ現象です。
最低限にしたソースを添付しますので、確認して何処が悪いかお教え下さい。
MOTOR-RL78_20191119-TIMER.zip
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は安全機能です。
提示されたプロジェクトでは,「コード生成」の「クロック発振回路」の「安全機能」が以下のように設定されています。これが原因です。
より厳密には,「割り込みレジスタのガード機能設定」が「使用する」にチェックされています。このためです。
この設定は,全て初期設定が終わった直後に設定されていますが,本来は,タイマやシリアル等を起動(通常R_MAIN_UserInitで起動)した後で設定すべきものです。