Doubts about AVR

I have a few doubts about some code lines in AVR

DDRB |= (1 << 0);
PORTB ^= (1 << 0);

What’s the difference between

^= and =
|= and =
&= and =

Thanks for helping me :slight_smile:

google "^= operator c++"

so for example let me see if i could under stand

a^=b

then

a XOR b

ab a
00 0
01 1
10 1
11 0

That's it??

a|=b

a AND b

ab a
00 0
01 0
10 0
11 1

a OR b

ab a
00 0
01 1
10 1
11 1

Yes, and "a &= b;" is just equivalent to "a = a&b;", for example.

In the code lines you’ve mentioned, the intention is to modify bit0 in the registers:

^= (1 << 0) will toggle bit0
|= (1 << 0) will set bit0
&= (1 << 0) will clear bits 1-7

Thanks for the help

These are operators in the C++ programming language. Go read at a C++ tutorial - just google "cpp tutorial" and have a look at the section on assignment operators.

aurquiel:
I have a few doubts about some code lines in AVR

DDRB |= (1 << 0);
PORTB ^= (1 << 0);

What’s the difference between

^= and =
|= and =
&= and =

Thanks for helping me :slight_smile:

The “^” operator means “exclusive OR”, the “|” is OR and the “&” is AND.

Sticking them together with an equal sign just saves a bit of typing. For example:

this: DDRB |= (1 << 0);
means the same thing as this: DDRB = DDRB | (1 << 0);

this: PORTB ^= (1 << 0);
means the same thing as this: PORTB = PORTB ^ (1 << 0);

even this: x += 3;
means the same thing as this: x = x + 3;

Using a tilde (~) character is useful for clearing bits. For example, to SET bit 2 in a register:

REG |= _BV(2); ← see note near the bottom

To CLEAR the bit:

REG &= ~_BV(2);

You could do it the hard way and say this:

REG &= 0xFF - _BV(2);

…but why when the tilde is easier?

NOTE: “_BV(n)” is a macro which expands bit numbers to bit values. For example, “_BV(4)” means “the value of bit 4” which is decimal 32, hex 0x20.

You can use multiples ones too:

REG |= (_BV(2) | _BV(4)); // set bits 2 and 4 high

REG &= ~(_BV(2) | _BV(4)); // clear bits 2 and 4 low