AVR MCU 개발, 이것에 유의하라

2015.01.15 08:56:04

AVR MCU 개발 시 유의해야 할 사항

마이크로컨트롤러(이하 MCU) 개발 시 하드웨어 또는 C 언어 프로그래밍 오류에 의해 장비가 원하는대로 동작하지 않는 경우가 있다. 여기서는 MCU 개발 시 유의해야 할 점에 대해 살펴본다. 현재 AVR MCU가 많이 사용되므로 AVR 위주로 설명한다.

 

시뮬레이션과 회로 동작

 

일반적으로 전자회로를 개발할 때 양산하기 전에 회로를 미리 구성하여 회로가 정상적으로 동작하는지 파악한다. 그리고 시뮬레이션 프로그램 사용하여 전자회로의 동작을 체크하기도 한다. 비교적 간단한 회로인 경우 시뮬레이션에서 잘 동작하면 실제로도 잘 동작한다. 그러나 회로가 복잡해질수록 시뮬레이션에서는 잘 동작했지만 실제로 회로를 꾸며보면 제대로 동작하지 않는 경우가 있다.

 

WinAVR Programmer's Notepad와 Codevision C의 특징과 비교

1. WinAVR
WinAVR을 설치하면 자동으로 WinAVR Programmer’s Notepad가 깔린다. WinAVR에는 gcc 컴파일러를 구동할 수 있는 기능이 있으며 무료 프로그램치고는 사용하기 좋은 편이다. 단, gcc 컴파일러를 사용할 때는 소스 파일을 작성한 후, 작성한 폴더에 makefile을 넣고 MCU에 따라 약간 수정(MCU의 종류, 속도)해야 한다. 버전은 2004년과 2010년이 있는데, 2010 버전의 경우 delay 함수가 _delay_ms( ) 명령어를 지원하고, 성능이 개선되었으므로 여기서는 2010 버전을 사용한다.

2. Codevision
프로그램 자동생성기, 다운로더 프로그램 내장, ATMEL AVR Studio4와 연계(*.COFF)하여 소스 레벨 디버깅이 가능하며, 표준 라이브러리 외에도 다양한 라이브러리를 제공할 수 있는 등의 기능들이 있다. 평가버전은 무료지만 정식버전은 유료이므로 구입해야 한다.

 

C언어 프로그램 시 주의사항

1. 코드 줄이기
MCU에서 C언어로 코딩할 경우 가급적이면 코드가 적어서 파악하기 쉽도록 하는 것이 좋다. 따라서 다음의 예를 참고하여 어떤 프로그램에서 전체 알고리즘을 분석하여 코드를 줄이면 좋을 것이다. 다음 코드는 시간(μ, m)을 계산하는 함수이다.

 

/* --- time delay functions - 1 clock : 1/11.0592MHz = 90.42 ns --- */
void delay_us(unsigned char time_us)  // time delay(us)
{
 register unsigned char i;

 for(i = 0; i < time_us; i++)   // 4 cycle +
 {
  asm volatile(" PUSH  R0 ");  // 2 cycle +
  asm volatile(" POP   R0 ");  // 2 cycle +
  asm volatile(" PUSH  R0 ");  // 2 cycle +
  asm volatile(" POP   R0 ");  // 2 cycle
// 12 cycle = 1.085 us at 11.0592MHz
 }
}

void delay_ms(unsigned int time_ms)  // time delay(ms)
{
 register unsigned int i;

 for(i = 0; i < time_ms; i++)
 {
  delay_us(250);
  delay_us(250);
  delay_us(250);
  delay_us(250);
 }
} //참고 : 시간 명령어는 delay_us(), delay_ms( ) 사용

그런데 위의 함수들은 WinAVR Notepad에서 #include 를 선언하고, 다음과 같은 함수로 더 간단하고 알기 쉽게 대치할 수 있다.

void delay (int d){
 int i;
 for (i=0; i
}

void delay (int d){
 int i;
 for (i=0; i
} //참고 : 시간 명령어는 _delay_us(), _delay_ms() 사용

 

2. switch∼case문에서 break 사용
switch∼case문은 하나의 조건에 의해 여러 가지 문장 중 한 가지를 선택하여 실행할 때 사용한다. MCU를 이용하여 시스템을 제어하는 실무에서는 조건에 따라 원하는 것만 제어하고 싶을 때 사용한다. 그런데 switch∼case문에서 break의 사용유무에 따라 결과가 다르므로 주의해야 한다. 예를 들어 다음과 같은 예제를 살펴보자.

 

#include
void main( ){
 int code;
 printf(“원하는 제어(1∼3)를 입력하시오 ->”);
 scanf("%d", &code);
 switch(code){
  case 1 : printf("제어A");
  case 2 : printf("제어B");
  case 3 : printf("제어C");
  default : printf("원하는 제어가 없습니다.");
 }
}

 

위의 예제에서 만약 1을 입력한다면 결과는
 제어A제어B제어C원하는 제어가 없습니다.   로 나오게 된다.
만약 3일 입력한다면
 제어C원하는 제어가 없습니다.   로 나오게 된다.

따라서 원하는 특정 제어를 시킬 수는 없다. 이럴 때 다음과 같이 break문을 사용해 본다.

 

#include
void main( ){
 int code;
 printf(“원하는 제어(1∼3)를 입력하시오 ->”);
 scanf("%d", &code);
 switch(code){
  case 1 : printf("제어A"); break;
  case 2 : printf("제어B"); break;
  case 3 : printf("제어C"); break;
  default : printf("원하는 제어가 없습니다.");
 }
}

 

위와 같은 프로그램에서 1을 눌러 실행하면
 제어A가 출력된다.
3을 눌러 실행하면
 제어C가 출력된다.

이와 같은 switch∼case문에서 break문을 넣으면 원하는 대로 제어할 수 있다. 즉, break문을 사용하지 않을 경우 제어문의 의미는 없으며, 단지 분기하는 기능만 한다. 만일 선택적으로 제어하기 위해서는 반드시 break문을 사용해야 한다.

3. 포인터 사용
MCU 제어 시 포인터를 사용하는 경우가 있다. 통신 프로그래밍에서 문자열을 전송하기 위한 수단으로 많이 사용한다. 포인터는 사실 C에서 가장 난해한 부분이라고 할 수 있으므로, MCU에서 포인터를 사용하려고 할 때 당황할 수도 있다. 하지만 원리를 잘 파악하여 향후 MCU 개발 시 사용해보기 바란다.
포인터는 메모리의 주소를 저장해야 하므로 일반 변수처럼 기억장소가 필요한데, 반드시 사용하기 전에 선언을 해야 한다.
(예) int *p;
(설명) 변수p가 단순 변수가 아니라 포인터 변수라는 것을 나타내며, 변수p가 가리키는 주소에 int형 변수가 있다는 뜻.
포인터 변수의 주소 지정 방법에는 두 가지가 있는데, MCU에서는 포인터 변수에 배열 주소를 지정할 때 많이 사용한다.

(1) 포인터 주소 지정 방법
① 포인터 변수에 배열의 주소 지정 방법

 char c[]="ABCDE";  그림 1.
 char *p;

 p=c;

② 포인터 변수에 단순 변수의 주소 지정 방법

 int a=10;그림 2.
 int *p;

 p=&a;

이와 같이 ① 포인터 변수에 배열의 주소 지정 방법을 사용하여 MCUatmega에서 C언어로 직렬통신을 구현하는 코드는 다음과 같다.

 

 char munja[]="Serial communication exam";
 char *pMunja;
 pMunja=munja;
 while (*pMunja) putchar (*pMunja++);
 putchar (0x0a); putchar (0x0d);

 

이 코드는 문자형 포인터를 통해 문자배열의 주소를 저장하고 문자열 끝이 null(\0)이므로 while문을 통해 null이 나타날 때까지 문자를 전송한다. 그리고 LineFeed 기능(0x0a)을 한 후, Return 기능(0x0d)을 하라는 뜻이다.

 

디버깅, 시뮬레이션

MCU에 대한 하드웨어와 소프트웨어를 제작한 후 동작을 살펴보기 위해 소프트웨어를 구동한다. 이때 제대로 동작하지 않으면 디버깅해야 한다. 그런데 실제로는 디버깅 프로그램을 이해하지 않고 쉽게 넘기는 경우가 있다. 따라서 여기서는 대표적인 Atmega MCU의 디버깅 프로그램들에 대해 파악해 본다. 그리고 디버깅하면서 시뮬레이션 기능도 제공한다.

1. AVR Studio 4
Atmel사에서 무료로 제공하는 프로그램 개발 툴로, 편리한 인터페이스와 함께 어셈블러와 디버거를 포함하고 있다. AVR Studio 4는 WinAVR에서 작성한 C 코드를 보면서 디버깅할 수 있으므로 소위 소스 레벨 디버깅이 가능하다. 그리고 Makefile 없이 C 소스를 직접 컴파일할 수 있다.
Atmel사 홈페이지(www.atmel.com)에서 AvrStudio4Setup.exe를 다운받아 사용한다. 이 프로그램만으로 AVR MCU의 디버깅과 시뮬레이션을 충분히 실행할 수 있다.
예를 들어 port1이라는 폴더를 만든다. 그리고 Makefile을 만들기 위해 윈도에서 “시작 → 모든 프로그램 → WinAVR → MFile[WinAVR]”을 차례로 선택한다. 그리고 메뉴 Makefile → Main file name에서 C언어 프로그램 이름을 적는다. 여기서 확장자 .c는 적지 않는다(예를 들면 port1).
그리고 MCU 타입에서는 자신의 MCU 타입을 선택한다. 그 아래에 있는 Output format에서는 ihex를 선택한다. 그 아래의 최적화 레벨 Optimization level에서는 “0”을 선택하여 컴파일 시 최적화를 수행하지 않도록 한다. 그리고 그 아래의 디버그 포맷인 디버그 정보 형식 메뉴에서는 “AVR-ext-COFF(AVR Studio 4.07+, VMLAB 3.10+)”를 선택하여 컴파일 시 디버그 정보를 저장하는 형식 중 하나인 ext-COFF를 선택한다. 그 아래의 C standard level에서는 gnu99를 선택한다. 이와 같이 한 다음 Makefile을 저장하기 위해 File → Save As로 가서 원하는 폴더에 Makefile을 만든다.
Makefile을 만든 후 WinAVR → Programmers Notepad를 실행하여 소스 코드를 작성한다. 그리고 그 파일 이름을 port1.c라고 저장한다. 그런 후 메뉴 Tools → WinAVR[make all]을 눌러 실행한다. 만일 Process Exit Code : 0이 나왔다면 프로그램이 에러 없이 잘 실행된 것이다.
그리고 WinAVR 통합 환경에서 다운로드를 수행하려면 “giveiol.sys” 드라이버 파일을 설치해야 하므로 WinAVR 폴더의 bin 폴더 내 install_giveio.bat 파일을 한번 실행해 준다. 이 드라이버는 WinAVR을 처음 사용할 때 한번만 설치하면 된다.
이와 같이 한 후 AVR Studio 4를 사용하여 프로그램 디버깅과 시뮬레이션을 실행한다. 앞에서 디버그 포맷으로 “AVR-ext-COFF(AVR Studio 4.07+, VMLAB 3.10+)”를 선택했으므로 port1.c가 정상적으로 실행되면 port1.cof 파일이 생성된다.
AVR Studio 4 프로그램을 실행시키면 Welcom to AVR Studio 4 창이 나타나며, 여기서 open 버튼을 눌러 port1.cof 파일을 선택한 후 열기를 누른다. 그러면 port1.aps 파일이 선택되고 저장 버튼을 누른다. 그러면 Select debug platform and device 창이 나오며 여기서 AVR Simulator과 원하는 MCU를 선택한다. 그러면 다음과 같이 AVR Studio Simulation 통합 초기 화면이 나타난다.

 

그림 3.

 

여기서 c 소스 코드의 일부를 가리키는 노란색 화살표는 실행되려고 하는 현재 라인을 표시한다. 그리고 오른쪽 위에는 디버깅을 수행하는데 필요한 다양한 툴 버튼들이 있다.
Workspace 창은 AVR MCU의 모든 레지스트들을 트리 구조 형태로 보여주면서 디버그할 때 시스템 상태를 쉽게 파악할 수 있다.
Register 창은 AVR MCU 범용 작업 레지스터값을 메모리 맵 형태로 보여주는 곳이다.
Memory 창은 AVR MCU의 모든 메모리를 보여준다. Memory 창 왼쪽 상단의 콤보박스를 클릭하면 원하는 메모리를 선택할 수 있다.
I/O View 창은 프로그램 실행 시 CPU, EEPROM 등 여러 디바이스의 입출력 상태를 파악할 때 사용한다.
Editor 창은 c 코드를 보여주는 곳이다. c 코드뿐만 아니라 어셈블 소스 코드도 편집할 수 있다. 디버그 시에는 소스 코드와 함께 현재 실행 위치와 breakpoint 위치 등도 보여준다. 그 외에도 Message 창과 Watch 창도 참고할 수 있다.
이러한 여러 창들은 통합창 상단의 View 메뉴에서 선택해서 볼 수 있다. 그러면 이제 시뮬레이션하면서 디버깅하는 것을 살펴보자.
먼저 커서를 원하는 곳에 둔 후 ▶ (Start Debugging) 버튼을 누르면 디버깅을 시작한다. 그리고 Step over(F10) 버튼을 눌러 한 라인씩 시뮬레이션을 실행한다. Step over는 실행라인에 함수가 있을 경우 함수 안으로 들어가지 않고 함수 전체를 실행한다.
Step into(F11) 버튼은 함수 안으로 들어가서 실행하고 싶을 때 누른다. Step out(shift +F11) 버튼은 현재의 함수를 벗어나고자 할 때 누른다.
만일 어떤 부분만 시뮬레이션을 하고자 할 때는 ● (Breakpoint)를 설정한 후 Run(F5) 버튼을 누른다. Breakpoint를 해제할 때는 커서를 ●가 있는 곳으로 옮긴 후 ●를 한 번 더 눌러준다. 그리고 ●가 설정된 후에도 다른 곳에 커서를 둔 후 ●를 누르면 또 다른 Breakpoint를 설정할 수 있다. 그리고 x● 버튼은 프로그램의 모든 Breakpoint를 없애 준다.
참고로 디버깅을 시작하려면 ▶ 버튼을 눌러야 하며 그 후 프로그램을 실행하려면 Run(F5) 버튼을 누르고, 프로그램 실행을 멈추려면 Break(Ctrl+F5) 버튼을 누른다. 그리고 ■ (Stop Debugging(Strl+Alt+F5))을 누르면 시뮬레이션과 디버깅 실행이 중지된다.
디버깅을 잘 하려면 시뮬레이션 실행 후 Run(F5)을 실행하고 Workspace 창, Register 창, Memory 창, I/O View 창, Watch 창을 확인해 가면서 문제점들을 파악한다.

2. Atmel Studio
Atmel Studio는 AVR MCU를 만든 Atmel사에서 무료로 제공하는 디버깅 및 시뮬레이션 툴이며 컴파일, 어셈블러, 시뮬레이터 기능을 함께 할 수 있다는 것이 장점이다. 설치 과정이 AVR Studio 4보다 더 복잡하며, 컴파일러를 내장하고 있고, 지원하는 MCU도 늘었다.
Atmel사의 홈페이지에 있는 Download Atmel Studio 6에서 프로그램을 다운받아 설치한다. 처음 설치할 때는 Atmel Studio 파일 외에 필요한 파일들을 먼저 설치하라는 화면이 나온다.
여기서 Atmel Studio 6.2 sp1(build 1502) Installer 버전을 확인한다. 다운받으려면 Guest로 간단한 사항들을 입력해야 하는데, 입력 후 Submit를 누르면 Please Confirm Your Registration이라는 문구가 나오며 자신의 이메일에서 다운로드 받을 인터넷 주소가 나온다. 이 주소를 인터넷 주소창에 복사하여 클릭하면 다운받을 수 있다.
설치 후 실행하면 Atmel Studio 6.2 초기화면이 뜬다. 초기 화면에서 새로운 프로젝트를 시작하려면 New Project...를 선택한다. 그러면 Installed Templates에서 C/C++를 선택하면 5가지의 실행 화면이 나오는데 C 언어를 이용하여 AVR 코딩하려면, 첫 번째 GCC C Executable Project C/C++를 선택하고 이름과 저장 위치를 지정한다.
Device Family 선택 화면에서는 사용하고 싶은 MCU와 오른쪽 지원툴을 고른다. 연결할 지원툴이 있을 경우 해당 지원툴을 선택하고, 시뮬레이션하려면 AVR Simulator를 선택한다. 그러면 다음과 같이 기본적인 코딩 화면이 나오며 코딩을 시작한다.
코딩 후 조건에 따라 AVR Studio 프로그램과 같이 시뮬레이션하면서 디버깅할 수 있는데, WinAVR보다 복잡한 편이다. WinAVR의 Programmers Notepad는 Makefile이 없으면 컴파일이 안 되지만, AVR Studio 4, Atmel Studio는 컴파일이 가능하다.

3. VSM Studio
(1) 개요
VSM Studio는 VSM 시뮬레이션 프로그램으로 유명한 Proteus 프로그램을 만든 LabCenter가 무료로 제공하는 일종의 디버깅 툴이다. VSM Studio는 Proteus VSM 시뮬레이션 소프트웨어를 특별히 통합하도록 디자인된 통합 개발 환경(IDE)이다. 익숙한 프로그램은 아니지만 관심있는 사람들을 위해 살펴본다. 주요 기능들은 다음과 같다.
⦁Proteus VSM 시뮬레이션으로 가장 적합한 출력 포맷을 생산할 때와 같은 큰 컴파일러 구조로 되어 있고, 그 컴파일러를 자동으로 검출한다. 이것은 문자 그대로 프로젝트에서 일을 시작할 수 있도록 버튼을 누를 때 발생한다. 그리고 컴파일러 논의 리스트를 배우거나 변경하지 않아도 VSM Studio 안에서 컴파일한다.
⦁소스 코드(펌웨어)를 가진 ISIS 파일(가상 하드웨어)의 연계. 일반적인 IDE에서의 프로젝트와 달리 VSM Studio 프로젝트는 소스 파일과 ISIS 도면 파일을 모두 포함한다. 프로젝트 뷰에 있는 도면 파일을 더블 클릭하면 ISIS 파일을 복사하며, 하드웨어와 소프트웨어 디자인을 모두 능동적으로 쉽게 동작시킨다.
⦁VSM Studio는 디버깅과 시뮬레이션을 위해 ISIS를 복사할 수 있다. 이것은 프로젝트에 관련된 디자인 파일을 발생시킬 때 ISIS에서 시작되며, 클록 주파수와 컴파일러 출력 파일로 미리 로드된다. 모든 사용자는 시뮬레이션을 시작하거나, 디버깅 시작의 포즈 버튼을 사용하기 위해 플레이 버튼을 누른다.
(2) 화면 구성
VSM Studio는 다른 통합 개발 환경 프로그램들과 비슷하게 사용자에게 친숙한 구조로 되어 있다. 다음과 같이 크게 세 부분으로 나뉘어 있다.

 

그림 4.


VSM Studio를 처음 시작할 때 File → New Project를 실행시켜 New Project Wizard를 띄운다. 그리고 Proteus ISIS에서 작성한 디자인 파일(*.dsn)을 가져온다. 여기서는 예제로 Demonstration Project의 AVR Butterfly를 실습해본다.

 


그림 5.


그림 5의 창에서 Next를 누른다. 그러면 MCU를 선택하는 창이 뜬다.

 


그림 6.


atmega128을 사용한다면 atmega128을 선택하고 주파수는 16MHz를 선택한다. 그리고 컴파일러는 WinAVR를 선택하면 되는데, 그림 6에서는 설치되어 있지 않다. 그래서 옆에 있는 Compilers...를 선택하여 그림 7과 같은 창이 나왔을 때 WinAVR에서 인스톨한다. 그러면 WinAVR이 설치된다.

 


그림 7.


언어를 선택하면 그림 8과 같이 WinAVR 20100110 설치화면이 나온다. 적당한 폴더를 정해 설치한다. 다 설치되면 설치되었다는 Yes 표시가 뜬다. OK를 눌러 WinAVR Compiler를 확인하고 다시 OK를 누른다.

 


그림 8.

 

그림 9.


그림 9에서 프로젝트를 저장할 폴더를 선택한 후 OK를 누른다. 그러면 VSM Studio 창이 뜬다. 왼쪽에 있는 Source Files에서 필요한 c 소스를 누르면 작성된 파일들이 나타난다.
이와 같이 VSM Studio는 편집 창(Editing Window)에서 C 코드를 작성한 후 실행하고, 그 결과를 확인할 수 있다. 그런데 과정은 좀 다르지만 컴파일러로 WinAVR을 써서 앞의 설명과 같이 진행할 수도 있다.

 

윤덕하 객원전문기자

Copyright ⓒ 첨단 & Hellot.net





상호명(명칭) : (주)첨단 | 등록번호 : 서울,자00420 | 등록일자 : 2013년05월15일 | 제호 :헬로티(helloT) | 발행인 : 이종춘 | 편집인 : 김진희 | 본점 : 서울시 마포구 양화로 127, 3층, 지점 : 경기도 파주시 심학산로 10, 3층 | 발행일자 : 2012년 4월1일 | 청소년보호책임자 : 김유활 | 대표이사 : 이준원 | 사업자등록번호 : 118-81-03520 | 전화 : 02-3142-4151 | 팩스 : 02-338-3453 | 통신판매번호 : 제 2013-서울마포-1032호 copyright(c) HelloT all right reserved.