본문 바로가기
Embedded/Atmel

Mac에서 Atmel(AVR) MCU 개발을 위한 환경 구축 - 2 : LED 점등 예제 동작

by Gordon_ 2025. 4. 2.

- 개발 환경

Macbook Pro 14 (M3)

macOS : Sequoia 15.4

 

개발 보드 : NewTC AVR MEGA 128 개발보드

프로그래머 : NewTC AVR용 USPISP V7.0

Jtag 프로그래머 및 디버거 : AVR JTAG ICE USB


1. 서론

  지난 포스트에서 Toolchain를 설치 하였으며 이번에는 개발보드에 기본적으로 장착되어 있는 LED를 점등 하는 예제를 동작시켜볼 예정입니다. 이번에는 터미널를 통해서 컴파일 및 업로드를 하면서 makefile로 자동화 하기 전 컴파일부터 업로드까지의 흐름을 이해할것입니다.

 

2. LED 점등 예제 코딩

# 프로젝트 폴더 생성 및 이동
mkdir -p ~/Documents/atmel/LED_blink
cd ~/Documents/atmel/LED_blink

# 소스 파일 생성
touch ./main.c

 

  먼저 우리가 개발할 보드의 LED를 확인 해보면 PA0에 연결되어 있습니다. 그러므로 PA0를 출력으로 설정하고 1초 마다 점등하도록 예제를 작성하도록 하겠습니다.

// CPU 클력 설정
#define F_CPU 16000000UL
// MCU 설정
#define __AVR_ATmega128A__

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

int main(void){
    DDRA = 0x01; // PA0을 출력으로 설정

    while(1){
        PORTA = 0x01; // PA0의 출력을 HIGH로 설정
        _delay_ms(1000); // 1초 딜레이
        PORTA = 0x00; // PA0의 출력을 HIGH로 설정
        _delay_ms(1000); // 1초 딜레이
    }

    return 0;
}

 

3. avr-gcc로 컴파일

이제 위 소스 코드를 컴파일하도록 하겠습니다.

avr-gcc -Wall -Os -g -DF_CPU=16000000UL -mmcu=atmega128a -o main.bin main.c

- 옵션 설면

-Wall : 모든 Warning 출력

-Os : 출력 결과물의 크기(size)를 최적화(Optimization)

-g : 출력 결과물에 디버깅 심볼을 추가

-DF_CPU=16000000UL : MCU 클럭을 16MHz로 설정

-mmcu=atmega128a : mcu 설정

-o main.bin : 출력 파일 이름을 main.bin으로 설정

컴파일 결과물인 main.bin 확인

4. avr-objcopy로 MCU 업로드하기 위한 hex 파일 생성

  avr-gcc로 main.bin 파일을 생성하였지만 해당 파일은 Atmel MCU에 맞는 파일이 아닙니다. 이를 Atmel MCU에 맞춘 파일로 바꾸어줄 필요가 있습니다.

avr-objcopy -j .text -j .data -O ihex main.bin main.hex

- 옵션 설명

-j .text -j .data : 출력 파일에 복사할 섹션을 설정 (text 섹션과 data 섹션을 복사)

-O  ihex : 출력 파일의 형식을 설정 (hex 형식으로 설정)

main.bin : 입력 파일 이름

main.hex : 출력 파일 이름

 

4. 개발 보드와 프로그래머 연결 및 설정

연결 방법 및 스위치 설정 방법

 

맥북에 연결하면 /dev 폴더 내 디바이스 파일이 생성됩니다.

연결된 USBISP 확인

5. 퓨즈 비트 설정

- 퓨즈 비트 계산기

https://www.engbedded.com/fusecalc/

 

AVR® Fuse Calculator – The Engbedded Blog

Welcome to the classic AVR Fuse Calculator. There is also an ALPHA version of a new fuse configurator, called confFUSE™, which utilizes an up-to-date device database. If you want to give it a try, switch to confFUSE™. But be warned: That new version is

www.engbedded.com

Fuse bit 계산할 MCU 설정

 

주의 해야할 3가지를 반드시 확인

 

위와 같이 설정 하였다면 "Apply feature settings"를 클릭 하여 퓨즈 비트를 확인합니다.

- Ext. Crystal/Resonator High Freq. : 개발 보드는 외부에 16MHz 크리스탈 오실레이터가 있습니다. 그 오실레이터를 사용하기 위한 설정입니다.

- On-Chip Debug Enabled : 나중에 JTAG로 디버깅하기 위해 미리 1로 설정합니다.

- ATmega103 Compatibility Mode : Atmega103과 호환 가능하도록 하는 비트입니다. 저희는 사용할 필요가 없으니 0으로 설정합니다.

 

 

MCU의 퓨즈 비트 Write

avrdude -p m128a -c stk500v2 -P /dev/tty.usbmodem00000000000011 -U lfuse:w:0xff:m -U hfuse:w:0x19:m -U efuse:w:0xff:m

퓨즈 비트 설정 완료

 

- 옵션 설명

-p m128a :  업로드할 MCU 설정

# avrdude가 지원 가능한 mcu 목록 확인
avrdude -p '?'

avrdude가 지원하는 mcu 목록

 

우리가 개발할 mcu

 

-c stk500v2. : 프로그래머의 타입 설정

# avrdude가 지원 가능한 프로그래머 목록 확인
avrdude -c '?'

 

-P /dev/tty.usbmodem00000000000011 : 연결된 프로그래머의 디바이스 파일

 

-U lfuse:w:0xff:m -U hfuse:w:0x19:m -U efuse:w:0xff:m : 우리가 퓨즈 비트 계산기로 도출한 설정

 

6. Hex 파일을 mcu에 업로드

avrdude -p m128a -c stk500v2 -P /dev/tty.usbmodem00000000000011 -U flash:w:main.hex

 

- 옵션 설명

-U flash:w:main.hex 

     flash : 접근할 메모리 타입

     w : 쓰기(Write)

     main.hex : 업로드할 파일