[H8-ML(3172)] Re: ポートディレクションレジスタ(フォロー)
From: "Takao Kobayashi @ TKCC" <kobayashi@xxxxxxxxxxx>
Date: 2003年05月16日(金)21時11分19秒
こんばんわ。宮前さん。。。。

半分、はずしていたので補足します。

「ビット操作命令仕様上の注意」ではDDRへのアクセスに
ついて解説してます。

ビット操作は、
・リード   … バイトでリード
・ビット操作 … リードしたバイトの1ビットを操作
・ライト   … バイトでライト
というように動作します。

DDRレジスタは書き込み専用レジスタなので、読み込みを
行った場合はFFHを返します。既に「0」が書いてあって
も「1」が返されます。

最初にビット0を「0」にセットしても、2回目にビット1
を「1」に操作する命令でビット0は「1」に化けてしまう
のです。

このような場合は、RAM上にワーキングを確保して、そこ
のデータで一元管理します。

1回目
ワーク <− 00H … (ビット0を「0」)
DDR <− ワーク

2回目
ワーク <− ワーク or 02H … (ビット1を「1」)
DDR <− ワーク

てな具合です。

 こばやし。。。(はじの上塗りになりませんように…願)

----- Original Message ----- 
From: "Takao Kobayashi @ TKCC" <kobayashi@xxxxxxxxxxx>
To: <h8@xxxxxxx>
Sent: Friday, May 16, 2003 8:21 PM
Subject: [H8-ML(3170)] Re: ポートディレクションレジスタ


こんばんわ。宮前さん。。。。

3048のハードウェアマニュアルを見ました。

ポートディレクションレジスタは「0」で入力、「1」で出力ですね。

もし、このCPUでビット出力で使用する場合は注意が必要です。
ビット操作命令はバイトでアクセスするようです。

ビットを出力しようとした場合は、
・バイト読み込みを行う
・ビット操作を行う
・バイト書き換えを行う
になります。

2回目の命令実行時にビット0の情報をそれなりに読み込んで書き戻し
てしまうことが予想されます。

そのような場合は、出力用のバイト情報をRAMに用意して、その情報
を更新してからバイトでポートに出力するような形が必要です。

ハードウェアマニュアルに「ビット操作命令の操作上の注意点」という
箇所がありますので、参考にしてみてください。。。。
(CPUの命令セットの項の中に記述があります)

実は、私も以前失敗しました。


  こばやし

----- Original Message ----- 
From: "miyamae" <m_vega@xxxxxxxxxxxxx>
To: "H8 メール投稿" <h8@xxxxxxx>
Sent: Friday, May 16, 2003 7:57 PM
Subject: [H8-ML(3169)] ポートディレクションレジスタ


宮前です (アマチェア)

3048のPB0、PB1を外部でプルアップし
ポートデータレジスタをどちらもゼロに固定し、
ポートディレクションレジスタをビット操作すると思いどうりに
なりません。AKI−3048用Cコンパイラを使用。モード5。
ビットクリアを2個連続すると、最初のが無視されて
ポートがLレベルのままでHレベルになりません。
ポートが破壊されてるかと思い処理順序を逆にするとやはり最初のが無視
されます。
モニターで命令を見ると
  20714   7FD47200              BCLR       #0:3,@H'FFFD4:8
  20718   7FD47210              BCLR       #1:3,@H'FFFD4:8
のようになってました。

なぜこの現象が発生するのでしょう?  これは仕様でしょうか?
バイトで操作すると問題はおきません。

日立のヘッダーは、ポートデータレジスタは、ビット操作するように
ビット展開されてないので、ビット操作するように変更しました。
バイト操作させるためにビット展開してないのでしょうか?









スレッド概略
[3169(R)](起点)
 └[3170(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]