티스토리 뷰
쉽다고 생각했던 "hello, world" 출력이 생각보다 쉬운 프로그램이 아니라는 것을 알게 되었으므로 임베디드 시스템에서 해볼수 있는 가장 쉬운 프로젝트를 구현해 보도록 하겠다. 그 방법은 다름 아닌 LED를 켰다, 껏다 해보는 것이다.
사실 LED를 제어하는 코드는 단 한줄만으로도 확인할 수 있지만 왜 그렇게 동작이 되는지 확실히 이해하기 위해서는 상당히 많은 지식을 필요로 한다. 이러한 배경 지식은 하루 아침에 습득할 수 있는 내용이 아니므로 프로젝트를 진행해 나가면서 하나씩 하나씩 익혀 나가면 된다.
먼저 LED 제어를 위한 하드웨어부터 구성하도록 하겠다. 아래 그림과 같은 회로를 브레드 보드에 꾸민다. 이번 프로젝트에 사용될 부품은 빨간색 LED 하나와 초록색 LED하나가 필요하다. 물론 LED에 적당한 전류가 흐르도록 하기위하여 저항도 필요하다. 저항값은 사용하는 LED의 데이터쉬트를 보고 적정 전류가 흐를수 있는 값을 구하면 된다.

위의 회로를 실제 브레드보드에서 구성해보면 다음과 같은 모양으로 나온다.

위의 회로에서 14번 핀의 전압을 high 상태로 만들면 초록색 LED가 켜질것이다. 반대로 15번 핀의 경우는 low 상태일때 LED가 켜지게 된다.
led라는 이름을 가지는 새로운 프로젝트를 만든 후 아래 코드처럼 입력한 다음 프로젝트를 빌드하여 AVR에 적용해 보고 결과를 확인해 본다.
#include <avr/io.h>
int main(void)
{
DDRB = 0x03;
while (1)
{
}
}
빨간색 LED만 불이 켜지면 프로그램이 제대로 동작이 되는 것이다. 만약 초록색 LED만 켜졌다면 LED의 극성을 반대로 연결했을 것이므로 극성을 확인해보아야 한다.
이번에는 5번과 6번줄 코드 사이에 PORTB = 0x03;을 추가한 다음 프로젝트를 새로 빌드한 후 AVR에 적용하여 결과를 확인해 본다.
#include <avr/io.h>
int main(void)
{
DDRB = 0x03;
PORTB= 0x03;
while (1)
{
}
}
이번에는 빨간색 LED는 꺼지고 초록색 LED에만 불이 켜질 것이다.
물론 위의 두가지 예제를 통해서도 이미 프로그램 한대로 AVR이 동작된다고 볼 수 있겠지만, 좀 더 확실한 코드를 이용하여 AVR의 정상동작 여부를 확인해 보도록 하겠다.
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0x03;
PORTB= 0x03;
while (1)
{
_delay_ms(500);
PINB = 0x03;
}
}
위의 코드처럼 수정한 후 다시 프로젝트를 빌드하여 보드에서 어떻게 동작되는지 확인해 보자. 아마 1초에 한번씩 초록색 LED와 빨간색 LED가 서로 교대하며 점멸할 것이다. 만약 1초 주기로 깜빡이지 않으면 코드에 있는 F_CPU 값을 AVR CPU의 동작클럭에 맞게 설정하면 된다. ATmega328P는 초기 동작 클럭이 1MHz로 설정되어 있으므로 위의 코드에서는 1000000으로 설정하였다.
여기까지 프로그래머가 원하는대로 LED가 제대로 불이 켜지고 꺼지는 것을 확인하였으면, 왜 그렇게 동작 되는지에 대해서는 다음 글에서 설명하도록 하겠다.
만약 위에서 설명한대로 LED에 불이 들어오지 않으면 회로에 문제가 있을 가능성이 높으므로 다시한번 회로도처럼 브레드보드에 부품을 구성하여 연결하였는지 확인해 본다. 확실히 연결된것을 확인하였음에도 불구하고 제대로 동작되지 않으면 부품 불량일 수 있으므로 다른 부품으로 교체하여 회로를 구성해 본 다음 정상 동작되는지 확인해 본다.