[PIC]PICの資料にある”R-M-W”の意味

PICについて書かれた資料や書籍を見ると、出力ピンの説明で”R-M-W”と書かれている場合があります。
このR-M-Wは、Read,Modify,Writeの略です。

PICでは出力ピンの特定ビットのみ(例えばPortBのRB0)を変更する場合でも、一旦PortBの全ビットに紐付くピンの電圧を読み取った後(Read)、プログラムで指定した値に書き換えられ(Modify)、PortBの全ビットを出力する(Write)という振る舞いをします。

これは、アセンブラだとBSET,BCLRなどの特定ビットを操作する命令で起きます。


プログラマは、データを書き込んでいるだけのつもりでもPICの回路上では一旦現状の値を読み取っています。ですので、外部回路で出力ピンの電圧が変わるようになっていると一度セットしたはずの値が勝手に変わってしまう為、注意が必要です。

R-M-W機能に伴う問題

“外部回路で出力ピンの電圧が変わるよう”な回路というのは、例えば以下の様なものです。

出力ピンにノイズ除去等の目的でバイパスコンデンサが入っていると、PIC側で出力をLow->Highに変更しても、直ぐに電圧が+5Vにはあがってくれません。これは、コンデンサに電荷が蓄積される間の遅延が発生するためです。

RB0の出力ピンにパスコンが入っている場合、下記のコードだと問題が発生する場合があります。

PORTB |= 0x01;  // RB0をHighにする (RB0にパスコンが入っていると仮定します)
PORTB |= 0x02;  // その後RB1をHighにする


2行目のRB1をHighにする際に、R-M-Wの機能でRB0の値が一旦Readされます。
この際、パスコンによる作用でRB0の値はまだLowだったら、RB1をWriteする時に意図せずRB0がLow(=0)にされてしまいます。



PIC18,PIC24シリーズ以降でのR-M-W問題の対策

PIC16シリーズでは、ピンの書き込みにR-M-Wの仕組みを使用しているため、前述の問題が発生しましたが、後継のPIC18,PIC24シリーズでは、対策が採られています。

出力ピンの直前に,マイコン内部で”LATx: Data Latch register”というものが加えられ、自分が直近に出力した値がラッチメモリに記憶されるようになりました。これにより、R-M-Wが行われても、Readするデータが実際のピンの電圧ではなく記憶したラッチ情報になるので、意図しないデータの変化を防ぐようになっています。

関連記事

コメントを残す

メールアドレスが公開されることはありません。