- 締切済み
H8のITUトグル出力で 0出力で停止したい
ルネサス製H8/3052Fを使用しています。ITUを通常動作で使用して、GRAコンペアマッチでTIOAC端子からトグル出力を行う際にタイマを停止するとTIOACの出力レベルが 0 で停止してほしいのですが、停止した際に 0/1 どちらの状態になるかコントロールできずに困っています。 試しに、「タイマを停止するときにコンペアマッチで0出力を一度させてから停止する」という方法を使ってみたのですが、結果は変わりませんでした。以下、そのソースコードを記載します。どうやったらタイマ停止後に TIOCAの出力レベルを 0 にできるかアドバイスをいただけますようお願いします。 -------------------------------------------- #define ITU4_setBRA(val) ITU4.BRA = val // コンペアマッチによりBRAの値をGRAに自動転送 void ITU4_init(void){ ITU4.TCR.BIT.CCLR = 1; // GRAのコンペアマッチでTCNTをクリア ITU4.TCR.BIT.CKEG = 0; // 立ち上がりエッジでカウント ITU4.TCR.BIT.TPSC = 3; // φ/8 ITU4.TIOR.BIT.IOA = 3; // GRAコンペアマッチでトグル出力 ITU.TFCR.BIT.BFA4 = 1; // BRA4をGRAのバッファレジスタとして使用 ITU4.TCNT = 0; } void ITU4_start(void) { ITU4.TCNT = 0; ITU.TSTR.BIT.STR4 = 1; } void ITU4_stop(void) { int i; // 一度 GRAコンペアマッチで 0 を出力させてから、トグル出力に戻す。 ITU.TSTR.BIT.STR4 = 0; // カウント停止 ITU4.TIOR.BIT.IOA = 1; // GRAコンペアマッチで0出力 ITU4.GRA = 1; ITU4.BRA = 1; ITU.TSTR.BIT.STR4 = 1; // カウント開始 for(i=0; i<32; i++) ; // 無駄時間ループ ITU.TSTR.BIT.STR4 = 0; // カウント停止 ITU4.TIOR.BIT.IOA = 3; // GRAコンペアマッチでトグル出力 }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- macky_
- ベストアンサー率60% (3/5)
端子を TIOCA4 出力としていると、端子状態を任意に変更することは出来ないようです。 動作は未確認ですが、下記の方法はいかがでしょう? ・初期化の際、端子を PB2 出力になるように設定し、0 出力としておく。 ・スタート、ストップの時に、TOER の EA4 で端子出力を切り替える。(TIOCA4 <-> PB2)
お礼
macky_さん、回答ありがとうございます。 汎用出力ポートとして0出力する手も考えたことは考えたのですが、結局試さずに解決してしまいました。 アイデアは「タイマを停止するときにコンペアマッチで0出力を一度させてから停止する」ことで変わりありませんが、タイマを停止する ITU4_stop 関数の中を ITU4.GRA = 1; ITU4.BRA = 1; から ITU4.GRA = ITU4.TCNT + 2; // <-- ここがミソ ITU4.BRA = ITU4.TCNT + 2; // <-- ここがミソ に変更することで強制的にコンペアマッチさせてTIOCA4から0出力させることができました。(オシロスコープで確認しました。) 質問しておきながら自力で解決してしまいましたので、お礼がてら解決報告させていただきます。