初學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。
5. 記得 include path要啱。我個libACW001.h係放晌 ..\ 度
6. 重要叫linker要link libACW001.a
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上 ToolsProgram AVRConnect…
簡 STK500同 COM port ﹐click Connect…
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下。收工。
問題係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 |