GPIO๋ General Purpose Input Output์ ์ฝ์๋ก ํ๊ตญ์ด๋ก๋ ๋ฒ์ฉ ์ ๋ ฅ ์ถ๋ ฅ์ ๋ปํ๋ค.
๋ง์ดํฌ๋กํ๋ก์ธ์๊ฐ ์ฃผ๋ณ์ฅ์น์ ํต์ ํ๊ธฐ ์ํด ๋ฒ์ฉ์ผ๋ก ์ฌ์ฉ๋๋ ์ ์ถ๋ ฅ ํฌํธ์ด๋ฉฐ, ํ๋ก๊ทธ๋๋จธ๊ฐ ํฌํธ์ ๋ํด ์ ๋ ฅ์ด๋ ์ถ๋ ฅ์ด๋๋ฅผ ์ค์ ํ ์ ์๋ค.
๋จ, GPIO ํฌํธ๋ฅผ ์ค์ ํ๊ธฐ ์ด์ ์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก GPIOํฌํธ์ ๋ํ ์ค์ ์ ๋ฐ๋์ ์ง์ ํด์ผ ํ๋ค.
์ด ๋ถ๋ถ์ ์์ด ์
์ถ๋ ฅ์ด ์ง์ ๋์ด ์๋ ๊ฒ๋ณด๋ค๋ ์์ ๋๊ฐ ๋์์ง์ง๋ง, ์ง์ ์ ๊ผญ ํด์ฃผ์ด์ผ๋ง ํ๋ค๋ ๋จ์ ์ด ์์์ ์ ์ ์๋ค.
ย
์ ๋ ฅ๊ณผ ์ถ๋ ฅ ํฌํธ๋ฅผ ์ ์ดํ๊ธฐ ์ํด 3๊ฐ์ ๋ ์ง์คํฐ๊ฐ ์ฌ์ฉ๋๋ค.
PORTx
: ํฌํธ์ ๋ํ ๋ด์ฉ
DDRx
: ์ถ๋ ฅ์ธ์ง ์ ๋ ฅ์ธ์ง ์ ํด์ค
PINx
: ํฌํธ๋ฅผ ์ด๋ฃจ๊ณ ์๋ ํ ์ง์ ๊ฐ๋ฅ
์ด ๋ ์ง์คํฐ๋ค์ ๋ํด์๋ ๋ฐ์์ ์กฐ๊ธ ๋ ์์ธํ ๋ค๋ค๋ณด๋ ค๊ณ ํ๋ค.
ย
ATmega128์๋ ์ด 53๊ฐ์ GPIOํฌํธ๊ฐ ์กด์ฌํ๋ฉฐ, ํ์ ๋์งํธ์ ์ผ๋ก High(5V)๋ Low(0V)๋ก ์ถ๋ ฅ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋๋ก ์ด๋ฐ ๋์งํธ ์ ํธ์ ๋ํ ์ ๋ ฅ๋ ๊ฐ๋ฅํ๋ค.
ย
PORTx
์ ๊ฒฝ์ฐ Read๋ Write ๋ชจ๋ ๊ฐ๋ฅํ๋ฉฐ, ์ด๊ธฐ๊ฐ์ 0์ด๋ค.
1์ ๋ฃ์ด์ฃผ๋ฉดHigh
์ํ, 0์ ๋ฃ์ด์ฃผ๋ฉดLow
์ํ์ด๋ค.์๋ฅผ๋ค์ด, LED 8๊ฐ๋ฅผ PA0~PA7๊น์ง ์ฐ๊ฒฐ์์ผ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
ATmega128์ ๊ฒฝ์ฐPull Up
์ ํญ์ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ LED 8๊ฐ์ ๋ถ๋ค์ ๋ชจ๋ ๋๊ณ ์ถ์ผ๋ฉดPORTA = 0b11111111
๋๋PORTA = 0xff
๋ก ํด์ฃผ๋ฉด ๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด
DDRx
ํฌํธ์ ๊ฒฝ์ฐ ์ถ๋ ฅ์ธ์ง ์ ๋ ฅ์ธ์ง๋ฅผ ์ ํด์ค๋ค.
PORTx
์ ๋ง์ฐฌ๊ฐ์ง๋ก Read์ Write ๋ชจ๋ ๊ฐ๋ฅํ๋ฉฐ, ์ด๊ธฐ๊ฐ์ 0์ด๋ค.์๋ฅผ ๋ค์ด,
DDRA = 0x00
์ PA0~PA7 ๋ชจ๋ ์ ๋ ฅ์ ๋ฐ๋๋ค๋ ๋ป์ด๊ณ ,DDRA = 0xff
๋ PA0~PA7 ๋ชจ๋ ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
PINx
์ ๊ฒฝ์ฐ Read๋ง ๊ฐ๋ฅํ๋ฉฐ ์ด๊ธฐ๊ฐ์ Not Available์ด๋ค.
์ํ ์ ์ด ๋ ์ง์คํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ ๋ค, ์ฝ๋ ๋ด๋ถ์์ ๋ณ์๋ก ๋ฐ์์ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ย
Pull Up
๊ณผ Pull Down
์ ํญ์ ๋ํด์ ์์๋ณด๊ธฐ ์ ์ ๋จผ์ Floating ํ์์ ๋ํด์ ์๊ณ ๋์ด๊ฐ์ผํ๋ค.
ย
Floating ํ์
์ด๋ ์ค์์น๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ์ํ์์ ์ ๋ฅ๊ฐ ํ๋ฅด๋์ง ํ๋ฅด์ง ์๋์ง ์ ์ ์๋ ์ํ์ด๋ค.
๋์งํธ ํ์ ์ ๋ ฅ ์ํ๋ก ์ค์ ํ๊ฒ ๋๋ฉด 5V ๊ฐ์ High, 0V๋ Low๋ก ์ธ์ํ๊ฒ ๋๋๋ฐ, ์ ๋ ฅ ๋จ์ ์ฃผ์์ ์๊ธด ์ ์ ๊ธฐ๋ ์ก์์ ์ํด ์ค๋ฅ๊ฐ ์๊ฒจ์ Floating ํ์์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๋์จ ๊ฐ๋
์ด Pull Up
์ ํญ๊ณผ Pull Down
์ ํญ์ด๋ค. ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ก์ Pull Up
์ ํญ๊ณผ Pull Down
์ ํญ์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ํด๊ฒฐ๊ฐ๋ฅํ๋ค.
ย
Pull Up ์ ํญ๊ณผ Pull Down ์ ํญ์ ๋ํด์ ๊ณต๋ถํ ๋, ์ฌ์ง์ผ๋ก ์ค๋ช ๋ ์๋ฃ๋ฅผ ๋ดค์ ๋ ์ดํด๊ฐ ๋ฐ๋ก ๋์๋๋ฐ ์ฌ์ง์ ์ฒจ๋ถํ๊ธฐ์๋ ์ ์๊ถ ๋ฌธ์ ๊ฐ ์์ ๊ฒ ๊ฐ์ ๊ณต๋ถํ ๊ฐ๋ ๋ง ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ณผ ์์ ์ด๋ค.
- ์ ํญ์ ์์ ๋ถ์ฌ์ค์ floating ํ์์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ์ค์์น๊ฐ ์ด๋ฆฐ ์ํ : ์ ๋ ฅ ํ์ผ๋ก ์ ๋ฅ๊ฐ ํ๋ฅด๊ฒ ๋๊ณ , ์ ์์ ์๊ณผ ๊ฐ์ 5V ์ ์์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ฏ๋ก ์ ๋ ฅ ํ์๋ High ๊ฐ์ด ์ฝํ๊ฒ ๋๋ค.
- ์ค์์น๊ฐ ๋ซํ ์ํ : ๋ชจ๋ ์ ๋ฅ๋ GND ์ชฝ์ผ๋ก ํ๋ฅด๊ฒ ๋๋ฏ๋ก ์ ๋ ฅ ํ์๋ Low ๊ฐ์ด ์ฝํ๊ฒ ๋๋ค.
ย
- ์ ํญ์ ๋ฐ์ ๋ถ์ฌ์ค์ ํ๋กํ ํ์์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ์ค์์น๊ฐ ์ด๋ฆฐ ์ํ : ์ด๋์๋ ์ ๋ฅ๊ฐ ํ๋ฅด์ง ์๊ณ , ์ ๋ ฅ ํ์๋ 0V์ ์ ์์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
- ์ค์์น๊ฐ ๋ซํ ์ํ : ์ ํญ์ผ๋ก ์ธํด ์ ๋ฅ๋ ๋ชจ๋ ์ ๋ ฅ ํ ์ชฝ์ผ๋ก ํ๋ฅด๊ณ ์ ๋ ฅ ํ์๋ ์ ์ ์ ์๊ณผ ๊ฐ์ 5V๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
์ฌ์ค ์ฒ์ ๊ฐ๋
์ ์ ํ์ ๋๋ ๋ณต์กํ๊ฒ๋ง ๋๊ปด์ก๋๋ฐ ๋ณดํต ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๊ฐ Pull Down
์ ํญ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์ด๊ณ , ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๊ฐ Pull Up
์ ํญ์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ผ๊ณ ์๊ฐํ์๋ค.
ย
- ์ถ๋ ฅ ์ชฝ์ผ๋ก ์ ๋ฅ๊ฐ ํ๋ฌ๊ฐ๋ค๋ ๋ป
- ์นฉ์ ์ถ๋ ฅ๊ณผ ์ ์ ์ฌ์ด์ ์์๋ฅผ ์ฐ๊ฒฐํ์ฌ ์นฉ์ ์ถ๋ ฅ์ด Low์ผ ๋ ๋์
- ATmega128์ ๊ฒฝ์ฐ datasheet๋ฅผ ๋ณด๋ฉด Vcc๊ฐ 5V์ผ ๋ 20mA, Vcc๊ฐ 3V์ผ ๋ 10mA์์ ์ ์ ์๋ค.
- ์ถ๋ ฅ์์ ๋ฐ๊นฅ์ผ๋ก ์ ๋ฅ๊ฐ ํ๋ฅธ๋ค๋ ๋ป
- ์นฉ์ ์ถ๋ ฅ๊ณผ 0V ์ฌ์ด์ ์์๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ถ๋ ฅ์ด High์ผ ๋ ๋์
- ATmega128์ ๊ฒฝ์ฐ datasheet๋ฅผ ๋ณด๋ฉด Vcc๊ฐ 5V์ผ ๋ 20mA, Vcc๊ฐ 3V์ผ ๋ 10mA์์ ์ ์ ์๋ค.
์์๋ณด๋ ๋๋ถ๋ถ์ IC๋ Source
๋ณด๋ค Sink
์ ๋ฅ๊ฐ ๋๊ธฐ ๋๋ฌธ์ Sink
๋ก ๊ตฌ๋ํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค๊ณ ํ๋ค.
ย
- _delay_ms() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก LED ์ฑ์ ๋ค ๋นผ๊ธฐ(์ผ์ชฝ, ์ค๋ฅธ์ชฝ)
- shift ์ฐ์ฐ์(>>, <<)๋ฅผ ์ฌ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
ย
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
unsigned char led1, led2; //LED์ ๋ฑ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ 8bit๋ณ์ led2
int i, j;
DDRA = 0xff; //ํฌํธA๋ฅผ ์ถ๋ ฅ์ผ๋ก ์ค์
while (1)
{
PORTA = 0xff;
_delay_ms(1000);
for (i=0; i<8; i++)
{
led1 = 0xff >> 8-i;
for (j=0; j<8-i; j++)
{
led2 = 0x80 >> j;
PORTA = (~(led1 | led2));
_delay_ms(1000);
}
}
for (i=0; i<8; i++)
{
led1 = 0xff << 7-i;
for (j=0; j<i+1; j++)
{
led2 = 0x80 >> i-j;
PORTA = led1 & (0x00 ^ ~led2);
_delay_ms(1000);
}
}
}
}
ย
์ด๋ค ๋๋์ผ๋ก ์ฝ๋๋ฅผ ์ง์ผ๋ ์ง๋ ๋ฐ๋ก ๊ฐ์ด ์์๋๋ฐ ์๊ฐ๋ณด๋ค ๋ณต์กํด์ ์ง์ ์์ผ๋ก ๊ทธ๋ ค๊ฐ๋ฉด์ ๊ท์น์ฑ์ ์ฐพ์๋๋ ๊ธฐ์ต์ด ๋๋ค.
์ฝ๋๋ง ๋ณด๋ฉด ๋๊ฒ ๊ฐ๋จํด๋ณด์ด๊ฒ ์ง๋ง, ๊ท์น์ฑ์ ์ฐพ์๋ด๊ณ ๋นํธ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์ง๋๋ฐ์ ์์ด ์ด๋ ค์์ด ์์๋ค.
ย