[임베디드/개발환경] 우분투로 ATmega128 개발환경을 조성해 보자

2 분 소요

우분투 atmega128 개발 환경설정

avr 개발을 마음먹고 책 몇 권을 사봤으나 전부 윈도우 환경에서 진행하는 것 밖에 나와있지 않고, 한국에서 판매되는 프로그래머나 개발 보드의 안내서에도 윈도우 환경의 ATmel studio 툴에서 실행하는 방법만 나와있다.리눅스 혐오를 멈춰주세요 한국에서 판매하는 제품을 가지고 우분투에서 개발환경을 조성해 보자.

전체적인 흐름은 다음과 같다.

보드와 usbisp인식시키기(최신버전의 우분투라면 알아서 해준다)
avr-gcc, avr-size, avr-objcpy, avrdude등 설치
blink.c 작성 makefile 작성 후 테스트

준비물

atmegaEnv

보드는 AM-128USB v2.0(뉴티씨), usbisp도 뉴티씨제품, UART용 usbttl은 FT232라는 제품이다. 윈도우는 아무거나 꽂아도 알아서 해당하는 드라이버를 깔아준다고 알고 있다(정처기 준비할때 공부했는데 플러그앤플레이였나…). ATmel studio라는 툴에서 실행하면 알아서 해주는 것 같기도 하고. 리눅스는 그렇지가 않으니까, 저번 휴가 때 열심히 해외 avrisp 제품들의 드라이버들을 모아두고 복귀했었는데 이럴수가? 요즘 리눅스는 알아서 해준다. usbisp를 꽂고 dmesg | grep tty했더니 /dev/ttyACM0로 뜬다! 꽂기 전에 lsusb, 꽂고 난 뒤에 lsusb해보고 개수에 변화가 없으면 인식이 안된다는 의미이므로 열심히 구글링을 해서 드라이버를 설치해야 한다. 그러나 한국제품들은 전부 리눅스용 드라이버를 제공하지 않으므로 해외제품들의 드라이버들을 될때까지 설치해봐야 한다. 내가 쓴 제품의 경우 avrisp mk2의 드라이버가 호환되더라(avrisp mk2면 다행이지, 다른제품들의 경우 구글에 영어로 검색해봤지만 튜토나 설명도 제대로 없으니 차라리 avrisp mk2제품을 다시 사자, 외국애들도 이걸 제일 많이 쓰는 것 같더라).

전원공급 전굽기

5볼트 공급받는건 적혀있는데, 어느 핀에 전원을 공급하는지가 안적혀있다… 놀란가슴 부여잡고 구글에 검색을 조금 해봤더니, 점퍼핀을 연결만 하면 usbisp로부터 전원을 공급받는 것 같더라.

atmegaPower

10핀짜리 포트 바로 앞에 있는 조그만 검정색 직사각형 모양이 점퍼 핀을 꽂은 모양이다. 제품 배송왔을 때부터 저렇게 되어있었다. 뭔가싶어서 뽑아버렸는데 크기가 너무 작아서 다시 찾는데 애를 먹었다. 후우

usbisp를 꽂아도 전원이 들어오지는 않아서 UART포트에 FT232를 연결해서 컴퓨터에 꽂았더니 보드가 켜졌다(보드에 LED가 켜지는 것을 확인).

avr개발 관련 패키지들 설치

$sudo apt-get install avr*

구글검색하면 자세한 패키지들의 이름이 나온다. 와일드카드로 avr관련된거 싹다 받으면 된다. 그렇게 많지도 않다.

blink.c 작성

avr계의 HelloWorld가 blink라고 들었다. 얼른 빵판에 LED가 AM-128USB보드의 10번핀(포트 B의 0번핀)에 오도록 꽂아놓고 코드를 써보자.

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>

int main()
{
  DDRB = 0x01;
  
  while(1) {
    PORTB = 0x00;
    _delay_ms(1000);
    PORTB = 0x01;
    _delay_ms(1000);
  }
  
  return 0;
}
    

makefile 작성

C언어로 짠 소스코드는 사람밖에 이해하지 못한다. 마이크로컨트롤러가 이해하게 하려면 플레시 메모리에 hex파일을 구워줘야 한다.

FILENAME = blink
PORT = /dev/ttyACM0
DEVICE = atmega128
PROGRAMMER = avrisp2
BAUD = 9600
F_CPU = 16000000UL
COMPILE = avr-gcc -Wall -Os -DF_CPU=${F_CPU} -mmcu=${DEVICE}

default: compile upload clean

compile: 
	${COMPILE} -c ${FILENAME}.c -o ${FILENAME}.o
	${COMPILE} -o ${FILENAME}.elf ${FILENAME}.o
	avr-objcopy -j .text -j .data -O ihex ${FILENAME}.elf ${FILENAME}.hex
	avr-size --format=avr --mcu=${DEVICE} ${FILENAME}.elf

upload:
	avrdude -v -p ${DEVICE} -c ${PROGRAMMER} -P ${PORT} -b ${BAUD} -U flash:w:${FILENAME}.hex:i

clean:
	rm ${FILENAME}.o
	rm ${FILENAME}.elf
	rm ${FILENAME}.hex

makefile에 들어갈 내용은 총 세 가지인데 컴파일, 업로드, 그리고 클린이다. 컴파일은 avr-gcc 컴파일러로 진행하고 avr-objcpy로 elf파일의 text와 dat부분만 빼와서 hex파일을 만든다. 업로드 부분에서는 avrdude를 이용해 디바이스의 플레시 메모리에 hex파일을 굽는다. clea은 그냥 불필요한 파일을 없애주는 것이다.

사진에서 등장했던 준비물로 개발한다면 device와 programmer를 바꿀 필요가 없을 것이다. port의 경우 $dmesg | greptty해보면 나온다. $make후, 성공적으로 업로드 했다면, LED가 깜빡일 것이다.

atmegaBlink

댓글남기기