R8C/1x 発振停止検出機能について

こんにちは、entakeと申します。お世話になっております。

電源起動後、XINクロック(20MHz)に切り替えていますが、万が一XINクロック供給が途絶えた時のために、発振停止検出機能を使おうと考えています。

R8C/1Bのハードウェアマニュアルによると、同機能は、メインクロック発振回路の停止を検出すると、自動的に低速オンチップオシレータ発振設定(cm14=0)&オンチップオシレータ選択(ocd2=1)とし、発振停止検出割り込みにジャンプするようです。

ジャンプした後の動作ですが、「低速オンチップオシレータからメインクロックへの切り替え手順」として同マニュアルに参考フローが載っています。
(1)ocd3でメインクロック復活確認 ※永久ループ
(2)復活後→発振停止検出機能は無効にセット
(3)ocd2でメインクロックに切り替え

⇒この通りに作ると確かに正しく動くのですが、上記(2)を削るとなぜか上手く動きません。(UART通信ができない)

発振停止検出機能を有効にしたまま、動作を継続できればベストなのですが、何かお分かりの方、お願いいたします。
  • entakeさん

    すと@konです。

    R8C/12のH/Wマニュアルを参照してコメントしています。

    発振停止検出に関してですがフローチャート上で示されているのは、

    ・メインクロックの発振確認(まだメインクロックで動作していない)
    ・発振停止検出機能を無効(メインクロック動作前なので)
    ・メインクロック動作開始

    となっています。つまり、メインクロックが正常に動作した後(メインクロック動作開始以後)であれば、再び発振停止検出機能を有効にしてもいいと思います。



    メインクロック停止を検出した後の処理ですが、割り込み内でメインクロック復帰を待つのはいいと思いますが、外部から見るとダンマリになるため、何が起きているか判断がつきません。
    また、クロックが破損、破壊があったときには電源onのまま復旧しません。

    発振停止割り込み内では、まずはアクチュエータ関連の全出力をoff。リトライ回数を決めて復旧できるならソフトウェアリセット等の初期化処理(クロックに異常が発生するくらいなら他の周辺機能に影響も考えられるため)、リトライを超えたらエラー表示等で電源offを促すなどの対策が必要ではないでしょうか。


    E8a接続時には高速オンチップが動作しているため、メインクロック停止後もE8aとの接続は維持されると思います。ROMの状態でもハングアップしているようなので、割り込み内の処理に何か問題があるのではないでしょうか。
  • >すと@konさま

    コメントありがとうございます。
    質問が的を得ていないと思って再編集している中、適切なコメントをいただき、大変助かります。

    > つまり、メインクロックが正常に動作した後(メインクロック動作開始以後)であれば、再び発振停止検出機能を有効にしてもいいと思います。

    こちら、実験してみます!
    とりいそぎ失礼します。(納期間近につき。。)

    >掲示板管理人さま
    先ほど間違って削除依頼してしまいました。有用なコメントもついたので、なんとか取り消しをお願いしたく。
  • >すと@konさま

    発振停止検出割り込み処理内で、メインクロックの発振を確認後、”発振停止検出機能は無効化”してから、メインクロックに切り替えて、メインルーチンへ戻す。
    メインルーチンでは、常時SFRリフレッシュ処理として、ポート方向レジスタを更新していますが、そこに”発振停止検出機能の有効化”を追加し、ようやく上手くいきました。

    暴走についてですが、ocd2アクセス時のプロテクト解除忘れも一因でした。情けない。。

    また、メインクロックの発振を待っている間は、アラームを出すなどの工夫も大変参考になりました。
    ちなみに、発振待ちのまま30秒経つとWDTリセットがかかるのが盲点でした。
    20MHz動作で0.2秒になるよう設計してある場合、125KHz動作になると、確かに約30秒でWDTカウンタはアンダーフローしますね。
    メインクロック発振確認後は、ソフトウェアリセットで仕切りなおしたかったのですが、無用なイニシャル処理を避けねばならず、何事もなかったかのように戻すのに苦労しました。

    すと@konさまのご意見は、大変参考になりました!
    また何かありましたら、よろしくお願いいたします。