はじめまして。
ヴィストン社のビュートローバというキットを利用して、
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; }
細かくは見ていませんが、sleepして戻ってこないのは、マイコンが無事に眠りについて起こされるのを待っている状態ではないでしょうか。意図が周波数を下げたいだけなのか、それとも何かの操作を行うまでスリープさせたいのか、もう少し詳しく説明していただけるとアドバイスしやすいと思います。眠れる森の美女は王子様のキスで目覚めるのですが、眠れるマイコンは割り込みで叩き起こさないと目覚めません。
アドバイスありがとうございます。
やりたいことは、周波数を下げたいだけなのです。
ハードウェアマニュアルを見ると、
周波数を下げるためには、ダイレトクトランスファビット(SYSCR2.BIT.DTON)を1にして、SLEEP命令を実行すればよいとあります。
このとき、該当する割込み許可ビット(IENR1.BIT.IENDT)も合わせてイネーブルにすることとあります。
指示通りに処理をしているつもりなので、
アクティブモード→アクティブモードの直接遷移が期待される動作なのですが、
ご指摘の通り、アクティブモード→スリープモードになっているように思います。
アクティブモード→アクティブモードなので、
王子様のキスは必要ないと考えているのですが。。。
『H8/36064 グループ ハードウェアマニュアル』の「6.1.1 システムコントロールレジスタ 1(SYSCR1)」の説明に
7 SSBY 0 R/W ソフトウェアスタンバイ SLEEP 命令実行後の遷移先を選択します。 0:スリープモードに遷移 1:スタンバイモードに遷移
とありますが、プログラムでは 1 に設定しているので SLEEP 命令後はスタンバイモードになるのでは?
ご指摘の通りなのですが、
『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クリアしていないことが原因ではないかと思います。
みなさま、アドバイスありがとうございます。
ご指摘いただいた通り、直接遷移割込み処理内で、
IRR1.IRRDTを0クリアすることで、周波数変更ができました!感動です。
ただ、割込み要求フラグをクリアしなければいけないということを、
どこから読み取ればよかったのかがわかりませんでした。
fujita nozomu様が、サンプルコードのドキュメントに書いてあることをアドバイスしていただきましたが、
H8/36064のハードウェアマニュアルだけでは解決できないのでしょうか?
当ハードウェアマニュアルの「3.例外処理」を見ると、
割込み要因が発生すると要求フラグを1にして割込み処理が実行されるとなっていますが、
これをクリアしろとか例外処理がループするとかは読み取れない。
とても難しいですね。