For example the user can access memory-mapped IO registers as if they were globally defined variables like this:
PORTA = 0x33; unsigned char foo = PINA;
The compiler will choose the correct instruction sequence to generate based on the address of the register being accessed.
The advantage of using the memory-mapped registers in C programs is that it makes the programs more portable to other C compilers for the AVR platform.
Note that special care must be taken when accessing some of the 16-bit timer IO registers where access from both the main program and within an interrupt context can happen. See Why do some 16-bit timer registers sometimes get trashed?.
i.e.: sbi(PORTB, PB1); is now PORTB |= _BV(PB1);
This actually is more flexible than having sbi directly, as the optimizer will use a hardware sbi if appropriate, or a read/or/write operation if not appropriate. You do not need to keep track of which registers sbi/cbi will operate on.
Likewise, cbi (sfr,bit) is now sfr &= ~(_BV(bit));
Modules | |
Additional notes from <avr/sfr_defs.h> | |
Bit manipulation | |
#define | _BV(bit) (1 << (bit)) |
IO register bit manipulation | |
#define | bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) |
#define | bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit))) |
#define | loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit)) |
#define | loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit)) |
#define _BV | ( | bit | ) | (1 << (bit)) |
#include <avr/io.h>
Converts a bit number into a byte value.
#define bit_is_clear | ( | sfr, | |||
bit | ) | (!(_SFR_BYTE(sfr) & _BV(bit))) |
#include <avr/io.h>
Test whether bit bit
in IO register sfr
is clear. This will return non-zero if the bit is clear, and a 0 if the bit is set.
#define bit_is_set | ( | sfr, | |||
bit | ) | (_SFR_BYTE(sfr) & _BV(bit)) |
#include <avr/io.h>
Test whether bit bit
in IO register sfr
is set. This will return a 0 if the bit is clear, and non-zero if the bit is set.
#define loop_until_bit_is_clear | ( | sfr, | |||
bit | ) | do { } while (bit_is_set(sfr, bit)) |
#include <avr/io.h>
Wait until bit bit
in IO register sfr
is clear.
#define loop_until_bit_is_set | ( | sfr, | |||
bit | ) | do { } while (bit_is_clear(sfr, bit)) |
#include <avr/io.h>
Wait until bit bit
in IO register sfr
is set.