[맥에서 AVR 개발하기] 통합프로그램 CrossPack를 사용하여 avr 개발하기 [jkit-128-1//atmega 128]



avr 개발을 하기 위해서, 다른 블로그 글을 동일하게 포스팅 하던 도중에 make 같은 명령어가 많이 나오게 되었습니다.
아직 커널 프로그래밍을 완벽하게 하지 못하여, 이해하지 못하고 중단하게 되었습니다. 

그래서 다른 곳에서 CrossPack 이라는 것을 찾아서 설치해보기로 하였습니다. 
저는 jkit-128-1   보드를 사용합니다. 

윈도우 사용자들을 AVR을 개발하기 위해 개발환경으로 AVR Studio(주로 AVR Studio 4)와 툴체인으로 WinAVR을 사용한다.


하지만 맥 운영체제를 위한 AVR Studio는 없기 때문에 맥 사용자들은 다른 방법을 찾아야 한다.

맥 사용자들에게는 다음과 같은 선택지가 있다.


- 개발환경 - 

1. 터미널에 명령어들을 입력해서 소스코드를 컴파일하고 .hex 파일을 개발보드에 올린다.

2. 이클립스나 XCode 등의 통합 개발환경을 이용해서 소스코드를 컴파일하고 .hex 파일을 개발보드에 올린다.


나 같은 경우에는 1번은 너무 어렵게 느껴져서 2번으로 넘어갔다. 
GUI가 좋으니까 이클립스와 CrossPack을 이용해서 AVR 개발환경을 구축하는 방법에 대해서 이야기하고자 한다.


일단 논의를 시작하기 전에 해당 보드의 드라이버는 운영체제에 맞춰서 설치해놓기 바란다. 






CP2102칩을 위한 USB-to-Serial 드라이버 설치

Atmega128 을 사용하기 때문에 해당 드라이버를 설치하러 가보겠다. 
아래의 링크로 들어가서 Mac OSX 용 SiLabsUSBDriverDisk.dmg 를 다운받는다. 


https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers












아래의 링크를 동하여 dmg파일을 열고 아래의 파일 에서 Silicon Labs cp210x vcp driver.pkg 를 실행해서 설치해줍니다. 













맥에서는 AVR을 개발하기 위해 CrossPack라는 통합 프로그램을 사용한다.

CrossPack에는  AVR-GCC, C 라이브러리, AVRDUDE 등이 포함되어있다.

다음 링크에서 다운 받으면 되겠다. 

https://www.obdev.at/products/crosspack/index.html

링크에 들어가면 아래의 홈페이지가 나온다. 
다운로드를 눌러준다. 










그 다음 가장 최신 파일을 다운로드 눌러줍니다. 









해당 파일을 클릭하고 pkg 파일을 더블클릭하여 실행시켜줍니다. 













위와 같은 문구가 뜨기 때문에 control + 열기 를 해줍니다. 







그리고 설치를 진행합니다. 











 $ cd /usr/local $ ls





위의 명령어를 치고 폴더에 있는 CrossPack-AVR 이 있으면 성공입니다!!

만약 CrossPack-AVR-20131216 이 있으면, 아래의  명령어에서 






그 다음 환경 변수 설정에서 시간이 좀 걸렸는데요 


 $ cd ~ $ ls -la


디렉토리에 가서 .bash_profile 를 확인합니다. 



 $ vim .bash_profile

그 다음 해당 파일을 편집합니다. 

이 과정은 시스템 환경변수를 추가해주는 과정입니다. 



 export PATH=$PATH:/usr/local/CrossPack-AVR/bin

아니면 아래의 명령어를 입력해줍니다. (존재 하는 경로로 추가 ) 

export PATH=$PATH:/usr/local/CrossPack-AVR-20131216/bin








그 다음 위의 경로를 추가해 줍니다. 
아래의 경로에는 avrdude가 있습니다. 









그리고 터미널을 껐다가 키거나 다른 터미널을 키면??


정상 작동한다. 






개발환경 세팅

프로그래머 이름과 포트 확인

  • AVR 개발을 위한 프로그래머가 어떤 종류인지, 어떤 이름으로 OS-X에 연결되는지를 알아야 한다.
  • 보통은 STK500 이나 그런 비슷한 이름들이 있다.
  • 내가 사용한 것은 AVRISP 라는 이름인데, STK500 호환기종인지 대체로 STK500 이라 선택하면 잘 동작한다.
  • 그리고 이 프로그래머는 USB로 연결하는 프로그래머지만, 실제로는 USB를 시리얼 포트로 사용해 통신하는 프로그래머다.
  • 맥에서는 이 USB 프로그래머가 연결되면 어떤 디바이스로 인식하는지 알아야 한다.
  • /dev 폴더의 목록을 들여다 보면 tty.SLAB_USBtoUART 라는 이름으로 나타났다.
  • 프로그래머를 꽂지 않았을때 없는 이름이 꽂고 나서 나타나면 그 것이 장치의 이름이다.




      

    반드시 장치를 연결하고 확인하자 ! 






샘플 프로젝트 생성하기

  • 샘플 프로젝트를 만들고 확인해 보자.
  • 샘플 프로젝트로 LED를 깜빡이는 프로그램을 작성한다.
  • 여기 예는 ATmega8, 내장 클럭, PD7에 출력하는 것으로 회로를 구성했다.


 $ cd ~/Desktop

 $ avr-project Demo





  • 여기까지 하면 데스크탑에 Demo 폴더가 생기고, 그 안에 기본적인 프로젝트 파일들이 생성되어 있다.
  • Demo 폴더의 firmware 폴더에 들어가면 실제 작업할 파일들이 보인다.
  • 이제 Makefile을 수정해야 한다.

     $ cd ~/Desktop
     $ avr-project Demo
     $ cd ~/desktop
     $ cd demo
     $ cd firmware






gedit 을 통해서 Makefile 을 수정해줍니다. 


 $ gedit Makefile&








 #PROGRAMMER = #-c stk500v2 -P avrdoper     <== 이것을 다음 줄로 고쳤다.    
 PROGRAMMER = -c stk500v2 -P /dev/tty.SLAB_USBtoUART   













메인 프로그램 작성

main.c 파일을 열고 다음과 같이 수정한다. (인클루드 문장의 꺽쇠 괄호 안에 있는 띄어쓰기는 없앤다)


 $ gedit main.c








#include <avr/io.h>
#include <util/delay.h>
int main(void)    {
    DDRD = 1 << 7;
    for(;;) {
        PORTD ^= 1 << 7;
        _delay_ms(500);
    }
    return 0;
}








make 를 했더니 다음과 같은 에러가 발생했습니다. 

avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=atmega8 -c main.c -o main.o
main.c:1:22: fatal error:  avr/io.h : No such file or directory
compilation terminated.
make: *** [main.o] Error 1









에러 해결법 : < avr/io.h > head 파일에서 include 할 때 왼쪽처럼 공백이 있으면 안된다. 
<avr/io.h>로 바꾸자 !!!  







UART 선택 스위치를 PIC로 맞춘다. 



컴퓨터를 껐다가 키고 수 많은 구글링을 하면서 어느 순간 make 함수가 작동하였다. 

간단하게 나는 프로젝트를 일단 다시 빌드했다. 

새로운 폴더에 아래의 명령어를 통하여 다시 빌드하였다. 

$ avr-project Demo  

그러니 위의 문제가 해소되었다. 




avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=atmega8 -c main.c -o main.o
avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=atmega8 -o main.elf main.o
rm -f main.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size --format=avr --mcu=atmega8 main.elf
avr-size: invalid argument to --format: avr
Usage: avr-size [option(s)] [file(s)]
 Displays the sizes of sections inside binary files
 If no input file(s) are specified, a.out is assumed
 The options are:
  -A|-B     --format={sysv|berkeley}  Select output style (default is berkeley)
  -o|-d|-x  --radix={8|10|16}         Display numbers in octal, decimal or hex
  -t        --totals                  Display the total sizes (Berkeley only)
            --common                  Display total size for *COM* syms
            --target=        Set the binary file format
            @                   Read options from
  -h        --help                    Display this information
  -v        --version                 Display the program's version
avr-size: supported targets: elf32-avr elf32-little elf32-big srec symbolsrec verilog tekhex binary ihex
make: *** [main.hex] Error 1


다행이 위의 문제가 error 은 떴지만 

$ make flash 명령어는 아래와 같이 동작하였다. 


   만약 위의 에러를 없애고 싶으면 (근본적인 해결책은 아니니 하지 않는 것을 추천한다. )

    # avr-size --format=avr --mcu=$(DEVICE) main.elf   를 해주면 된다. 







그 다음 명령어를 입력해준다 

$ make flash








 READ 작동은 되고 있는 것이다 !! 
하지만 아래와 같이 flash 에러가 뜨고 있다. 

make: *** [flash] Error 1

 


구글링을 해보다가 답답해서 avr-size 함수의 문제인 것 같아서 https://github.com/osx-cross/homebrew-avr
해당 링크를 참조하여 명령어를 입력했다. 그러면 아래와 같이 잘 설치를 한다. 

$ brew tap osx-cross/avr
$ brew install avr-gcc
 brew install avr-gcc
==> Installing avr-gcc from osx-cross/avr
==> Installing dependencies for osx-cross/avr/avr-gcc: avr-binutils
==> Installing osx-cross/avr/avr-gcc dependency: avr-binutils
==> Downloading http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.bz2
######################################################################## 100.0%
==> Downloading https://raw.githubusercontent.com/osx-cross/homebrew-avr/master/avr-binutils-size.patch
######################################################################## 100.0%
==> Patching
==> Applying avr-binutils-size.patch
patching file binutils/size.c
==> ../configure --prefix=/usr/local/Cellar/avr-binutils/2.28 --infodir=/usr/local/Cellar/avr-binutils/2.28/share/info --mandir=/usr/l
==> make
==> make install
🍺  /usr/local/Cellar/avr-binutils/2.28: 140 files, 12.0MB, built in 3 minutes 10 seconds
==> Installing osx-cross/avr/avr-gcc
==> Downloading https://gcc.gnu.org/pub/gcc/



그런데 우연히 문제를 해결해 버렸습니다. 

DEVICE     = atmega128 
CLOCK      = 8000000
# PROGRAMMER = #-c stk500v2 -P avrdoper
PROGRAMMER = -c stk500v2 -P /dev/tty.SLAB_USBtoUART
OBJECTS    = main.o
FUSES      = -U hfuse:w:0xd9:m -U lfuse:w:0x24:m


DEVICE     = atmega8 -> atmega128 로 변경 !! 

해주니?? 또 에러가 발생했네요. 



imjaegon$ make fuse
avrdude -c stk500v2 -P /dev/tty.SLAB_USBtoUART -p atmega128 -U hfuse:w:0xd9:m -U lfuse:w:0x24:m
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9702
avrdude: reading input file "0xd9"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xd9:
avrdude: load data hfuse data from input file 0xd9:
avrdude: input file 0xd9 contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0x24"
avrdude: writing lfuse (1 bytes):
Writing |                                                    | 0% 0.00savrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_cmd(): short reply, len = 0
 ***failed;  
Writing | ################################################## | 100% 5.07s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x24:
avrdude: load data lfuse data from input file 0x24:
avrdude: input file 0x24 contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0xff != 0x24
avrdude: verification error; content mismatch
avrdude: safemode: lfuse changed! Was 24, and is now ff
Would you like this fuse to be changed back? [y/n] y
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_cmd(): short reply, len = 0
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_cmd(): short reply, len = 0


avrdude: verification error, first mismatch at byte 0x0000
         0xff != 0x24
avrdude: verification error; content mismatch
avrdude: safemode: lfuse changed! Was 24, and is now ff
Would you like this fuse to be changed back? [y/n] y

위와 같은 문제인데요 .



위에 처럼 lfuse 에 있는 상수를 에러 메세지에 나온걸로 바꿔줍니다. !!! 

그리고 jkit-128-1를 한 번 뽑았다가 다시 꽂으면??
잘 됩니다 !!! 



- 출처 -
https://m.blog.naver.com/PostView.nhn?blogId=swkang7229&logNo=220436587403&proxyReferer=https%3A%2F%2F
www.google.co.kr%2F
http://audiocookie.com/doc/avrosx#.Wd3ZOBO0OLI