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