4강. GPIO 개요
본 글은 GPIO 에 대해서 설명한다.
- GPIO?
General Purpose Input Output의 약자이다. 직역하면, 일반적인 목적을 가진 입/출력 핀 이라는 의미이다.
말 그대로 '1/0 신호를 입력받거나 출력받는다'는 의미를 가지고 있다.
- GPIO 핀들
Atmega128A 기준으로 데이터시트의 Overview를 보면 Pin Map이 있다. 대부분의 정보가 여기에 전부 다 들어가있다.
http://ww1.microchip.com/downloads/en/devicedoc/atmel-8151-8-bit-avr-atmega128a_datasheet.pdf
...??? GPIO 가 없는데요??
바로 밑에 핀에 대한 간략한 설명을 보자.
Atmega128A 기준으로, PortA ~ PortG 까지 전부 동일한 내용이 있다. 위의 빨간줄로 설명한게 GPIO라는 뜻이다.
Atmega는 핀 하나마다 2~3가지의 기능을 가지고 있다. 예를들면,
PB2 : GPIO 통신, MOSI
PE0 : GPIO 통신, RXD0, PDI
등.. 모든 핀에는 GPIO가 기본적으로 들어가있고, 그 외에 특별한 기능이 하나씩 있다.
- GPIO 사용법
GPIO는 3가지 기능이 있다.
1. 입력/출력을 결정하는 DDRx (Data Direction Register) (x는 핀 알파벳을 의미. DDRA, DDRB, ...등으로 쓴다.)
0이면 입력, 1이면 출력을 의미한다.
2. 출력을 담당하는 PORTx
3. 입력을 담당하는 PINx
참고로, 입력/출력을 동시에 할수는 없다. DDRx로 입력/출력을 결정한 후, 입력이면은 PINx 코드를, 출력이면은 PORTx 코드를 사용한다.
그러면 이제 한번 사용해보자.
나는 PortA0 핀에서 1 신호를 출력하고 싶다. 어떻게 해야할까?
먼저, PortA에서 PortA0을 지정해 주어야 한다. 그건 '비트 단위'로 지정한다.
이런식으로, PortA에서 PortA0만 지정하려면, A0에 해당하는 비트를 바꾸면 된다.
모든 숫자는 hex 숫자로 작성해야 한다. 따라서..
A0 은 0x01; //00000001
A1 은 0x02; //00000010
A2 은 0x04; //00000100
A3 은 0x08; //00001000
A4 은 0x10; //00010000
A5 은 0x20; //00100000
A6 은 0x40; //01000000
A7 은 0x80; //10000000
A2, A3 은 0x06; //00000110
A0~A7 전부 선택하려면 0xff; //11111111
이런 식으로 지정할 수 있다.
그러면 이제, 각각의 기능들을 사용해보자.
// 1. DDR로 입력/출력을 결정한다.
// 0이면 입력, 1이면 출력을 의미한다.
DDRA = 0x01; // A0 핀만 출력, 나머지는 입력으로 설정한다.
// 2. PORT로 출력을 나타낸다.
// A0 핀의 출력을 활성화 시켰다.
PORTA = 0x01;
// 3. PIN으로 입력을 가져온다.
// 현재 활성화 된 핀의 비트는 1로, 비활성화 된 핀의 비트는 0으로 표기한다.
// 이 예제에서는 PA0만 활성화 시켰으므로, 00000001이 변수에 들어갈 것이다.
// 물론, DDR를 입력 모드로 하고, 외부 장치로 핀에 전기신호를 입력해서,
// 실시간으로 입력 상태를 검사하는 코드도 가능하다.
int a_val = PINA;
GPIO는 DDRx로 입/출력을 결정해주고, 그에 맞는 코드인 PORTx나 PINx을 사용해주면 된다.