본문 바로가기

하드웨어, 펌웨어/AVR

[Atmega128] I/O 포트란 무엇일까?

 

 

 

Atmega128에서 I/O포트는 어떻게 되어있을까요?

 

Atmega128에서는 A~G까지의 포트가 있는데요,

모두 양방향 병렬로 입출력을 할 수 있는 디지털 핀으로 구성되어 있어요.

A~F까지는 각각 8개씩, G는 5개의 핀으로 구성되어 있어서

총 53개의 핀이 있어요.

 

 

 

 

 

 

 

 

 

핀의 구조?

 

각각의 핀은 보호용 다이오드와 내부 풀업 저항을 가지고 있어요.

내부 풀업 저항은 스위치같은 입력 소자를 연결할 때 이미 내부 풀업 저항이 있으니

따로 외부 풀업 저항을 굳이 사용하지 않아도 된다는 장점이 있어요.

그리고 이러한 핀들은 LED같은 소량의 전류만 사용하는 애들을

구동할 수 있는 전류를 조금 가지고 있어요. (약 40mA)

 

 

 

 

 

 

 

 

 

I/O포트의 레지스터들

 

1. SFIOR

내부 풀업 저항을 사용할지 말지를 정하는 레지스터.

PUD(Pull-Up Disable) 비트를 1로 설정하면 모든 핀의 내부 풀업 저항을 사용하지 않는 것이고,

0으로 설정하면 내부 풀업 저항을 모두 사용하는 것이에요.

초기값은 0이에요.(내부 풀업 저항 사용)

 

하지만, PUD 비트를 0으로 설정한다고 무조건 내부 풀업 저항이 사용가능한건 아니에요.

내부 풀업 저항을 사용하려면 입출력 방향이 입력으로 되어있어야 하고,

PUD 비트가 0, PORTx 비트가 1로 설정되어야 사용이 가능해요.

 

 

2. DDRx

I/O 포트의 입출력 방향을 설정하는 레지스터.

x에는 아까 말씀드렸던 A~G포트 중 하나를 넣으시면 돼요.

아까 포트 A부터 F까지는 8개의 핀이 있다고 말씀드렸는데요,

핀 하나당 비트 하나로 총 8비트가 있어요.

8개의 비트를 각각 0이면 입력, 1이면 출력이라고 할 때

 

B번 포트의 2번 핀만 출력으로 설정하고 싶다! 하면

2진수로 했을 때 0 0 0 0 0 1 0 0  (왼쪽부터 7번 핀 ~ 제일 오른쪽이 0번 핀) 이므로

16진수로 바꾸면 DDRB = 0x04; 가 돼요.

 

C번 포트의 0~3번 핀만 모두 출력으로 설정하고 싶다! 하면

2진수로 했을 때 0 0 0 0 1 1 1 1 이므로

DDRC = 0x0F; 가 돼요.

 

초기값은 0이에요.(입력 모드)

 

 

3. PORTx

I/O 포트의 출력 값을 설정하는 레지스터.

x에는 DDRx 레지스터와 똑같이 A~G포트 중 하나를 넣으시면 돼요.

출력은 High 또는 Low가 있죠?

High로 출력하려면 1을, Low로 출력하려면 0을 입력하시면 돼요.

 

A번 포트의 3번 핀을 High로 출력하고 싶다면

PORTA = 0x08; 이 돼요.

 

하지만 이 때 유의할 점은 DDRx에서

PORTA의 3번핀을 출력으로 설정했을 때 가능하다는걸 기억하셔야 해요!

즉, PORTx로 통해 값을 출력하려면 그 핀이 미리 출력(Output)으로 설정되어야 한단 거에요.

 

초기값은 0이에요.(Low 설정)

 

 

4. PINx

I/O 포트의 입력 값을 읽을 수 있는 레지스터.

PORTx 레지스터와 반대 개념이라고 생각하시면 편할 거 같아요.

PORTx와 DDRx 레지스터가 각 비트에 읽기/쓰기가 가능했다면,

PINx 레지스터는 읽기만 가능해요.

x에는 마찬가지로 A~G포트 중 하나를 넣고,

A 포트의 2번, 3번 핀에 High값이 들어오고 있을 때

char a = PINA;

를 하면 a의 값에는 0x0C가 들어와 있을거에요.

 

이 레지스터도 마찬가지로 읽고자 하는 핀이 입력설정이 되어있어야 가능해요!

 

이 레지스터는 초기값이 존재하지 않아요.

 

 

 

 

 

 

 

 

 

I/O 포트를 사용하지 않을 때

 

I/O 포트를 우리가 직접 사용하지 않을 때에는 다른 용도로 사용되는데요, 아래 내용과 같습니다.

 

PORTA : 외부에 메모리 또는 I/O를 연결할 때 데이터 핀과 어드레스 하위 A0~A7 핀으로 동작.

PORTB : SPI 인터페이스 단자와 PWM 출력단자로 동작.

PORTC : 외부에 메모리 또는 I/O를 연결할 때 어드레스 상위 A8~A15 핀으로 동작.

PORTD : 외부 인터럽트 및 카운터 클러거 입력 단자로 동작.