{{category 電子工作}} !!!現象 ルネサスの 32bit マイコン SH2A シリーズ(実際に経験したのは、SH72167F) の MTU2(S) において、CH3,CH4 で 通常、PWM モードのコンペアマッチ出力ピンに出力が出ない。 PFC で通常の出力ポートに設定すると、H,L 出力はされる。 また、TIOC3A,C にはまったく同じコードで正常に出力されるのに、TIOC3B(S),TIOC3D(S),TIOC4A-D(S) だけ出力されない。 !!!原因 一部のタイマ出力にだけ、余計な出力イネーブルレジスタ(TOER)が存在する。これが初期状態では無効になっている。 !!!対処 使用する出力端子に応じ、下記のコードをタイマ(MTU2,MTU2S 初期化に)追加して有効化する。下記は、MTU2Sの場合の例。MTU2 も同様 // TOER の設定 // 出力端子のTIOC4D、TIOC4C、TIOC3D、TIOC4B、 // TIOC4A、TIOC3B の出力設定の許可/禁止を行います。 // *これらの端子はTOER の各ビットの設定をしないと正しく出力されません。* // チャネル3、4 において、TOER はチャネル3、4 のTIOR 設定の前に値をセットしてください。 MTU2S.TOER.BIT.OE4A = 1 ; //MTU2S.TOER.BIT.OE4B = 1 ; //MTU2S.TOER.BIT.OE4C = 1 ; //MTU2S.TOER.BIT.OE4D = 1 ; //MTU2S.TOER.BIT.OE3B = 1 ; //MTU2S.TOER.BIT.OE3D = 1 ; !!!考察 ちょうど POE2 (特定の条件で特定のピンをハイインピーダンス状態にする機能)の対象ピンと被るので、こちらと勘違いする場合がある。 出力できない際に、該当端子がハイインピーダンスでなければ、POE2 は原因から除外できる。 また、SH2A は各ユニットが初期状態でスリープ(省エネ設計?)しているので、STB レジスタで起こしてやる必要がある。 STB.CR3.BIT._MTU2S = 0; /* MTU2Sにクロックを供給 */ タイマレジスタの値がおかしかったり、カウントアップされない場合はこちらもチェック。 そのほか、PFC で該当ピンを TIOCxx の出力に設定してやる必要もある。 PFC.PDCRH3.BIT.PD27MD = 0x5; /* PD27=TIOC4AS(0b101) */ PFC.PDIORH.BIT.B27 = 1 ; /* TIOC4AS is OUT */ MTU2S4 でコンペアマッチ出力をする場合をまとめると、 STB.CR3.BIT._MTU2S = 0; // MTU2Sにクロックを供給 MTU2S.TSTR.BIT.CST4 = 0 ; // TCNT4 STOP MTU2S4.TMDR.BIT.MD = 0x0 ; // MTU2S4:NORMAL MTU2S4.TCR.BIT.TPSC = 0x2 ; // CLK = Pφ div 16 MTU2S.TOER.BIT.OE4A = 1 ; // *今回のハマりどころ* MTU2S4.TIOR.BIT.IOA = 0x3 ; // 3 - TIOC4AS:初期値0,TGRA のコンペアマッチでトグル(0b0011) MTU2S4.TCR.BIT.CCLR = 0x1 ; // 1 - TGRA コンペアマッチでクリア MTU2S4.TGRA = (コンペアマッチ値) ; // コンペアマッチ値 MTU2S4.TCNT = 0x0000 ; // カウンタを 0 に MTU2S.TSTR.BIT.CST4 = 1 ; // スタート PFC.PDCRH3.BIT.PD27MD = 0x5; // PD27=TIOC4AS(0b101) PFC.PDIORH.BIT.B27 = 1 ; // TIOC4AS is OUTPUT しかし、ピンにあまりにたくさん機能を割り付けたせいなのか、つくづく面倒くさい設計になっているなぁ。