본문 바로가기

Embeded Programming/AVR

소스로 보는 ATmega8535 – 2부. I/O Port

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

소스로 보는 ATmega8535 – 2부. I/O Port

© tapitolife


 1. I/O 포트의 구성

ATmega8535는 4개의 입/출력 포트가 지원됩니다. 각 포트는 8비트로 구성되어 있으므로 한 번에 4바이트의 데이터를 동시에 처리할 수 있죠.

그림 1. Pinout of ATmega8535

 

표 1. 각 핀에 대응하는 2진 값

핀 이름

Px7

Px6

Px5

Px4

Px3

Px2

Px1

Px0

2진 값

2^7

2^6

2^5

2^4

2^3

2^2

2^1

2^0

 

 

포트와 관련된 레지스터로는 DDRx, PORTx, PINx가 있습니다.

 

1) DDRx

포트의 방향을 설정합니다. 1이면 출력 전용, 0이면 입력 전용이며 각 핀별로 따로 설정할 수 있습니다.

 

코드 1. DDRx 사용 방법

01 :

DDRA = 0b11110000;

 

 

이 경우 그림과 같이 상위 4비트는 출력 전용, 하위 4비트는 입력 전용으로 설정됩니다.

그림 2. DDRx의 I/O 방향 설정

2) PORTx

PORTx는 ATmega8535에서 나가는 데이터를 저장하는 레지스터입니다. 이 레지스터를 읽거나 씀으로써 실제로 입/출력이 가능합니다. DDRx를 위와 같이 설정한 경우의 활용 예를 볼까요?

 

코드 2. PORTx 사용 방법

01 :

PORTA = 0b11010000;

 

이렇게 하면 상위 4비트를 통해 ATmega8535로부터 이진수 1101이 출력됩니다.

반대로 PORTA의 값을 읽어올 수도 있습니다.

 

3) PINx

PINx는 ATmega8535로 들어오는 데이터를 저장하는 레지스터입니다. 프로그램은 이 위치에서 값을 읽을 수만 있고 새로 쓰지는 못합니다. 입력 전용으로 설정된 핀에 데이터가 입력되면 1, 아니면 0을 나타냅니다. 출력 전용 핀에 대해서는 PINx의 값이 의미가 없습니다.

 

2. I/O 포트 테스트해보기

아래 예제는 PORTC에 연결된 누름 스위치를 누를 때마다 PORTA에 연결된 LED의 점멸 상태가 바뀌는 회로입니다.

 

코드 3. main.c

#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
int portcnt(int *);
int main()
{
    int portA = 0b00000001;
    int pinC;
    DDRA = 0b11111111;
    DDRC = 0b00000000;
    PORTA = portA;
    while(1)
    {
        pinC = PINC & 0b00000001;
        if(pinC != 0) { PORTA = portcnt(&portA); _delay_ms(50); }
    }
    return 0;
}

int portcnt(int * value)
{
    if(*value == 0b00001000) *value = 0b00000001;
    else *value = *value << 1;
    return *value;
}

 

코드 4. I/O 포트 실습 회로

 

 

 

완성된 회로는 이렇습니다. →

   

시스템 클럭은 16MHz입니다.