用AVRStudio4開發Arduino

初學Arduino﹐吾係好鍾意Arduino個IDE﹐晌網上揾到篇關於在AVRStudio4開發Arduino software既網頁http://smileymicros.com/blog/2010/10/03/42/ ﹐目弟黎又幾方便﹐加上揾到個STK500 v2兼容的bootloader﹐於是在Arduino試試看。

1. 用bitbang方法將STK500v2既bootloader image (AASB328.hex)寫入Arduino 上既 Mega328P。詳情見http://www.geocities.jp/arduino_ ... tbang_w_ide_en.html ﹐要注意的是寫完Flash image後要寫 Fuse -即要set  BOOTRST fuse同BOOTSZ to 1024 words (2KB)。如果未用過 bitbang 方法我建議先吾好寫 (STK500v2 bootloader) 住, 而係寫一次Arduino既bootloader﹐再試試用Arduino IDE目弟下連吾連到﹐拱可以先verify bitbang 方法/接線有無錯。當然﹐你都可以直接寫STK500v2 bootloader﹐然後用AVR programmer (PC software) 黎verify ﹐不過出左問題你都吾知係接線問題定係PC上AVR Programmer問題。至於Arduino既bootloader﹐可以在C:\Program Files\arduino-0022\hardware\arduino\bootloaders\atmega\  內揾一個叫ATmegaBOOT_168_atmega328.hex既file (我用的是arduino-0022版本) 。這裡的STK500v2 bootloader會用Port B4 (即Arduino板上面的Digital Pin 12) 決定行bootloader定係行application ﹐所以reset時如果Digital Pin 12係Low就會入bootloader(板上粒LED會長亮) ﹐如果係High就吾行bootload而直接行application code﹐我建議加枝10k ohm pull up resistor同一粒 pushbutton晌 Digital Pin 12做boot select。

2. Download smileymicros.com個library(libACW001.a) 同 header file (libACW001.h) 。

3. 晌AVRStudio4上開個新project (我叫TestBlink2), device要Atmega320p, new個c file (我叫TestBlink.c), 在TestBlink.c內寫program:

#include <libACW001.h>                       
#define F_CPU        16000000L        //我的Arduino板上面的crystal是 16MHz

int ledPin = 13;                //用Arduino上Digital Pin 13 做 LED

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

void loop(void) {
        digitalWrite(ledPin, HIGH);        //開
        delay(100);
        digitalWrite(ledPin, LOW);        //關
        delay(100);
        digitalWrite(ledPin, HIGH);        //開
        delay(100);
        digitalWrite(ledPin, LOW);        //關 --即閃2下
        delay(1000);
}

int main(void)
{
        init();
        setup();
        for (;;)        loop();
        return 0;
}

4. Project Config要拱set ﹐要select “Create Hex File” ﹐因program AVR時要用hex file。
Project_settingd.jpg

5. 記得 include path要啱。我個libACW001.h係放晌 ..\ 度
include_path.jpg

6. 重要叫linker要link libACW001.a
library_setting.jpg

7. 其他compiler/linker option用default就OK。

8. 跟著 build ... (會見到以下message)
avr-gcc -I"C:\.\Arduino_AS5\TestBlink2\.."  -mmcu=atmega328p -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT TestBlink.o -MF dep/TestBlink.o.d  -c  ../TestBlink.c
avr-gcc -mmcu=atmega328p -Wl,-Map=TestBlink2.map TestBlink.o   -L"C:\.\Arduino_AS5"  -lACW001  -o TestBlink2.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  TestBlink2.elf TestBlink2.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex TestBlink2.elf TestBlink2.eep || exit 0
avr-objdump -h -S TestBlink2.elf > TestBlink2.lss

AVR Memory Usage
----------------
Device: atmega328p

Program:    1628 bytes (5.0% Full)
(.text + .data + .bootloader)

Data:         16 bytes (0.8% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

OK。無Error。(LED閃兩下都要成1.6KB Flash )

9. 拔走晒bitband時用的4條電線。用USB線將Arduino接上PC(接時要將Digital Pin 12接地﹐即我上面所講入bootloader)。PC上應該見到新COM port。

在AVRStudio4上 ToolsProgram AVRConnect…
connecting.jpg

簡 STK500同 COM port ﹐click Connect…
connect_Arduino.jpg

10. Read一下 Signature ﹐如果有Error就一係bootloader之前無寫好(去返上面bitbang過bootloader入去)﹐一係就係入吾都bootloader(reset再黎過﹐可以按Arduino板上的reset制﹐拱吾洗的PC再認USB-COM device) 。

11. 寫(Program) 完hex file入 Flash之後可以reset ﹐但今次吾洗再將Digital Pin 12接地﹐直接行 application code, 你應該見到LED每1秒半閃2下。收工。
program_flash.jpg

問題係libACW001.a只有Arduino基本Digital I/O, Analog I/O (即ADC同 PWM) 同serial port ﹐距無包Arduino入面其也library如 servo, Ethernet, SD, Stepper …etc. 但係對我黎講已經夠用﹐做Servo時直接用analogWrite(10, PWMValue) call將PWM直出 Digital Pin 10 ﹐不過在 setup()內要加多句改 Timer/Counter1既prescaler令到PWM周期等於50Hz。

至於libACW001.a的serial port, 可以在setup()內加以下function call去 init:

serialBegin(9600);        // set serial port to 9600-8-n-1

在 loop()內要用serial port時可以用 printf(),例如:

ADCVal = analogRead(analogInPin);        //read analog value via ADC
SensorVal = map(ADCVal, 0, 1023, 0, 255);
printf(“ADC value = %d\n”, ADCVal);        //output to serial port --即USB-COM port

由於Arduino上好多library都無port到libACW001.a ﹐重有好多功夫留比大家做。但自從用左STK500v2 bootloader後﹐我已經無再用Arduino個IDE ﹐而係用左AVRStudio 4 + libACW001.a ﹐遲下再晌AVRStudio 5上試試﹐今日到此為止﹐手軟。

http://www.4shared.com/file/cfUjTJeX/AASBv03.html
http://www.4shared.com/file/Dr_xGi49/libACW001.html
http://www.4shared.com/file/KXIjgHuh/TestBlink2.html

提示: 作者被禁止或刪除 內容自動屏蔽

TOP