본문 바로가기

스터디 상생플러스 2 - 3 (Atmega328 I/O제어 실습)

반응형

앞에서 배운 레지스터는 다음과 같습니다.

 

DDRx : 입출력 방향을 결정하는 레지스터

PORTx : 출력 신호를 결정하는 레지스터

PINx : 입력된 값이 저장되어 있는 레지스터

 

이를 통해서 간단하게 LED를 On/ Off하는 코드를 알아보겠습니다.

 

예제 코드 1 LED ON

LED가 PB0번에 연결되어 있다고 가정합시다.

회로도 1

 

LED를 On하기 위해서는 다음과 같은 과정이 필요합니다.

1. PB0를 출력 모드로 설정한다.(DDRB 이용)

2. PB0를 HIGH상태로 바꾼다.(PORTB 이용)

 

1번 과정은 다음 코드를 통해 구현할 수 있습니다.

DDRB |= (1 << 0); (= DDRB의 0번째 비트에 1를 저장한다.)

전 시간에 배운 비트 연산자를 활용하여 구현한 것입니다.

 

또는 직접 숫자를 대입하여 할 수도 있습니다.

DDRB |= 0x01; 또는

DDRB |= 0b00000001;(0b는 이진수라는 것을 명시하는 표기방법)

 

이렇게 하면 PB0를 출력 모드로 설정한 것입니다.

 

 

 

 

 

다음로는 PB0를 HIGH상태 즉, 1로 만들어야합니다.

 

PORTB |= (1 << 0); (= PORTB의 0번째 비트에 1를 저장한다.)

또는

PORTB |= 0x01;

또는

PORTB |= 0b00000001;

이렇게하면 PB0를 HIGH상태로 만든 것입니다.

더보기
void setup() {
   DDRB |= (1 << 0);	//PB0를 출력 모드로 설정
   PORTB |= (1 << 0);	//PB0를 HIGH 상태로 변경
}

void loop() {

}

 

 

예제 코드 2 LED OFF

LED를 끄는 동작은 출력은 0v로 한다는 뜻과 동일합니다. 

따라서 PB0를 출력 모드로 설정합니다.

DDRB |= (1 << 0);   //DDRB의 0번째 비트를 1(출력 모드)로 만든다.

 

그런 다음 PB0를 LOW 상태 즉, 0로 만들어 줍니다.

PORTB &= ~(1 << 0);   //PORTB의 0번째 비트를 0(LOW)으로 만든다.

 

더보기
void setup() {
   DDRB |= (1 << 0);	//PB0를 출력 모드로 설정
   PORTB &= ~(1 << 0);	//PB0를 LOW 상태로 변경
}

void loop() {

}

 

 

 

예제 코드 3 LED Blink

On/Off를 배웠으니, On Off On Off를 1초 간격으로 작동하는 코드를 작성해봤습니다.

void setup() {
   DDRB |= (1 << 0);	//PB0를 출력 모드로 설정
   
   PORTB |= (1 << 0);	//PB0를 HIGH 상태로 변경
   delay(1000);
   
   PORTB &= ~(1 << 0);  //PB를 LOW 상태로 변경
   delay(1000);
   
   PORTB |= (1 << 0);	//PB0를 HIGH 상태로 변경
   delay(1000);
   
   PORTB &= ~(1 << 0);  //PB를 LOW 상태로 변경
   delay(1000);
}

void loop() {

}

여기서 LED는 On을 하든, Off를 하든 항상 출력 모드여야하기 때문에

두 번째 줄에만 DDRB |= (1 << 0); 코드로 PB0를 출력 모드로 설정했습니다.

 

반응형