[H8-ML(2130)] Re: IRQ$B3d$j9~$_$K$D$$$F(B
From: serow@xxxxxxxxxxxxxxxxxx (TANAKA Yoshitomo)
Date: 2002年08月09日(金)06時31分05秒
In article <NGBBKCLJMLGOFGDKAPHFOEAHCBAA.n.onda@xxxxxxxxxxxxxxxxxxx>,
Norio Onda <n.onda@xxxxxxxxxxxxxxxxxxx> wrote:
>
>ご指摘のとおりISRを「空読み」してみたらうまくいきました。ありがとうございます。
>確かにマニュアルに読んでから0を書き込むとなっているんですね。
>マニュアルの言葉の重さを思い知らされました。
>でも、一体どういうロジックになっているんだろう?...

このケースのように単一のビットを操作する場合は
ビット操作命令を使うのが便利です。
ビット操作命令は、対象とするバイトを読み出し、ビット操作を施し、
必要ならバイト毎書き込む、という流れになります。
これはバイト単位で読み出してビット操作をして…という
ビット操作命令に拠らない方法でも同じことです。
で、このときbit0をクリアしようとしているときに
bit1が立ったらどうなるかを考えてみてください。
[byte読出] -> (bit1が立つ) -> [bit0を0に] -> [byte書込]
となると読み出したbyteはbit1が立つ前のものですので0になってます
これを書き込んだ時にもしbit1が0になってしまったら、
プログラムはbit1が立ったという事実を知ることができませんが、
H8の仕様ならbit1の1をまだ読み出していませんから0は書き込まれません。
また
 (bit1が立つ) -> [byte読出] -> [bit0を0に] -> [byte書込]
だとしたら、bit1は読み出されていますが1が書き込まれますから1のままです。
とまぁこのように、安全にビット単位の処理ができるようにこのような仕様に
なっている、というわけですね。
-- 
----_--__---_-_-_-__--_-__-__---_-_----_--_-_---_---_----
_/     TANAKA Yoshitomo       _//
/  Suginami-ku Tokyo, Japan  _// serow@xxxxxxxxxxxxxxxxxx
スレッド概略
[2127(R)](起点)
 └[2129(U)]
   └[表示中]
     └[2131(1)]


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


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