Miobot's Story


AVR 기초 강좌

4. ATmega128의 기능 및 제어 1



ATmega128's function(I/O Control)

2012.12.31

 1. 입출력 기능 (I/O)

  


ATmega128 에는 7개 PORT, 총 53개의 I/O를 내장하고 있어서 MCU의 가장 기본이 되는 데이터의 입출력 작업에서 우리가 사용하기에 부족함이 없이 사용할 수 있도록 되어 있다.
 
(1) I/O 란?
I/O는 Input / Output 기능을 말하는 것으로 입력 및 출력을 지원할 수 있도록 회로가 내장되어 있으며, 이를 1:1의 외부 PIN으로 배치해두었다. 예를 들면 현재의 개인 PC의 키보드, 마우스 등은 입력장치에 해당되고 모니터, 프린터, 스피커는 출력장치에 해당된다. 이러한 장치들을 PC에 연결하여 사용자가 원하는 대로 사용하듯 ATmega128에도 스위치, 외부센서, 저장매체 등 다른 입력장치에서 데이터를 받아 이를 가공하고 LED, LCD, 버저, 통신 등과 같은 출력장치를 통해 특정 작업을 수행해 나갈 수 있다. 이렇듯 다양한 I/O 기능은 사용자에게 있어서는 무궁무진한 무기가 된다.


(2) ATmega128의 I/O
● I/O PORT 구성
- 8비트/양방향/범용/병렬 I/O포트 (PORT A ~PORT F) * 6개 = 48개
- 5비트/양방향/범용/병렬 I/O포트 (PORT G) * 1개 = 5개
- 총 53개 I/O를 핀을 가지고 있다.

● I/O PORT 특징
- Read-modify-Write 동작
- 최대 구동전류 40mA
- 풀업저항(Pull-up resistor) 설정 가능

 


(3) ATmega128의 I/O 블록도



(4) ATmega128의 I/O 관련 레지스터
 
I/O 포트를 제어하기 위해서는 각 포트당 3개의 I/O레지스터(DDRx, PORTx, PINx) 가진다. 아래에서는 여러 PORT 중에서 PORT A를 기준으로 I/O제어와 관련된 레지스터를 설명한다.
 
① DDRA(Data Direction Register)
- PORT A의 입/출력 방향설정을 위한 레지스터
- 레지스터를 SET(1)하면 출력으로 CLEAR(0)하면 입력으로 설정된다.


 

 


② PORTA(Data Register)
- 출력용 데이터 값을 위한 레지스터


 

 


③ PINA(Input Pins Address)
- 입력 핀에 해당하는 레지스터로서 입력된 값을 표시한다.


 

 


④ SFIOR(Special Function I/O Register)
- Bit2. PUD(Pull-up Disable) : 모든 포트의 풀업저항 설정을 위한 레지스터
- 1= Disable  /   0=Enable


 

 







 2. 입출력 기능 (I/O) 동작 및 실습



① I/O PORT 출력 동작 및 실습
 
1.0 : DDRx 레지스터의 각 비트를 1로 셋트하면 해당포트의 핀이 출력 핀으로 설정된다.
2.1 : PORTx 레지스터의 각 비트를 1로 셋트하면 해당포트의 핀이 1값을 출력한다. 
2.2 : PORTx 레지스터의 각 비트를 0로 셋트하면 해당포트의 핀이 0값을 출력한다.

 

       [테스트용 LED 모듈 회로]
 
[Tip!] TEST에 있어서는 LED만한 것도 없다!!!
LED 부가회로는 그 구성에 있어서는 아주 단순한 모습이지만 앞으로 있을 I/O, 타이머, USART, ADC까지 모든 실습에 이용될 수 있는 유용한 소자이다. 실습에 필요한 LED 회로를 위와 같이 구성하여 이용하기 바란다.
 

[Example 01]
: PORTA 포트에 연결된 테스트용 LED 모두를 켜지게 하는 테스트 프로그램이다.
#include "iom128.h"
 
void main(void)
{
    DDRA  = 0xFF;   // PORTA 출력으로 설정
    PORTA = 0xFF;   // LED 전체 켜짐
}
 
[Example 02]
: PORTA 포트에 연결된 테스트용 LED가 10101010 순서로 격순으로 켜지게 하는 테스트 프로그램이다. 
#include "iom128.h"
 
void main(void)
{
    DDRA    = 0xFF;     // PORTA 출력으로 설정
    PORTA   = 0xAA;     // 10101010 출력
}

 
[Example 03]
: PORTA 포트에 연결된 테스트용 LED가 약간의 딜레이 시간을 두고 켜고 꺼짐을 반복하게 하는 테스트 프로그램이다.
#include "iom128.h"
 
void delay(long time);      // DELAY 함수 선언
 
void main(void)
{
    DDRA = 0xFF;            // PORTA 출력으로 설정

    while(1)
    {
        PORTA = 0xFF;       // 11111111 출력
        delay(1000000);     // 시간지연
        PORTA = 0x00;       // 00000000 출력
        delay(1000000);     // 시간지연
    }
}
 
void delay(long time)       // DELAY 함수 정의
{
    while(time--);
}



② I/O PORT 입력 동작 및 실습
 
1  DDRx 레지스터의 각 비트를 0로 클리어하면 해당포트의 핀이 입력 핀으로 설정된다.
2  PINx 레지스터의 각 비트를 읽어 들이면 해당포트의 핀 입력 값을 알 수 있다.
 
[Tip!] 스위치 정말 단순하다!!!
LED 부가회로 만큼이나 자주 사용되는 것은 스위치 회로이다. 스위치 하나에 풀업저항 달아준 간단한 구성이지만 이를 이용하여 외부 입력 값을 받을 수 있기 때문이다. 본 강좌에서도 아래의 그림과 같은 스위치를 이용하여 다양한 외부 입력 값을 포트값 / 외부인터럽트으로 처리할 예정이다. (풀업저항이므로, 스위치ON = 0, 스위치OFF = 1)

 




[Example 01]
: PORTD 포트의 0번 핀으로 들어오는 스위치의 On,Off 신호를 입력으로 받아서, 조건에 따라 PORTA 포트에 연결된 테스트용 LED 모두를 키고 켜지게 하는 테스트 프로그램이다.스위치를 누르면 모든 LED가 켜지고, 스위치에서 손을 떼면 모든 LED가 꺼지게 된다.

#include "iom128.h"
 
void main(void)
{
    int Input;

    DDRA = 0xFF;    // PORTA 출력으로 설정
    DDRD = 0x00;    // PORTD 입력으로 설정

    while(1)
    {
        Input = (PIND &(1<<PIND0)); // PIND의 0번 핀 입력 값
        
        if(Input==0)
            PORTA= 0xFF;    // 11111111 스위치ON  → 전등
        else
            PORTA= 0x00;    // 00000000 스위치OFF → 전멸
    }
}



 [ 참고자료 ]


[1] Atmel Corporation, ATmega128(L) Datasheet, http://www.atmel.com/devices/ATMEGA128.aspx?tab=documents
[2] J.P Charras, D.Hollenbeck, KiCad (open source software suite for electronic design automation (EDA)), http://www.kicad-pcb.org


End.

written by Yoonseok Pyo
http://robotpilot.net/
http://cafe.naver.com/openrt


Posted by Miobot