Hobbie Info‎ > ‎Electronics‎ > ‎microController‎ > ‎

uC techniques

This is useful for Bit mathematics cookbook.

var |= mast : (or) : sets a bit
var &= ~mask : (and not) : clears a bit
var ^= mask : (xor) : flip a bit


Code:
#ifndef _AVR035_H_
#define _AVR035_H_

// from AVR035: Efficient C Coding for AVR

#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))

#define SETBITMASK(x,y) (x |= (y))
#define CLEARBITMASK(x,y) (x &= (~y))
#define FLIPBITMASK(x,y) (x ^= (y))
#define CHECKBITMASK(x,y) (x & (y))

#define VARFROMCOMB(x, y) x
#define BITFROMCOMB(x, y) y

#define C_SETBIT(comb) SETBIT(VARFROMCOMB(comb), BITFROMCOMB(comb))
#define C_CLEARBIT(comb) CLEARBIT(VARFROMCOMB(comb), BITFROMCOMB(comb))
#define C_FLIPBIT(comb) FLIPBIT(VARFROMCOMB(comb), BITFROMCOMB(comb))
#define C_CHECKBIT(comb) CHECKBIT(VARFROMCOMB(comb), BITFROMCOMB(comb))

#define _CONCAT(a,b) a##b
#define PORT(x) _CONCAT(PORT,x)
#define PIN(x) _CONCAT(PIN,x)
#define DDR(x) _CONCAT(DDR,x)

#endif


Use:
Code:
#define Status_LED PORTA, 3

C_SETBIT(Status_LED);
C_CLEARBIT(Status_LED);

Following table lists register bit settings and resulting function of port pins

register bits →
pin function↓ DDRx.n PORTx.n PINx.n
------------------------------------------------------------------------------------------------------
tri stated input 0 0 read data bit x = PINx.n;

pull-up input 0 1 read data bit x = PINx.n;

output 1 write data bit n/a
PORTx.n = x;