H8/3694のタイマVでTMOVの出力がOFFになるタイミングがある

H8/3694のタイマVを使用しています。

内部クロックΦ/4、TCORA=100(約20us)、TCORB=10(約2us)の設定でAとBのコンペアマッチでTMOVからパルス出力をします。

TCORAとTCORBの割り込みタイミングに割り込み処理から同じ値を書き込みすると、不定期ですがTMOVの出力で50usOFFすることがあります。

TMOVの出力がOFFする原因をご存じの方はいないでしょうか?

  • ukishimaさん
    ソースがどうなっているのかですが
    繰り返しを行う場合は自動クリアでするのが普通であると思いますが
    タイマー再設定はカウントを停止させてからしないといけないと思います
  • IKUZOさん、ご意見ありがとうございます。
    ソースは下記の通りです。
    ご指摘のようにタイマー再設定でカウントの停止が抜けているのだと思います。
    カウントの停止を記述して確認してみます。
    他に気になることがありましたらご指摘ください。

    #define CNT_SCN 100

    init(){
    IO.PCR7 = 0x8F; //ポート7 1000 1111 5,6,7ポートを入力に設定

    //タイマVレジスタ設定
    TV.TCRV0.BYTE = 0x09; //0000 1001 タイマV設定 20MHz/4に設定
    TV.TCNTV = 0; //カウンタ0
    TV.TCSRV.BYTE = 0x06; //TMOV出力
    TV.TCORA = 100; //コンペアマッチA 設定
    TV.TCORB = 10; //コンペアマッチB 設定
    }

    void int_timerv( void )
    {
    if( TV.TCRV0.BIT.CMIEA == 1 ){
    TV.TCORA =100;

    TV.TCRV0.BIT.CMIEA = 0;
    }
    }

    void main( void )
    {
    int scn = 0;

    init();

    while( 1 ){
    if( TV.TCRV0.BIT.CMIEA == 0 ){
    scn++;

    if( scn >= CNT_SCN ){

    TV.TCRV0.BIT.CMIEA = 1;

    scn = 0;
    }
    }
    }
    }
  • こんにちは。Steinenです。
    最近、かふぇルネを訪問するようになり、タイマVという名称が気になって、拝見したところ、解決したかが分からなかったので、数年前の投稿ですが、念のため、投稿します。


    「TMOVの出力がOFFになる」を、期待するパルス出力がなく、出力が固定されている状態であると考えると、H8/3694のハードウェアマニュアル「11.6使用上の注意事項」No.2に該当している可能性があります。
    この注意事項には、TCORへのライトサイクルのT3ステートでコンペアマッチが発生した場合、コンペアマッチ信号は禁止されます、とあり、ご使用の状態に当てはめると、期待しているコンペアマッチAが発生せず、1出力が行われない(TMOV出力の0が続く)状況になると思います。


    プログラムを拝見すると、タイマの動作開始後、ある時点で(タイマのカウント状態と関係なく)、割り込みイネーブルビットCMIEAを1にセットしているようです。その時点では、過去のコンペアマッチによって、割り込み要因フラグCMFAはセットされている可能性があります。この場合は、直ちに、割り込み処理プログラムint_timervが実行され、そのときのTCNTの値によっては(TCORAの手前の値になっていると)、ある確率で、上記の注意事項に該当することがと考えられます。


    対策としては、int_timervでのTCORAへのライトを削除できそうな気もしますが、それが望ましくないのであれば、CMIEAを1にセットする前に、CMFAを0にクリアすることが考えられます。この場合、次のコンペアマッチまで待ってから、int_timervが実行されるようになり、
    このときは、TCNTは(クリア後の)TCORAより十分小さい値なので、上記の注意事項に該当しなくなると期待できます。


    なお、上記の注意事項について、RXの8ビットタイマでも同様になっているようです。