Develop Knowledge/Atmega, AVR

5강. 핀 선택하기

정수열 2022. 12. 17. 15:08

본 글은 PIN을 선택하기 위한 다양한 비트 연산 테크닉을 알아본다.

 

앞 글에서, Port의 핀을 선택해주기 위해서 0x01, 0x02, 0xff 등의 16진수로 핀을 선택하는 방법을 배웠다.

그런데 이 방법은 정적인 방법이고, 핀의 선택을 계속해서 바꾸어 주어야 하는 동적인 방법은 어떻게 해야할까? 가령, PA0~PA7 핀을 순차적으로 돌아가면서 선택한다던지 하는 경우 말이다.

그러기 위해서 오늘은 비트 연산을 사용해서 핀을 선택하는 방법을 알아볼 것이다!

 

- 비트 연산?

컴퓨터의 모든 숫자는 2진수로 나타낸다. 가령, 7은 111, 30은 11110으로 나타내는 식이다.

Atmega의 핀은 비트 단위로 제어할 수 있으므로, 이를 연산하는 방법을 알면 동적으로 제어할 수 있게 된다.

연산 방법은 이 글을 참고하면 된다 : https://gksid102.tistory.com/90

 

- Atmega의 비트 연산 테크닉

// 특정 핀만 1로
A = A | MASK
MASK는 10000000, 01000000 등의 2진수를 사용할 수 있다.
원하는 핀만 1을 넣어서 사용해주면 된다.

// 특정 핀만 0으로
A = A & MASK
MASK는 01111111, 10111111 등의 2진수를 사용할 수 있다.
원하는 핀만 0으로 넣어서 사용해주면 된다.

// 특정 핀만 1로 (비트 시프트)
A = A | (1<<7)
7은 PA7을 바꾸겠다는 의미이다.
6은 PA6, 5는 PA5, ... 등으로 바꿀수도 있다.

// 특정 핀만 0으로 (비트 시프트)
A = A & (~(1<<7))
7은 PA7을 바꾸겠다는 의미이다.
6은 PA6, 5는 PA5, ... 등으로 바꿀수도 있다.
// 참고
// Microchip studio 한정으로, 다음과 같이 작성할 수도 있다.
PORTA = PORTA | (1<<PINA7)

// PINA7 = 7이다. 따라서 다음 코드와 같다.
PORTA = PORTA | (1<<7)
/* 비트 순환
01111111
10111111
11011111
11101111
11110111
11111011
11111101
11111110 */

// 해석은 독자에게 맡긴다!!
int d=0;
while(d!=8)
{
    PORTA = (0x7F >> d) | (0x7F << (8-d));
    d++
    _delay_ms(1000); // 딜레이
}