<서론>

이클립스에서 아두이노 코딩을 위한 컴파일 작업을 했고, (http://knight76.tistory.com/entry/이클립스eclipse에서-avr-코딩해서-아두이노arduino-로-이미지-업로드하기-1)
이번에는 avrdude를 이용해서 이미지 업로드하는 방법을 소개한다.

 

<본론>

1. AVRDude 설정

프로퍼티 설정으로 가서, c/c++ build / Settings의 Addtiontal Tool in ToolChain을 선택한다.

“AVRDude” 설정에 대해서 check on 한다.

 

AVRDude item을 선택하고, Command 라인에 대한 설정 내용은 다음과 같이 수정한다.

“${COMMAND} -F -V  -P com3  -b 115200  -p m328p -c arduino -C G:\Arduino-package\arduino-1.0\hardware\tools\avr\etc\avrdude.conf  -U flash:w:arduino-test.hex”

 

망치 버튼을 눌러 동작을 시켜본다.

avrdude 툴을 써서 잘 이미지(hex)를 업로드하는 것을 확인할 수 있다.


**** Build of configuration 328P_16MHz for project arduino-test ****

make all
Building target: arduino-test.elf
Invoking: AVR C++ Linker
avr-g++ -s -Os -o"arduino-test.elf"  ./src/main.o  ./ref/CDC.o ./ref/HID.o ./ref/HardwareSerial.o
./ref/IPAddress.o ./ref/Print.o ./ref/Stream.o ./ref/Tone.o ./ref/USBCore.o
./ref/WInterrupts.o ./ref/WMath.o ./ref/WString.o ./ref/new.o ./ref/wiring.o
./ref/wiring_analog.o ./ref/wiring_digital.o ./ref/wiring_pulse.o ./ref/wiring_shift.o    -lm -Wl,-Map,arduino-test.map,--cref -mmcu=atmega328p
Finished building target: arduino-test.elf
 
Create Flash image (ihex format)
avr-objcopy -R .eeprom -O ihex arduino-test.elf  "arduino-test.hex"
Finished building: arduino-test.hex
 
Invoking: Print Size
avr-size --format=avr --mcu=atmega328p arduino-test.elf
AVR Memory Usage
----------------
Device: atmega328p

Program:   20130 bytes (61.4% Full)
(.text + .data + .bootloader)

Data:        544 bytes (26.6% Full)
(.data + .bss + .noinit)


Finished building: sizedummy
 
Invoking: AVRDude
G:\Arduino-package\arduino-1.0\hardware\tools\avr\bin\avrdude -F -V  -P com3  -b 115200  -p m328p -c arduino -C G:\Arduino-package\arduino-1.0\hardware\tools\avr\etc\avrdude.conf  -U flash:w:arduino-test.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "arduino-test.hex"
avrdude: input file arduino-test.hex auto detected as Intel Hex
avrdude: writing flash (20130 bytes):

Writing | ################################################## | 100% 3.23s

avrdude: 20130 bytes of flash written

avrdude done.  Thank you.

Finished building: avrdudedummy
 

**** Build Finished ****

 

이렇게 이클립스에서 사용하거나 따로 컴맨드 창에서 동작시켜도 된다.

>avrdude -P com3  -b 115200 -p m328p -c arduino -C../etc/avrdude.conf -F -e -U flash:w:test.hex

 

이런 설정은 하나하나 확인하면서 테스트했었는데. 그럴 필요가 없다. (소스 분석할 때는 없었는데/ ^^;; 완전 나의 삽질~ ㅎ)

hardware/arduino/boards.txt 파일을 보면 아래 arduino uno에 대한 설정 내용이 있다. 이 것만 잘 참조해도  avrdude 바로 쓸 수 있다.

 

uno.name=Arduino Uno
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.speed=115200
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino
uno.build.variant=standar






<예제 파일 돌려보기>

1. 아두이노 스타일 코딩로 코딩하는 것은 어렵지 않다. 잘 동작된다.

main.cpp


#include <Arduino.h>


void setup() {
   pinMode(13, OUTPUT);
}

void loop() {
   digitalWrite(13, HIGH);   // set the LED on
   delay(1000);              // wait for a second
   digitalWrite(13, LOW);    // set the LED off
   delay(1000);              // wait for a second
}

int main(void) {
 init();

#if defined(USBCON)
 USB.attach();
#endif
 
 setup();
   
 for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
 }
       
 return 0;
}





2. 그냥 코딩도 잘 돌아간다.
(http://www.javiervalcarce.eu/wiki/Program_Arduino_with_AVR-GCC에 있는 예제)

main.cpp


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

int main (void)
{
  unsigned char counter;
  DDRB = 0xFF;

  while (1)
    {
      PORTB = 0xFF;

      /* wait (10 * 120000) cycles = wait 1200000 cycles */
      counter = 0;
      while (counter != 50)
 {
   /* wait (30000 x 4) cycles = wait 120000 cycles */
   _delay_loop_2(30000);
   counter++;
 }

      /* set PORTB.2 low */
      PORTB = 0x00;

      /* wait (10 * 120000) cycles = wait 1200000 cycles */
      counter = 0;
      while (counter != 50)
 {
   /* wait (30000 x 4) cycles = wait 120000 cycles */
   _delay_loop_2(30000);
   counter++;
 }
    }

  return 1;
}




<project source>




마치며..

이클립스 환경설정하면서 많은 감을 잡은 것 같다. 조금씩 avr도 공부하면서 펌웨어의 즐거움을 즐겨봐야지..
Posted by 김용환 '김용환'