これ何て呼びますか

ATmega88のプログラミングについて調べているのですが、

以前ATtiny2313の時にレジスタのビットの操作は
例えば、PORTBレジスタの3ビット目をHにする場合は

PORTB |= (1<<PB3);


このような書き方をしていたと思うのですが、ATmega88でプログラムされている方達のプログラムを見てみると、

PORTB = (1<<PB3);


http://onechiplab.blogspot.com/2009/09/atmega88r …
というような書き方をされているように見受けられるのですが、この2つの文は全く同じ意味でしょうか?

A 回答 (2件)

マイコンの問題ではなく、純粋なC言語に関する問題ですが、


> PORTB |= (1<<PB3);
> PORTB = (1<<PB3);
この二つの意味はまったく違います。

> PORTB |= (1<<PB3);
こちらは、「PORTB = PORTB | (1 << PB3);」と同じ意味です。
元のPORTBとビット OR を取っていますので、PB3に該当するビットは1になる(出力がHになる)のですが、
それ以外のビットは、元のデータがそのまま残ります。

> PORTB = (1<<PB3);
こちらの場合、純粋な代入であり、
「1<<PB3」はPB3に該当するビットが1で残りは0であるような数値になりますから、
PORTBの出力は、PB3以外はLになってしまいます。

> ATmega88でプログラムされている方達のプログラムを見てみると、
> http://onechiplab.blogspot.com/2009/09/atmega88r

そのページを見ましたが、「PORTBレジスタの3ビット目をHにする」ような目的で
> PORTB = (1<<PB3);
という表記は見当たりませんでした。質問者さんの誤読だと思います。

たとえば「PORTBのPB3とPB5とPB7をHに、残りは全てLにしたい」といった場合、
PORTB全ビットを設定するため、元のPORTBの状態は利用しませんので、
元のPORTBとのORを取る「PORTB |= 」ではなく、純粋な代入の「PORTB = 」使って

> PORTB = (1<<PB3) | (1<<PB5) | (1<<PB7);

といった記述になります。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございました。C言語の書き方の問題なのですね。助かりました。

お礼日時:2011/01/17 18:35

架空のマイコンの話です。


 このマイコンには 8 bit のレジスタ X があります。
 レジスタ X は全ビット書き込み専用です。
 書き込み専用のビットを読むと必ず 1 が読み出されます。

さてこのマイコンで,
 X = 0x00;
 X |= (1 << 3);
というコードを実行したら,実行後の X の値は幾つになるでしょうか?

正解は,0xff です。

X の全ビットを読み出し,(1 << 8) との論理和をとって,X に書き戻すからです。


ご質問の件はちょっと違うような気もしますが,
たまに聞く落とし穴なのでご参考まで。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。一度C言語の理解を確認してみたいと思います。助かります。

お礼日時:2011/01/17 18:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報