HEW組み込み関数 set_imask_ccr()について

HEWの組み込み関数set_imask_ccr()で割り込みのマスクと許可を使用としました。

しかし、set_imask_ccr(0)でも割り込みが継続しません。

include <_h_c_lib.h >を入れてもダメでした。

set_imask_ccr(0) マスク

set_imask_ccr(1) 許可としたときは

1回だけ割り込みが入ったような気がします。

どこかのF&AでCCRのIレジスタは割り込みのたびにクリアしなければならない。

ようなことが書いてありました。しかし、マニュアルでは一言も書いてありません。

またサンプルでも割り込みでクリアした例もありません。

H8/3694を使っており、HEWのバージョンは4.06.00.047です。

この環境では上記組み込み関数は使えないのでしょうか。

よろしくお願いいたします。

Parents
  • どのようなソースを書かれてどのようなコードが生成されてますか?

  • ソースは仕事で使っている実際のものなので、テスト用に簡単なものを作成してみます。

    少し、お時間をください。

    よろしくお願いいたします。

  • sakuraisanさま、こんにちはNAKAといいます。

    H8はかなり前にしか使ってませんでしたので、記憶違いでしたらごめんなさい!set_imask_ccr()を使うなら、#include <machine.h>が必要だったような気がします。確認ください。

  • 何の割り込みなのでしょうか?

    割り込みによっては割り込み要求フラグをクリアしないと、次の割り込みがかからなかったり、割り込みルーチンをを抜けてもすぐに割り込みルーチンに戻ってくるはず。

    set_imask_ccrは操作する必要はありません。

  • ソースを作ってテストしてみました。

    問題なく動きました。

    プログラムは一部を下記に入れました。

    メインで_di(),wait,_ei(),waitを繰り返します。

    10msのタイマー割り込みがメインの_di()のとき、

    割り込みが入らないことを確認しました。

    set_imask_ccr()はdi(),ei()の中で使用しています。

    割り込み時のポート出力と、メインでのポート出力をオシロで確認しました。

    あとは仕事で作成しているプログラムでなぜ、動かないのか

    じっくり検討してみます。

    ありがとうございました。

    void main( void )

    {

    unsigned int i1,i2;

    BYTE chg = 0;

    for( i1=0; i1<16250; i1++ ){

    for( i2=0; i2<20; i2++ );

    }

    _di( );

    InitPort();

    InitTimer();

    InitIrqControl( );

    WdOnReset( ); // ウォッチドック タイマー 初期化

    chg = 0;

    _ei( );

    for( ;; ){ //------------- 永久ループ----------------

    if( T50mS ){ // 50mSec. ごと

    T50mS = 0; // フラグクリヤー

    }

    if( T10mS ){ // 10mSec.ごと

    T10mS = 0; // フラグクリヤー

    }

    _di();

    IO.PDR2.BIT.B1 = 1;

    for( i1=0; i1<65000; i1++ ){

    WdOnReset( ); // ウォッチドック リセット

    }

    IO.PDR2.BIT.B1 = 0;

    _ei();

    for( i1=0; i1<65000; i1++ ){

    WdOnReset( ); // ウォッチドック リセット

    }

    } //--------------------------------------

    }

    /************************************************

    **     << 割り込み禁止  >>                   **

    **                                             **

    ************************************************/

    void _di( void )

    {

    set_imask_ccr(1);

    }

    /************************************************

    **     << 割り込み許可  >>                   **

    **                                             **

    ************************************************/

    void _ei( void )

    {

    set_imask_ccr(0);

    }

    //--------------------------------

    //  10mSec. 割り込み ルーチン

    //--------------------------------

    void Timer_W( void ) // (V:21)

    {

    TW.TSRW.BYTE &= 0x70; // タイマ-・ステータス・レジスタ (STR0) 設定

    T10mS = 1;

    iwCnt++;

    if( iwCnt >= 5 ){ // 5回なら

    iwCnt = 0;

    T50mS = 1; // 50mSec. フラグ ON

    }

    IO.PDR2.BIT.B2 ^= 1;

    }

Reply
  • ソースを作ってテストしてみました。

    問題なく動きました。

    プログラムは一部を下記に入れました。

    メインで_di(),wait,_ei(),waitを繰り返します。

    10msのタイマー割り込みがメインの_di()のとき、

    割り込みが入らないことを確認しました。

    set_imask_ccr()はdi(),ei()の中で使用しています。

    割り込み時のポート出力と、メインでのポート出力をオシロで確認しました。

    あとは仕事で作成しているプログラムでなぜ、動かないのか

    じっくり検討してみます。

    ありがとうございました。

    void main( void )

    {

    unsigned int i1,i2;

    BYTE chg = 0;

    for( i1=0; i1<16250; i1++ ){

    for( i2=0; i2<20; i2++ );

    }

    _di( );

    InitPort();

    InitTimer();

    InitIrqControl( );

    WdOnReset( ); // ウォッチドック タイマー 初期化

    chg = 0;

    _ei( );

    for( ;; ){ //------------- 永久ループ----------------

    if( T50mS ){ // 50mSec. ごと

    T50mS = 0; // フラグクリヤー

    }

    if( T10mS ){ // 10mSec.ごと

    T10mS = 0; // フラグクリヤー

    }

    _di();

    IO.PDR2.BIT.B1 = 1;

    for( i1=0; i1<65000; i1++ ){

    WdOnReset( ); // ウォッチドック リセット

    }

    IO.PDR2.BIT.B1 = 0;

    _ei();

    for( i1=0; i1<65000; i1++ ){

    WdOnReset( ); // ウォッチドック リセット

    }

    } //--------------------------------------

    }

    /************************************************

    **     << 割り込み禁止  >>                   **

    **                                             **

    ************************************************/

    void _di( void )

    {

    set_imask_ccr(1);

    }

    /************************************************

    **     << 割り込み許可  >>                   **

    **                                             **

    ************************************************/

    void _ei( void )

    {

    set_imask_ccr(0);

    }

    //--------------------------------

    //  10mSec. 割り込み ルーチン

    //--------------------------------

    void Timer_W( void ) // (V:21)

    {

    TW.TSRW.BYTE &= 0x70; // タイマ-・ステータス・レジスタ (STR0) 設定

    T10mS = 1;

    iwCnt++;

    if( iwCnt >= 5 ){ // 5回なら

    iwCnt = 0;

    T50mS = 1; // 50mSec. フラグ ON

    }

    IO.PDR2.BIT.B2 ^= 1;

    }

Children
No Data