R8C/38CのPD0が変更出来ない

R5F2138CCNFPのポート設定で、PD0が書き変わりません。プログラム上からもHEWのツール(I/O)からでも書き変わらず\”0\”のままです。プログラムの先頭で、まだ、クロック設定しかしていないのですが、何かP0の設定に影響する要因が有るのでしょうか。
ポート設定処理では、prc2 = 1;・・・・prc2 = 0;で閉めています。PD0以外はプログラムからも、ツールからも書き変わります。何か分かりましたら教えて頂けますか。
  • スタッフのチョコです。

    tantaka様のスレッドにコメントさせていただきます。

    R8C/38のマニュアルがダウンロードできなくてR8C/35を見ていますが,「ポートPi方向レジスタ」の説明の部分に以下のような注がございます。この点をご確認ください。

    「PD0レジスタは、PRCRレジスタのPRC2ビットを“1”(書き込み許可)にした次の命令で書いてください。」
  • 早速の回答ありがとうございます。以下の様な書き方で

    prc2 = 1;   ←ここでのprc2を見ると\”0\”のまま
    pd0 = 0x0f;  ←ここでのpd0を見ると\”0\”のまま
    p0 = 0x03
    .
    .
    prc2 =0;

    上記の様に書いて有りますが、pd0だけが書き変わりません。マニュアルに、PRC2 ビットを“1”( 書き込み許可) にした後、SFR 領域に書き込むと“0”になります。と有りますが、この説明が理解しずらいです。
  • tantakaさん

    こんにちはTOYKEYと申します。


    >PRC2 ビットを“1”( 書き込み許可) にした後、
    >SFR 領域に書き込むと“0”になります。
    >と有りますが、この説明が理解しずらいです。
    →PRC2でPD0のプロテクトを解除したあと、何か
     レジスタをいじると自動的にプロテクトが
     復活するという意味です。
     当然ながらデバッガでブレークをかけると、
     内部的にはレジスタをいじっちゃいます。
     よって

     プロテクト解除
     ↓
     PD0の設定

     という一連の流れの中でブレークを貼らないで
     ください。

     つまり
     prc2 = 1; ←ここでブレークしちゃダメ
     pd0 = 0x0f;←ここでブレークしちゃダメ
     p0 = 0x03 ←ここで確認してみましょう

     それでもだめならまた書き込んでください。
  • スタッフのチョコです。

    TOYKEY様フォローありがとうございます。

    tantaka様,このプロテクトでは必ず,連続して設定する必要がございます。TOYKEY様がコメントされているように,ブレークをかけると,ブレークを実現するための処理が挿入されてしまい,「次の命令」とはなりません。

    このような,連続したシーケンスが指定されている場合には,ブレークの設定にはご注意ください。
  • 回答ありがとうございます。
    原因は、ポート設定の書き方に問題が有るようです。
    prc2 = 1;
    pd0_0 = 1;
    pd0_1 = 1;
      ・
      ・

    上記の記述から、以下の記述に変更
    prc2 = 1;
    pd0 = 0x0f;
      ・
      ・

    ご指摘の様にprc2設定の後、bit単位での設定では、自動的にプロテクトが復活して書き込めなくなってしまった、と言う事みたいです。
    問題は解決しました。大変ありがとうございました。