H8/36064 SLEEP命令での直接遷移

はじめまして。

ヴィストン社のビュートローバというキットを利用して、

H8/36064の組込み開発を学習しています。

システムクロックを分周(12MHz→1/16)したいのですが、上手くいきません。

開発環境はHEWを使用して、

スタートアップなどは自動生成したものをそのまま使用しています。

main関数内に以下のように記述しましたが、

SLEEP命令後にmain関数に戻ってきていないように思います。

どなたか、お知恵を貸していただけませんでしょうか?

/*--- ソース ---*/

SYSCR1.BIT.SSBY = 1;
SYSCR2.BIT.SMSEL = 0;
SYSCR2.BIT.MA = 0x05;

IENR1.BIT.IENDT = 1;
IRR1.BIT.IRRDT = 0;

SYSCR2.BIT.DTON = 1;
set_imask_ccr(0);

sleep();

set_imask_ccr(1);

IO.PCR6 = 0x15;

for( ;; )
{
IO.PDR6.BIT.B0 = 0;


}

Parents
  • 細かくは見ていませんが、sleepして戻ってこないのは、マイコンが無事に眠りについて起こされるのを待っている状態ではないでしょうか。意図が周波数を下げたいだけなのか、それとも何かの操作を行うまでスリープさせたいのか、もう少し詳しく説明していただけるとアドバイスしやすいと思います。眠れる森の美女は王子様のキスで目覚めるのですが、眠れるマイコンは割り込みで叩き起こさないと目覚めません。

  • アドバイスありがとうございます。

    やりたいことは、周波数を下げたいだけなのです。

    ハードウェアマニュアルを見ると、

    周波数を下げるためには、ダイレトクトランスファビット(SYSCR2.BIT.DTON)を1にして、SLEEP命令を実行すればよいとあります。

    このとき、該当する割込み許可ビット(IENR1.BIT.IENDT)も合わせてイネーブルにすることとあります。

    指示通りに処理をしているつもりなので、

    アクティブモード→アクティブモードの直接遷移が期待される動作なのですが、

    ご指摘の通り、アクティブモード→スリープモードになっているように思います。

    アクティブモード→アクティブモードなので、

    王子様のキスは必要ないと考えているのですが。。。

  • アドバイスありがとうございます。

    ご指摘の通りなのですが、

    『H8/36064 グループ ハードウェアマニュアル』の「6.2 モード間遷移とLSI の状態」中の表6.2で、

    SSBYビットはDon'tCareとなっているのです。

    また、SSBYを0にしても、期待の動作は得られませんでした。

  • sleep()実行後に「直接遷移割り込み例外処理」が動いていると思いますが、こちらの処理はどうなっていますか?

    例外処理でloopしていることはありませんか?

    今回の目的は周波数変更だけの様子なので、IRR1.IRRDT=0;だけで十分とは思いますが。

  • 『H8/300H Tiny シリーズ サブアクティブモードへの遷移』 というサンプルコードのドキュメントを見てみると「4.1 モジュール説明」に

    直接遷移 dtint 直接遷移割り込み処理ルーチンで,直接遷移割り込み要求フラグのクリアを行なう

    とありますが同様のことはされてるでしょうか? これがないと直接遷移割り込み処理が繰り返し呼ばれ先に進まないと思います。

  • わわいです。

    ハードウエアマニュアルでは、SYSCR2の該当する説明書きには、「クロックはSLEEP命令実行後、設定した周波数に切り替わります」

    とあります。

    で、スリープモードからアクティブモードの遷移は、割込み発生でしか移行しません。

    ということで、

    1.SYSCR2のレジスタ内容変更

    2.何らかの割込みを有効に設定

    3.SLEEP命令実行(これでスリープモードとなる)

    4.2.の割り込みが発生(これでアクティブモードとなる)

    5.終了

    というステップを踏む必要があります。

    ということで、タイマ割り込みあたりの設定が必要となります。

  • わわいさん

    アクティブモードからアクティブモードへの直接遷移は可能でしす。

    直接遷移はけろいちさんがやろうとしている周波数変更のためのものです。

    ハードウェハマニュアル 6-7ページ 6.4 直接遷移 に説明があります。

    また、6-5ページ 図6.1 モード遷移図 にも直接遷移割り込みでアクティブモードからアクティブモードへの遷移が可能となっています。

    DTONビットを1に設定して、SLEEP命令を実行すると直接遷移割り込みが発生します。

    今回の問題は、Kon Nozomu(すと)さんや fujita nozomu さんがご指摘している通り、直接遷移割り込み処理内でIRR1.IRRDTを0クリアしていないことが原因ではないかと思います。

  • わわいさん

    アクティブモードからアクティブモードへの直接遷移は可能でしす。

    直接遷移はけろいちさんがやろうとしている周波数変更のためのものです。

    ハードウェハマニュアル 6-7ページ 6.4 直接遷移 に説明があります。

    また、6-5ページ 図6.1 モード遷移図 にも直接遷移割り込みでアクティブモードからアクティブモードへの遷移が可能となっています。

    DTONビットを1に設定して、SLEEP命令を実行すると直接遷移割り込みが発生します。

    今回の問題は、Kon Nozomu(すと)さんや fujita nozomu さんがご指摘している通り、直接遷移割り込み処理内でIRR1.IRRDTを0クリアしていないことが原因ではないかと思います。

  • みなさま、アドバイスありがとうございます。

    ご指摘いただいた通り、直接遷移割込み処理内で、

    IRR1.IRRDTを0クリアすることで、周波数変更ができました!感動です。

    ただ、割込み要求フラグをクリアしなければいけないということを、

    どこから読み取ればよかったのかがわかりませんでした。

    fujita nozomu様が、サンプルコードのドキュメントに書いてあることをアドバイスしていただきましたが、

    H8/36064のハードウェアマニュアルだけでは解決できないのでしょうか?

    当ハードウェアマニュアルの「3.例外処理」を見ると、

    割込み要因が発生すると要求フラグを1にして割込み処理が実行されるとなっていますが、

    これをクリアしろとか例外処理がループするとかは読み取れない。

    とても難しいですね。

  • けろいちさん

    こんにちは。

    確かに解りにくいですね。

    ハードウェアマニュアル 3-7ページ 3.2.5 割り込みフラグレジスタ1(IRR1)

    のIRRDTビットの説明で、クリア条件が0をライトしたときと記載されています。

    クリア条件に割り込みを受付けたときとは記載が無いので、この説明から読み解く以外ありません。

    H8系は割り込みを受付けても要求フラグは0クリアされませんのでなれるまで注意が必要です。

  • こんにちは。

    おっしゃる通り、クリア条件には割込みを受け付けた時とはないですね。

    いろいろと難しいところも多いですが、

    期待通りに動いたときはとても楽しい。

    がんばりたいと思います。

    お知恵を貸してくださった皆様、ありがとうございました!

  • わわいです

    直接遷移といっても、スリープモードからの復帰にそういう名前の割り込みを使ってるというだけの話で、割り込みの処理を行わないといけないのは変わりがありません

    ということで、割り込みを有効にする、割込み条件から割り込みを受け付ける、割り込みサービスルーチンから割り込みをリセット、あるいはディセーブルして復帰する、という流れを考えると何をしなければならないかが分かってくるかと思います

Reply
  • わわいです

    直接遷移といっても、スリープモードからの復帰にそういう名前の割り込みを使ってるというだけの話で、割り込みの処理を行わないといけないのは変わりがありません

    ということで、割り込みを有効にする、割込み条件から割り込みを受け付ける、割り込みサービスルーチンから割り込みをリセット、あるいはディセーブルして復帰する、という流れを考えると何をしなければならないかが分かってくるかと思います

Children
No Data