포트(port)란 uC가 외부 기기와의 데이터를 주고받는 통로를 말한다. 입력되는 신호를 받고 출력 신호를 내보낼 수 있는 핀으로서 AVR에서는 8개씩 묶어서 포트A, 포트B, 포트C, … 와 같은 식으로 이름이 붙어 있는 것이 일반적이다. 예를 들어 포트D는 8개의 핀으로 구성되며 각 핀은 PD0, PD1, … PD7과 같이 이름이 붙어 있다. 특히 AVR의 경우는 입/출력전류 드라이브 능력이 40mA정도로 높은 편이며 내부에 풀업 저항 (20k~50k)을 내장하여 선택적으로 사용할 수 있으므로 스위치나 센서 등을 연결하는 경우 회로를 간략화할 수 있다. 포트핀의 구조도는 아래와 같다.
[그림 1] avr의 포트 핀 회로도
풀업(pull-up) 저항이란 디지털 회로에서 논리적으로 H레벨을 유지하기 위해서 포트핀과 Vcc를 연결하는 저항을 말한다. 보통은 uC외부에서 연결해야 하지만 AVR은 모든 포트핀에 풀업저항을 내장하고 있어서 SFR을 적절히 설정하면 선택적으로 연결할 수 있다.
포트와 관련된 레지스터
AVR은 각각의 포트에 3개의 관련 I/O레지스터를 가지는데 다음과 같다.
① DDRX (Data Direction Register) 레지스터
② PORTX (Data Register) 레지스터
③ PINX (Port Input Pin Address) 레지스터
모두 8비트 레지스터이고 ATmega8(A)의 경우는 X는 B, C, 혹은 D가 된다. 먼저 포트가 입력으로 쓰일지 출력으로 쓰일지 방향을 정해야 하는데
DDRX의 해당 비트가 '1' 이면 출력,
DDRX의 해당 비트가 '0'이면 입력
으로 지정된다. 그리고
출력인 경우 PORTX 에 출력값을 쓰고,
입력인 경우에는 PINX에서 값을 읽어들인다.
입력값을 읽는 레지스터와 출력값을 내보내는 레지스터가 다르다는 것에 유의해야 한다. 또한 DDRx의 설정과 무관하게 PINx레지스터를 이용하여 해당 핀의 전압 값을 읽어 들일 수 있다. 만약 포트핀이 출력으로 설정되었다면 PINXn 비트는 PORTXn비트의 값과 같아지고 입력으로 설정되었다면 PINXn비트는 핀에 인가되는 전압값에 의해서 그 값이 결정된다.
또 한 가지 알아야 할 것은 포트핀이 입력으로 설정된 경우 PORTX레지스터는 풀업 저항을 연결할 것인지 아닌지를 결정한다는 것이다. 이를 아래 [표 1]에 도시하였다. PUD비트는 MCUCR의 b4이다.
[표 1] portx 레지스터의 설정에 따른 동작
DDRXn | PORTXn | PUD | I/O | 풀업저항 | 비고 |
0 | 0 | × | 입력 | 연결 안 됨 | 3스테이크(하이임피던스) |
0 | 1 | 0 | 입력 | 연결됨 | 내부에서 풀업 |
1 | 0 | × | 출력 | 연결 안 됨 | '0' 출력 (sink) |
1 | 1 | × | 출력 | 연결 안 됨 | '1' 출력 (source) |
PORTX 레지스터는 비트별로 그 값을 각각 지정해 줄 수 있다. 즉 같은 포트라도 어떤 핀은 입력으로 다른 핀은 출력으로 사용할 수 있다. 다음은 ATmega8(A)의 포트에 관련된 레지스터를 정리해 놓은 것이다.
예를 들어서 ATmega8(A)의 2번 핀은 PD0/RxD 두 가지 기능이 있다. 이 핀을 포트핀(즉 PD0)으로 사용하고 싶다면 DDRD0 비트를 설정하여 입력/출력 방향을 결정해야 한다. 그 다음 출력일 경우 PORTD0 비트를 이용하여 출력할 값을 내보내면 되고 입력일 경우 PIND0 비트값을 읽어들여서 핀에 인가되는 전압값을 읽어들이면 된다.
포트핀의 내부 저항값과 등가 회로
AVR 포트핀이 출력으로 쓰일 때 데이터쉬트에서 발췌한 전압-전류 곡선이 [그림 1]에 도시되어 있다.
[그림 2] 포트 핀의 전압-전류 곡선 (Vcc=5V) : (a) 출력=1 (b) 출력 = 0
이 그림에서 직선 (엄밀히 말하면 곡선이지만 곡률이 거의 0이므로 직선이라고 가정한다)의 기울기가 바로 저항값이 되며 이 직선의 기울기가 실온일 경우 약 25 정도 된다는 것은 쉽게 알 수 있다. 이는 포트핀의 내부저항이 약 25Ω정도 된다는 것을 의미하며 이것을 근거로 포트핀의 테브낭 등가회로를 작성해 보면 [그림 2]와 같다.
[그림 3] (a) 출력 = 1 인 경우 (b) 출력 = 0 인 경우
포트핀의 내부저항이 약 25Ω이라는 사실을 아는 것은 매우 중요한데, 그 이유는 이 등가회로를 이용하면 주변 회로의 전압-전류를 정량적으로 계산할 수 있기 때문이다.
예를 들면 포트핀에 센서를 연결했을 경우 센서의 데이터쉬트에서 필요한 정보를 얻은 후에 실제 전압-전류값을 정량적으로 계산할 수 있다.
'하드웨어 > ATmega8(A)' 카테고리의 다른 글
ATmega8(A) 포트를 이용한 LED 실험 (Part 2) (0) | 2015.06.20 |
---|---|
ATmega8(A) 포트를 이용한 LED 실험 (part 1) (0) | 2015.06.16 |
AVR의 EEPROM에 데이터 읽고 쓰기 (0) | 2015.06.15 |
AVR의 플래시롬에 데이터 기록하기 (0) | 2015.06.15 |
ATmega8(A) avr-gcc/g++ 자료형 (0) | 2015.06.15 |