MCU를 사용하다보면 여러 레지스터를 다뤄야 하는데, 기능을 사용하기 위해서는 특정 비트만 활성화하거나 비활성화하는 등의 기능을 수행해야 한다. 예시로는 DC 모터를 구동시키는 코드이다.
void DC_Init() {
// Fast PWM Mode
TCCR0 |= (1 << WGM00) | (1 << WGM01);
// non-inversion
TCCR0 |= (1 << COM01);
// prescaler 64로 설정
TCCR0 |= (1 << CS00) | (1 << CS01);
DDRA |= (1 << PA0) | (1 << PA1);
PORTA |= (1 << PA0);
PORTA &= ~(1 << PA1);
}
비트 연산으로는 Flip-Flop에서 다뤘던,set과 clear(reset) 그리고 toggle이 있다.
위의 기능을 수행할 때 유용한 함수들은 다음과 같다.
unsigned int setBit(unsigned int num, unsigned int bitPosition) {
return num | (1 << bitPosition);
}
unsigned int clearBit(unsigned int num, unsigned int bitPosition) {
return num & ~(1 << bitPosition);
}
unsigned int toggleBit(unsigned int num, unsigned int bitPosition) {
return num ^ (1 << bitPosition);
}
unsigned int setBits(unsigned int num, unsigned int start, unsigned int count) {
return num | ((1 << count) - 1) << start;
}
unsigned int clearBits(unsigned int num, unsigned int start, unsigned int count) {
return num & ~(((1 << count) - 1) << start);
}
unsigned int toggleBits(unsigned int num, unsigned int start, unsigned int count) {
return num ^ ((1 << count) - 1) << start;
}