2017年2月12日 星期日

用C寫的閃爍程序在ARDUINO上

這樣寫到ARUDINO UNO上??



test1.c
====================================================================
#include <avr/io.h>

int main(void){
long i;
DDRB = 1<<5; //PB5/D13是一個輸出
while(1){
PORTB = 0b00100000;//LED滅
for(i = 0;i<200000; i++); //延時
PORTB = 0b00000000;//LED滅
for(i = 0;i<200000; i++); //延時

}
}
====================================================================
#include<avr/io.h> 這包括程序中要用到的I/O端口的名字和地址( DDRB、PORTB),至於處理器的名字是通過以下命令行參數傳給編譯器的

0b00100000, 也可以用十六進制寫法0x20或是十進制的32來表示,另一種1<<5寫法表示把一個二進制的1向左移位5次,0b00000001左移位5次變成0b00100000

把這文件儲存命名為test1.c ,並保存在方便的文件夾里,然後打開一個命令視窗口,並cd到這個文件夾中。輸入下面的命令來編譯這個簡單的程序test1.c

avr-gcc -mmcu=atmega328p test1.c -o test1.o

這時候在文件夾裡會多出一個test1.o的檔案,avr-gcc編驛器讀入了源代碼,並轉換成ATmega328(根據命令行中的 -mmcu=atmega328p)用的機器語言,把這結果輸出一個叫test1.o的文件中

然後再轉換成可以用avrdude工具編程進電路版的二進制映像檔HEX
這個轉換是由avr-objcopy工具完成的,打入以下的命令來做轉換

avr-objcopy -O ihex test1.o test1.hex

一切順利我們則會得到一個test1.hex,我們將用這個二進制映像檔來燒錄到我們的電路板中
利用avrdude這個工具,打入下面命令

avrdude -p atmega328p -c arduino -P \\.\COM19 -U flash:w:test1.hex:i

-p atmega328p 告訴avrdude要編程的晶片的類型
-c arduino  表示用arduino協議來協調晶片的編程

在許多的參考裡都寫stk500v1,但我嚐試著用測試的結果都是無法的寫入
這部份看有沒有知道的,或是因為版本的關係,有待確認
=====================================================================
在不同文件的avrdude.CONF查了一下,有些差別,在有支援能下stk500v1命令的avrdude.CONF文件中的
#       type     = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic |
#                  avr910 | butterfly | usbasp |
#                  jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw |
#                  dragon_dw | dragon_jtag | dragon_isp | dragon_pp |
#                  dragon_hvsp; # programmer type
不支援的avrdude.CONF
#       type     = <type>;                          # programmer type, quoted string
#                          # supported programmer types can be listed by "-c ?type"
在這就有所差異了
=====================================================================

-P \\.\COM19 告訴avrdude用哪個串口。在Windows下,由於某些原故,你的串口編號超過了數字1~9,\\.\這堆東西就是必需了









沒有留言:

張貼留言