RL78/G14にてデバッグしてます。
INTP6 両エッジにて割り込みを発生させるために、PIF6 = 0U; PMK6 = 0U; するとリセットがかかり、2回目は正常に割り込みスタートできます。
リセット要因を調べたいのですが、どのタイミングでRESFを参照すればよいのでしょうか?
また、リセットの要因は何が考えられるでしょうか?
宜しくお願い致します。
INTP6割り込み関数の内容を、後ろ半分をコメントアウトしてリセットが掛かるかテスト、相変わらずリセットが掛かるようであれば残り前半部分の後ろ後半もコメントアウトしてテスト、リセットが掛からないのであればコメントアウトした部分の前半をコメントアウトを解除してテスト、みたいに繰り返していけば問題箇所の絞込みができるのでは。
チョコです。
調査方法はfujita nozomuさんの方法でいいとしても、RESFが0というのは
納得がいきません。起動後に2度読み出しているのではないでしょうか。この
レジスタは1度読み出すとクリアされるので、2度目では0しか読めません。
マニュアルにもRESFの値を一度RAMに読み出しておいて、RAMの値を使って
判断するように記載されています。この点は問題ないか確認してください。
また、タイマの起動処理は全く問題ありません。TAU0ENが1になっていれば、
これでTM02が起動するだけです。
回答ありがとうございます。
リセットかからなくなりました。INTP6割り込み関数にてクロックパルスのカウントをしておりますが、このカウンタ変数が初期化されておらず、初期化することででなくなりました。
DTCも使っておりまして、DTCにて転送する転送先/転送元アドレスをセクションを代えて固定しております。その続きにカウンタ変数も配置されていて初期化されていない状態でした。RAMはスタートアップにて全てクリアされているものと思っておりました。セクション変えると自分でクリアしないといけないんですね。
でも、カウンタが初期化されずにカウントアップしてもオーバーフロウするだけではないんでしょうか?リセットする意味がよくわからないです。
また、RESFはやっぱり1度しか読んではないです。それでも0なんです。そのため再度、電源やクロック信号電圧など確認しましたが問題なく、プログラムにて絞込みをしたところ上記に気付けました。
セクションの配置やRAMの配置など勉強が必要だと実感しました。何度もありがとうございました。
>リセットかからなくなりました。
何はともあれ、よかったですね。
>このカウンタ変数が初期化されておらず、初期化することででなくなりました。
これはRAMパリティ・エラーのパターンなんですが。
もしかして、コード生成を使用していませんか。
端子割り当ての確定以外何の変更もなしで、コード生成してみたところ、クロック発生回路
のリセット要因確認がディフォルトではチェックされているので、初期化処理で、RESFが
読み出されるようです。
具体的には、起動時に実行される"R_Systeminit"の中でR_CGC_Get_ResetSource()
関数が呼ばれています。この関数はr_cg_cgc_user.cの中に存在し、RESFレジスタを
読み出して、変数reset_flagに格納していました。
これが悪さをして、main関数がスタートした時点ではRESFが0になっていたのではない
でしょうか。
これなら、今回の動作の説明が付きます。
C 言語では、演算のオーバーフローはエラー等となることはありません。
未初期化の変数のインクリメントは
動作になります。
1. の未初期化のメモリを読み込む際に RL78 では 1/2 の確率で RAMパリティ・エラーとなるので、それでリセットが掛かっていたのではないでしょうか。RAMパリティ・エラーは RESF に結果が残ります。
チョコさん
わかりました。RAMパリティーエラーでした。
>具体的には、起動時に実行される"R_Systeminit"の中でR_CGC_Get_ResetSource()
>関数が呼ばれています。この関数はr_cg_cgc_user.cの中に存在し、RESFレジスタを
>読み出して、変数reset_flagに格納していました。
自動生成を利用して上記にてreset_flagをグローバル変数として宣言して、メインのはじめに読んでましたが、その間にスタートアップ中にRAM初期化されているのに気付きました。その場で読むときちんと0x04でRAMパリティーエラーでした。ありがとうございました。
fujitaさん
RESFの値をきちんと読んでませんでした。おっしゃる通りRAMパリティーエラーでした。ありがとうございました。
デタラメなこと書いてたので訂正: > C 言語では、演算のオーバーフローはエラー等となることはありません。 C言語では符号付整数のオーバーフローは未定義動作となるので結果が期待できません。何が起こるかも不明なのでオーバーフローを起こす可能性のある整数のオブジェクトは符号なしで宣言する等注意が必要となります。