R8C/M12でのポート入出力設定について

R8C/M12を趣味で使っております。

今回、ポートの入出力で、想定外の動作をしたので、質問させて頂きます。
条件として、
P1-3ポートは、オープンドレインで外部プルアップ
P1-7ポートは、オープンドレインで外部プルアップ
で、それに合わせてレジスタの設定を行っています。

ここで、

bclr 3\,PD1  ;input-dir
bclr 7\,PD1

bclr 3\,P3 ;out-data-set
bclr 7\,P3

bset 3\,PD1 ;output-dir
bset 7\,PD1
bclr 3\,PD1 ;input-dir
bclr 7\,PD1
bset 3\,PD1
bset 7\,PD1
bclr 3\,PD1
bclr 7\,PD1

と記述した時、P1-3の出力ラッチレジスタの内容が1に
変化している様な動作をします。
(この時、P1-3のポートレベルは1です。)
端子レベル強制読み出しビットは0で変更していません。

P1-7など1ビット単体で変更する際に、変更する以外のビットでは出力レジスタの値でなく、入力レジスタの値が反映される様な気がします。

お手数ですが、ご教示ください。
マニュアルの注意記述など指示頂ければ幸いです。
Parents
  • スタッフのチョコです。

    さる様の「Re:R8C/M12でのポート入出力設定について」にコメントさせていただきます。

    最初のスレッドの処理と内容が異なっているようです。この処理であれば,以下のように説明は可能です。

    > 混乱した原因は、
    > bclr 3\,PD1  ;input-dir
    > bclr 3\,P1 ;out-data-set
    > bset 3\,PD1 ;output-dir
    > bclr 3\,PD1 ;input-dir
    > bset 3\,PD1
    > bclr 3\,PD1
    >
    > とした際に、P1.3はHi-Low出力します。

    この処理では,入力に設定している状態でラッチに0を書いたため,p1.3を出力にするとLowとなり,入力にするとプルアップ抵抗でHiになります。

    > ですが、
    > bclr 3\,PD1  ;input-dir
    > bclr 3\,P1 ;out-data-set
    > bclr 7\,P1 ;(btst 7\,P1でも同じ)
    > bset 3\,PD1 ;output-dir
    > bclr 3\,PD1 ;input-dir
    > bset 3\,PD1
    > bclr 3\,PD1

    > と記述すると、ご教授頂いた通り、P1.3はHi固定になります。

    これは,2つ目でラッチに0を書いていますが,入力に設定されているので,ラッチのデータは出力されません。
    3つ目で同じポートのほかのビットに対してビット操作を行ったことで,p1.3の内容(この場合には端子の状態Hi)が読まれてタッチに書き戻されたことで,ラッチの内容が0から1に書き変わってしまいます。
    そのため,p1.3を入力にするとプルアップ抵抗でのHiが,出力にしてもラッチの値が出力されてHiがp1.3端子に現れることになります。
    (スレッドの最初の記述内容では出力データの設定がp1ではなくp3に対して行われていたので,納得できる説明が見つかりませんでした。)
Reply
  • スタッフのチョコです。

    さる様の「Re:R8C/M12でのポート入出力設定について」にコメントさせていただきます。

    最初のスレッドの処理と内容が異なっているようです。この処理であれば,以下のように説明は可能です。

    > 混乱した原因は、
    > bclr 3\,PD1  ;input-dir
    > bclr 3\,P1 ;out-data-set
    > bset 3\,PD1 ;output-dir
    > bclr 3\,PD1 ;input-dir
    > bset 3\,PD1
    > bclr 3\,PD1
    >
    > とした際に、P1.3はHi-Low出力します。

    この処理では,入力に設定している状態でラッチに0を書いたため,p1.3を出力にするとLowとなり,入力にするとプルアップ抵抗でHiになります。

    > ですが、
    > bclr 3\,PD1  ;input-dir
    > bclr 3\,P1 ;out-data-set
    > bclr 7\,P1 ;(btst 7\,P1でも同じ)
    > bset 3\,PD1 ;output-dir
    > bclr 3\,PD1 ;input-dir
    > bset 3\,PD1
    > bclr 3\,PD1

    > と記述すると、ご教授頂いた通り、P1.3はHi固定になります。

    これは,2つ目でラッチに0を書いていますが,入力に設定されているので,ラッチのデータは出力されません。
    3つ目で同じポートのほかのビットに対してビット操作を行ったことで,p1.3の内容(この場合には端子の状態Hi)が読まれてタッチに書き戻されたことで,ラッチの内容が0から1に書き変わってしまいます。
    そのため,p1.3を入力にするとプルアップ抵抗でのHiが,出力にしてもラッチの値が出力されてHiがp1.3端子に現れることになります。
    (スレッドの最初の記述内容では出力データの設定がp1ではなくp3に対して行われていたので,納得できる説明が見つかりませんでした。)
Children
No Data