- ベストアンサー
ATmega88のレジスタのビット操作
ATmega88のプログラミングについて調べているのですが、 以前ATtiny2313の時にレジスタのビットの操作は 例えば、PORTBレジスタの3ビット目をHにする場合は PORTB |= (1<<PB3); このような書き方をしていたと思うのですが、ATmega88でプログラムされている方達のプログラムを見てみると、 PORTB = (1<<PB3); http://onechiplab.blogspot.com/2009/09/atmega88rtc-8564.html というような書き方をされているように見受けられるのですが、この2つの文は全く同じ意味でしょうか?
- みんなの回答 (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); といった記述になります。
その他の回答 (1)
架空のマイコンの話です。 このマイコンには 8 bit のレジスタ X があります。 レジスタ X は全ビット書き込み専用です。 書き込み専用のビットを読むと必ず 1 が読み出されます。 さてこのマイコンで, X = 0x00; X |= (1 << 3); というコードを実行したら,実行後の X の値は幾つになるでしょうか? 正解は,0xff です。 X の全ビットを読み出し,(1 << 8) との論理和をとって,X に書き戻すからです。 ご質問の件はちょっと違うような気もしますが, たまに聞く落とし穴なのでご参考まで。
お礼
回答頂きありがとうございます。一度C言語の理解を確認してみたいと思います。助かります。
お礼
回答頂きありがとうございました。C言語の書き方の問題なのですね。助かりました。