아두이노 코딩-49: 아두이노 AVR 방식 DDRD 및 PORTD 명령 의한 LED ON OFF

codingart(66)
Published in
#kr
Words
538
Reading
3 min
Listen
Play
8y

AVR 코딩
AVR 이란 명칭은 Atmel 사에서 개발 판매하는 마이크로 콘트롤러 제품의 등록 상표를 의미한다. 2000년대 초부터 아두이노 우노 보드와 편집기(IDLE)를 보급하기 이전에 부터 지금까지도 AVR 마이크로콘트롤러는 사용이 되고 있으며 자체 편집기 IDLE 이 당연히 있다.

비록 아두이노는 Atmel 사의 칩을 기반으로 만들어진 것이 사실이지만 사용하는 언어 특성은 C/C++ 이다. 하지만 코딩 측면에서 C/C++ 코딩의 범주를 벗어나는 AVR 코딩 특성을 일부 반영한 부분이 남아 있어 아두이노 보드를 보다 고속으로 동작시킬 수 있도록 한다.

즉 여기서 사용되는 명령어 세트들은 아두이노 보드를 보다 고속으로 작동시킬 수 있도록AVR 수준 내지는 어셈블러 형태에 가까운 특별한 명령어들이 사용되고 있다.

외부로부터의 인터럽트 처리과정과 각 핀들의 입출력 모드 설정 및 입출력에 해당하는 명령어를 혼합 사용하여 아두이노 보드의 연산 속도를 극으로 끌어 올릴 수 있으며, 이러한 코딩 기법은 상당히 빠른 loop() 연산 속도가 필요한 드론의 비행제어 보드 코드에 활용된다.

아두이노 우노 보드 구조
Atmega 326 칩을 사용하는 아두이노 우노 보드에서는 크게 전원을 공급하는 파워 블록, 아날로그 센서 입력을 위한 아날로그 블록 과 디지털 핀 블록, USB 커넥터, DC 어댑터로 구성된다.

noname01.png

이러한 아두이노 우노의 구조에서 사진에서처럼 3번 핀에 설치된 LED를 ON OFF 하고자 한다면 pinMode(3,OUTPUT) 명령에 의해 출력 설정이 반드시 선행되어야 한다.

하지만 아두이노에는 또 다른 방식의 핀 모드 설정 방식이 있다. 다음의 pinout 다이아그렘을 참조해 보자.
사진에서 아두이노 우노 보드의 오른쪽 디지털 핀 0∼7번이 PORTD 즉 PD0∼PD7 와 디지털 핀 8∼13번이 PORTB 즉 PB0∼PDB5 로 설정되어 있음을 알 수 있다. 이러한 지정은 아두이노 C/C++ 코딩이 사용되기 이전부터 있어왔던 AVR 코딩 영역과 밀접한 관련을 맺고 있다.

noname02.png

아두이노 명령어를 사용함에 있어서 디지털 핀 0∼13번 핀을 사용하려면 pinMode() 명령을 사용하여 출력 또는 입력 상태를 반드시 사전에 설정해 주어야 한다.

반면에 PORT를 사용해서도 아두이노 코딩이 가능하다. PORT 개념으로 코딩을 하려면 pinMode() 명령 대신 DDRD 또는 DDRB 명령이 사용되며 해당 핀에 출력 또는 입력을 위해서는 PORTD 나 PORTB를 사용하게 된다.

pinMode(3,HIGH)    <--->  DDRD |= B00001000
digitalWrite(3,HIGH) <--->  PORTD |= B00001000
    pinMode(8,HIGH)    <--->  DDRB |= B00000001
digitalWrite(8,HIGH) <--->  PORTB |= B00000001

|= 기호는 포트 코딩에서 8 비트 단위로 OR 코딩한다는 뜻이다. 8비트 데이터는 0과 1을 사용하여 OUTPUT 과 INPUT 또는 HIGH 과 LOW를 의미하게 된다. 8비트 데이터 앞의 B는 불리언(Boolean)을 뜻한다.

쉬운 예를 들어보자.
barGraph 예제에서 처럼 아두이노 디지털 핀 2번에서 11번 핀에 이르기까지 10개의 LED회로가 설치되어 있는 상태에서 4번, 5번, 10번 핀의 LED 가 ON 상태라고 하면 다음과 같이 표현된다.
PORTD |= B00110000 // 4번, 6번 핀 LED ON
PORTB |= B00000010 // 10번 핀 LED ON

이 상태에서 추가로 3번 핀에 LED를 ON 해 보도록 하자. 3번 핀은 PORTD 에 속하며 다음과 같이 명령하도록 한다.

PORTD |= B00001000

|= 기호는 포트 코딩에서 8 비트 단위로 OR 코딩한다는 뜻이므로 다음과 같이 OR 연산을 수행하자.
PORTD |= B00110000
OR PORTD |= B00001000


   PORTD |= B00111000

디지털 핀 3번에 LED를 설치하고 5초 간격으로 LED를 ON OFF 하는 하도록 코딩해보자.

noname03.png

이와 같은 코딩의 이점은 컴파일 업로딩 시 연산 속도의 빠름에 있는데 아두이노 우노의 클럭 속도가 16MHz 로 그다지 빠르지 못하므로 주로 드론과 같이 빠른 내부 연산을 요하는 코딩에서 흔히 사용되고 있다.

아울러 아날로그 채널 0∼5번까지는 PORTC로 정의 되고 있으며 아날로그 값 입출력도 비슷한 방식으로 코딩이 가능하다.

2∼11번 핀까지 LED 가 설치된 barGraph 회로를 사용하여 2번째 청색 LED 가 5초마다 ON OFF 됨을 동영상에서 보도록 하자.

//PORTD_LED_ON_OFF_01
void setup() {
// 76543210
DDRD = B00001000; //3번 핀 출력 설정
}

void loop() {
PORTD = B00001000;// 3번 LED ON
delay(5000);//시간지연
PORTD = B00000000;// 3번 LED OFF
delay(5000);//시간지연
}//끝

아두이노 코딩-49: 아두이노 AVR 방식 DDRD 및 PORTD 명령 의한 LED ON OFF | Ecency