8개의 LED 중 홀수번호 LED에 불켜기
프로그램을 하기 위해서는 먼저 주어진 과제가 무엇인지를 정확하게 파악하여야 한다. 주어진 과제는 8개의 LED 중 홀수번호 LED는 켜지고 짝수번호 LED는 꺼지게 하라는 것이다. 그러면 하드웨어 적으로 LED가 마이크로프로세서의 어떤 포트와 연결되어 있는지 알아야 한다. 물론 우리가 설계하고 제작한 보드이므로 LED는 마이크로프로세서의 A포트에 연결되어 있다는 것을 알 수 있다. 그러면 B포트 출력과 관련된 레지스터는 무엇인가? 바로 DDRA와 PORTA이다. 8개의 LED 중 짝수번째 LED는 켜지고 홀수번째 LED는 꺼지게 하기위해서 필요한 레지스터 설정은 다음과 같다.
먼저, A포트의 8개 핀들은 전부 출력방향이다. 다시 말해서 마이크로프로세서가 LED에 불이 켜는지(‘1’) 혹은 끄는지(‘0’)에 관한 신호를 내보낸다는 것이다. 따라서 방향은 8 bit 모두 출력이다. 즉, 다음과 같다.
DDRA=0xFF;
이제, LED와 연결되어 있는 PORTA의 내용을 그림 2.25와 같이 짝수번째 비트는 ‘1’을 넣고 홀수번째 비트는 ‘0’을 넣으면 된다.
결국 PORTA=0x55;라는 것을 알았다. 이들 레지스터 값을 프로그램 틀 안에 넣으면 프로그램이 완성되는 것이다.
#include <avr/io.h>
int main(void)
{
DDRA=0xFF;
PORTA=0x55;
return 0;
}
while 문의 조건식 결과를 LED로 나타내기
C 언어의 반복 제어문중에 while 문이라는 것이 있다. 마이크로프로세서 프로그래밍에서 빈번하게 나타나는 C 언어 명령문이다. 이번 실습에서는 while 문을 학습하기로 한다.
while 문은 조건식이 참이면 루프 내(‘{’로 시작해서 ‘}’로 끝나는 범위)의 문장(명령어) 들을 반복 수행하고 조건식이 거짓이면 루프를 빠져 나오는 반복 제어 문장이다. while 문의 형식은 다음과 같다.
while(조건식) //조건식이 거짓이면 루프 끝으로 간다.
{ // <- 루프 시작
문장 1;
문장 2;
.
.
.
문장 n; //조건식이참이면 이면 다시 루프 시작으로 간다.
} // <- 루프 끝
제일 간단한 while문 중에 while(1);이라는 문장을 생각해 보자. 이 문장을 위의 형식에 맞추어 풀어 쓰면 다음과 같이 해석할 수 있다. 예를 들어 아래 문장을 보자.
x=5;
x=(x==5);
while(x)
{
// 문장(명령어)은 아무 것도 없음
}
먼저, 첫 번째 문장에서 x 라는 변수에 5를 대입한다. x값은 5가 된다. 그리고 두 번째 문장의 우변의 조건식(x==5)에 의해 x가 5와 같은 지 살펴본다. 당연히 x에 5를 대입하였으므로 x와 5가 같다. 즉, (x==5)의 결과는 참이다. 컴퓨터에서 일반적으로 0이면 거짓이고, 0이 아니면(대표적으로 1) 참으로 생각한다. 결국 두 번 째 문장에서 좌변의 x에는 결과 값인 참(1)이 대입된다. 그리고 x값을 변화시키는 값이 없으므로 while 문의 조건식 (x)은 항상 참(TRUE)이 된다.
#include <avr/io.h>
int main(void)
{
unsigned char x;
DDRA=0xFF;
x=5;
x=(x==5); //x=1이된다.
PORTA=x;
while(x)
{
//아무런 문장도 없다.
}
return 0;
}
프로그램을 살펴보자. 먼저 새롭게 보이는 문장 중에, unsigned char x; 라는 문장이 있다. “부호없는 문자형 모양(8bit의 용량을 담을 수 있는)의 이름이 x라는 그릇을 신고합니다”라는 뜻이다. C-언어 에서는 x라는 그릇에 5라는 재료를 담으려면, 즉 x=5;라는 문장을 사용하려면 이렇게 컴파일러에게 신고하고 사용하여야 한다. 신고 안하면 ? 오류(error)가 발생한다. 이외의 문장은 앞에서 설명하였다. 이 프로그램을 실행 시켜 보자. (앞의 절차에 따라 컴파일 하고 다운로드 시킨다). x=1이 되고, PORTA=x;이므로 맨 왼쪽의 LED인 LH1에만 불이 켜진다. 그리고는 While(1) { }이 되므로 무한루프에 빠져서 전원이 꺼질 때 까지 CPU는 아무것도 안 하면서 계속 왔다 갔다 반복만 하게 된다.
결국 위 프로그램을 같은 의미로 다시 쓰면 다음 프로그램과 같다.
#include <avr/io.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 1;
while(1);
return 0;
}