AVR(AT90CAN128)공부2011. 4. 5. 08:52

& 연산자 (AND)
& 연산자는 둘다 1이어야 1이 되기 때문에

1)특정 비트만 0으로 만들고 싶을때
2)특정 비트만 확인 하고 싶을때 (masking)

로 많이 사용됩니다.  예를 들어 보겠습니다.

1)특정 비트만 0으로 만들고 싶을때
PORTA 에 LED8개가 붙어 있고 모두 켜져 있습니다.(PORTA==0xFF)
그런데 다른 비트는 건드리지 않고 0번 1번 7번 비트의 LED 만 끄고 싶다면???

PORTA=PORTA & 0x7C;

1010 1010   (0xAA)  <-- 초기값
0111 1100   (0x7C)  <-- SET 0 BIT
----------------
0010 1000   (0x28)   <-- 결과값


라고 하면 됩니다.
쓰고 보니 PORTA=0x7C; 라고 하면 되지 않느냐? 라고 물으실 분들을 위해 다른 가정을 하나 더 넣겠습니다.
현재 LED 가 어떻게 켜져 있는지 모르는데 0번 1번 7번 비트의 LED 만 끄고 싶다면??? 그렇다면..
PORTA=PORTA & 0x7C; 이런식으로 & 연산자를 쓰는 것이 다른 비트는 건드리지 않게 됩니다.

2)특정 비트만 확인 하고 싶을때 (masking)
특정 비트만 확인하는 부분은 조건문에서 많이 들어 가는데..
예를 들어 PORTA 에 스위치가 8개 붙어 있는데
PORTA 3번 비트에 달려 있는 스위치가 눌렸는지 판단하고 싶다면?? (스위치는 안눌렀을때 1 눌리면 0으로 가정합니다. )

if((PINA & 0x08) == 0){  ... }

else



 이런식으로 사용하게 되면 스위치가 눌렸다면 {  ... }  의 동작을 수행하고 눌리지 않았다면  else 문을 수행 하겠죠??




| 연산자 (OR)

| 연산자는 둘중 하나라도 1이면 1이 되기 때문에

1)특정 비트만 1으로 만들고 싶을때
로 많이 사용됩니다.  예를 들어 보겠습니다.

1)특정 비트만 1으로 만들고 싶을때
AVR의 ADC관련 레지스터 중에 ADCSRA 라는 레지스터가 있습니다.
그런데 이 레지스터의 6번 비트를 1로 set 하면 ADC를 시작하라는 명령을 내리는 비트입니다.  다른 비트들은 ADC 관련 설정 값이죠..
만약.. ADC를 시작하고 싶은데 ADC 의 다른 설정은 건드리지 말아야 할때.. 바로 | 를 쓰면 됩니다.

ADCSRA |= 0x40;


0000 0100   (0x04)  <-- 초기값
0100 0000   (0x40)  <-- SET 1 BIT
-----------------
0100 0100   (0x44)  <-- 결과값


이렇게 사용하면 해당 비트만 1로 만들수 있습니다.
포트 출력할때 특정포트만 1로 만들고 싶다면 동일한 방법으로 사용하면 됩니다.



^ 연산자 (XOR)

두개가 다르면 1이 되기 때문에

1)특정 비트를 토글하고 싶을때

많이 사용됩니다.  예를 들어 보겠습니다.
PORTA 에 연결된 LED중 0번 비트에 연결된 LED만 켰다 껏다를 반복하고 싶습니다.
그럼 이렇게 코드는 어떻게 작성할까요??

while(1)
{
     PORTA = 0x01;
     delay_ms(1000);
     PORTA = 0x00;
     delay_ms(1000);
}

이렇게 작성해도 되지만  ^ 를 사용하면

while(1)
{
     PORTA ^= 0x01;        
     delay_ms(1000);
}


코드가 간단해 집니다.
PORTA 의 값이 뭐든 다른 비트는 변화 없이 0번 비트만 토글됩니다.



0000 0100   (0x04)  <-- 초기값
0100 0000   (0x40)  <-- XOR TOGGLE BIT
-----------------
0100 0100   (0x44)  <-- 결과값
0100 0000   (0x40)  <-- 다시 XOR TOGGLE BIT
-----------------
0000 0100   (0x04)  <-- 결과값





출처 : 당근이의 AVR갖구놀기

'AVR(AT90CAN128)공부' 카테고리의 다른 글

분배저항(전압분배) / 병렬저항 계산기  (0) 2011.06.10
sbi(), cbi();  (4) 2011.04.27
냉각수온도 표시기  (13) 2011.03.31
ECU CAN READER Ver 1.0  (6) 2011.03.14
기어단수표시기 + 속도표시기 통합 버전  (2) 2011.01.20
Posted by 초동