본문 바로가기

스터디 상생플러스 2 - 2 (Atmega328 I/O제어 이론)

반응형

우리가 다룰 MCU는 Atmega 시리즈 중에서

아두이노의 MCU인 Atmega328을 기준으로 얘기할 예정입니다.

 

이번 장부터는 여려워질 수 있습니다.

가능한 모든 원리를 기술할 거지만,

궁극적인 목표는 MCU 다루기에 초점이 맞춰져 있기 때문에, 원리 부분은 넘기셔도 괜찮습니다.

 

I/O 제어란

입력(Input)과 출력(Output)을 제어하는 것이며,

Input은 센서 값, 버튼 누름 감지 등이 있으며

Output은 모터 동작, LED 동작, LCD 글자 띄우기 등이 있습니다.

 

별거 아닌 기능처럼 보이지만, 모든 제어의 기초가 되는 제어이며

위에서 든 예시 외에도 수많은 전자 장비들을 제어할 수 있습니다.


출력

MCU는 I/O 레지스터(특수)라는 공간에 데이터를 넣으면,

하드웨어는 자동으로 이를 읽어 1bit 단위로 1 또는 0을 출력합니다.

 

예를 들어 I/O레지스터 x에 10110000라는 값을 넣으면,

하드웨어적으로 0번째 핀에는 0이라는 값을

1번째는 0

2번째는 0

3번째는0

4번재는 1

5번째는 1

6번째는 0

7번째는 1을 출력합니다.

 

자세한 건 밑에서 확인할 수 있습니다.

블럭도

위의 그림에서 PORT D, B, C라는 모듈이 Data Bus를 통해 AVR CPU와 데이터를 주고 받는 것을 알 수 있습니다.

또 PORT D, B, C 모듈 밑에는 PD[0..7], PB[0..7], PC[0..6]라고 나와있습니다.

여기서 PD[0..7], PB[0..7], PC[0..6](=PC0 ~ PC6를 의미)는 핀 이름입니다.

더보기
핀 구성

위의 그림은 아두이노에 있는 MCU 칩의 핀들의 이름을 보여주고 있다.

그림을 보면 PD0 ~ PD7, PB0 ~ PB7, PC0 ~ PC6를 볼 수 있다.

블럭도를 해석하자면

AVR CPU에서 받은 데이터(I/O관련)가 PORTD 또는 PORTB 또는 PORTC 모듈에 도착한 후

각각의 모듈들은 받은 데이터와 내부 회로를 통해 PD0 ~ PD7 또는 PB0 ~ PB7 또는 PC0 ~ PC6핀에

값을(HIGH(1) 또는 LOW(0)) 출력합니다.

 

이때 데이터는 I/O레지스터 값을 ALU가 계산한 값입니다.

 

즉 우리가 하는 일은 I/O레지스터의 값을 수정하는 행위를 통해

5v(=HIGH=1)을 출력하거나 0v(=LOW=0)을 출력하는 것입니다.

 

PORTB라는 IO레지스터에 11101000을 넣는다면(PORTB = 11101000)

PB7 ~ 0까지의 출력은 다음과 같을 것입니다.

PORTB 1 1 1 0 1 0 0 0
PBn PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Voltage 5v 5v 5v 0v 5v 0v 0v 0v

 


입력

출력이 레지스터에 값을 넣는 행위라면,

입력은 레지스터 값을 읽는 행위입니다.

 

PORT모듈은 PD, PC, PB에서 얻은 값을 회로적으로 처리한 다음

Data Bus를 통해 CPU(I/O레지스터 그중에서 Input 레지스터)로 보냅니다.

 

예를들어 Input 레지스터 PINB가 있다고 가정하고, 상황은 다음과 같다고 합시다.

PBn PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Voltage 5v 0v 0v 5v 5v 0v 5v 5v
Logic 1 0 0 1 1 0 1 1

그러면 2cycle 후에 레지스터 PINB값은 자동으로 10011011로 바뀌어 있고,

우리는 PINB값을 이용하여 어떤 PB핀이 어떤 값인지 알 수 있습니다.

 

 

 

위의 내용을 정리하자면 다음과 같습니다.

출력 과정 순서도

 

 

 

 

입력 과정 순서도

 

반응형