STOPモードへの移行

RL78G14シリーズのマイコンで開発環境CS+,コンパイラはCA78K0Rを使用しています。

以下のように各割り込み動作を禁止し、キー割り込み許可とINTP02割り込み許可をしたあとに

コード内にSTOP()記述してSTOPモードにすれば、STOPモードに移行するのでしょうか。

他にウォッチドッグの割り込みも停止する必要があるのでしょうか。

オンチップデバッグで動作確認で、STOP()のあとに、ブレークポイントをつけたとき、STOP()モードに入ったあとに、割り込みがあるまでは

STOP()モードの下には、移行しないのでしょうか。移行してしまう場合は、なにかの割り込みが発生しているということでしょうか

正しい、STOPモードへの移行の仕方を教えてください。

1 //AD変換停止

2  ADCS = 0U; //AD変換停止
3  ADMK = 1U; //割り込み停止
4 ADIF = 0U; //割り込みフラグクリア

5 //タイマー停止

6 TT0 |= 0x0001;
7    /* Mask channel 0 interrupt */
8 TMMK00 = 1U;    /* disable INTTM00 interrupt */
9 TMIF00 = 0U;    /* clear INTTM00 interrupt flag */

10 //キー割り込み許可

11 KRM = 0x00 | 0x00| 0x00 | 0x08 | 0x10 | 0x00 | 0x00 |0x00;
12 KRIF = 0U;  // clear INTKR interrupt flag
13 KRMK = 0U; //キー割込み許可

14 //INTP2割り込み許可

15 PIF2 = 0U;//割込みを許可する
16 PMK2 = 0U;//割込みフラグをクリア

17 STOP();

18 //キー割り込みかINTP02割り込み入力があった場合・・・ここでブレークさせる

19 //タイマー割り込み許可

 20 TMIF00 = 0U;    /* clear INTTM00 interrupt flag */
 21 TMMK00 = 0U;    /* enable INTTM00 interrupt */
 22 TS0 |= 0x0001;

23 //AD変換開始

24 ADIF = 0U; //AD割り込みフラグクリア
25 ADMK = 0U; //AD割り込み許可
26 ADCS = 1U; //AD変換開始

  • チョコです。

    >コード内にSTOP()記述してSTOPモードにすれば、STOPモードに移行するのでしょうか。

    RL78はSTOP()で必ずSTOPモードになります。
    DI状態で,マスクされていない(xxMK=0の)割り込みがすでに発生(割り込み要求フラグがセットされている)していても,STOPモードにははいります。ただし,この場合には直ぐにSTOP()モードが解除されてしまいます。
    (EI状態なら,マスクされていない割り込みがSTOP()より前なら,先にベクタに飛んで割り込み要求はクリアされるはずで,その後STOP()でSTOPになるはずです。)


    >他にウォッチドッグの割り込みも停止する必要があるのでしょうか。
    ウォッチドッグ(WDT)の75%での割り込みも同様です。すべてのマスクされていない割り込み要求が解除要因になります。その割り込みでSTOPモードを解除したくなければ,マスクする必要があります。WDTでは,STOPモード時にもカウントを継続させるかカウントを停止するかの設定がオプションバイトの000C0H番地のビット0にWDSTBYONにあります。これを0にしておけば,STOPやHALTモードではWDTはカウントしなくなるので,必要に応じて設定してください。


    >オンチップデバッグで動作確認で、STOP()のあとに、ブレークポイントをつけたとき、STOP()モードに入ったあとに、割り込みがあるまでは
    >STOP()モードの下には、移行しないのでしょうか。移行してしまう場合は、なにかの割り込みが発生しているということでしょうか

    はい,そうです。


    >正しい、STOPモードへの移行の仕方を教えてください。

    STOPモードの解除に使用したい割り込み以外は全てマスク(xxMK=1に)し,解除に使用したい割り込みだけマスクを解除(xxMK=0に)してください。
  • 回答ありがとうございます。
    STOPモード中にキー割り込みが発生したとき
    以下のように割り込み処理関数内の動作と
    STOP()命令後の処理とどちらが先に動作するのでしょうか
    教えてください。
    keyinterrupflag = 0;
    .......................
    STOP();

    if(keyinterrupflag == 1){//キー割り込み発生フラグあり
    //ここにキー割り込み発生したときの処理を記述する
    }

    .............................................
    //キー割り込み発生動作
    __interrupt static void r_key_interrupt(void)
    {
    keyinterrupflag = 1; //キー割り込み発生フラグ
    }
  • チョコです。

    STOP状態で割り込みを受け付けると,STOP解除後は直ぐに割り込み処理に分岐します。

    つまり,if文よりも割り込み処理の方が先に実行されます。

    昔は,STOP()の次の1命令を実行して割り込みに分岐するようなマイコンもあったようですが,

    RL78はSTOP解除ですぐに割り込み処理に飛びます。

    ここらが気になるならば,STOP()の次にNOP()をいくつか入れておけばいいですよ。

    一応,RL78/G13(RL78/G14環境が手元になかったので)で確認しましたが,割り込みを

    受け付けた際にスタックにセーブされたPCの値をメモリで確認した結果を添付しておきます。

     

    STOP状態での割り込み.pdf

  • チョコです。

    RL78/G14の環境が準備できたので,RL78/G14でも確認してみました。

    結果と確認で使用したプロジェクトをzipで圧縮したものを添付しておきます。

    もし,bosssaさんの方で,if文が満足できない結果になっているのであれば,

    他の割り込みでSTOPモードが解除されているか,CPUが割り込み禁止

    (IEビットが0の状態)になっていて,割り込みがSTOPモードの解除だけに

    使用されていると考えられます。

     

    STOP状態での割り込み.zip