文章程式碼顯示

2018年11月19日 星期一

《高階》寫程式Arduino教學 - 08:幫裸(完全空白) 的 ATmega328P 燒錄 Bootloader 或直接上傳程式碼

若在拍賣網上買 ATmega328P 的話,有可能會買到沒有內置 Bootloader 的裸片

對於 Bootloader 是什麼,在此篇不予以討論,目前我們只要知道若沒有 Bootloader 我們就無法以  USB 的方式進行程式碼的上傳即可

本文共分為 3 個部分

1. 使用 Arduino Uno 開發版,其扮演 ISP 燒錄器的角色,對裸(完全全白)的 ATmega328P 直接進行程式碼的上傳

2. 使用 Arduino Uno 開發版,其扮演 ISP 燒錄器的角色,對裸(完全全白)的 ATmega328P 進行 bootloader 的燒錄

3. 對已有 Bootloader 的 ATmega328P 進行程式碼的上傳

正文開始

1. 使用 Arduino Uno 開發版,其扮演 ISP 燒錄器的角色,對裸(完全全白)的 ATmega328P 直接進行程式碼的上傳

此方法會直接將 Arduino IDE 編譯好的程式碼藉由 Arduino Uno 開發版直接上傳至 裸(無預燒bootloader)的 ATmega328P 。燒錄完成後,ATmega328P 內部就直接存有該程式碼

先將 Arduino Uno 開發版燒錄 ArduinoISP 程式,使其成為一個 ISP 燒錄器

開啟 Arduino IDE 中的 檔案 => 範例 => 11. ArduinoISP => 草稿碼 => 上傳

接著接線如下
ATmega328P-PU 的腳位 7(VCC)、20(AVCC)接到5V
ATmega328P-PU 的腳位 8(GND)、22(GND)接地
ATmega328P-PU 的腳位 9(XTAL1)與 10(XTAL2)之間跨接 16Mhz 石英晶體
ATmega328P-PU 的腳位 9(XTAL1)接上一個 22pF 的陶瓷電容到 GND
ATmega328P-PU 的腳位 10(XTAL2)接上一個 22pF 的陶瓷電容到 GND
ATmega328P-PU 的腳位 1(RESET)接上一個 10k 歐姆的上拉電阻 至 5V
ATmega328P-PU 的腳位 1(RESET)接上一個開關的頭,開關的尾巴則連接至 GND 實現拉低復位功能
ATmega328P-PU 的腳位 19 (D13) 接一個 220 歐姆的電阻,串連 LED ,最後接至 GND

Arduino Uno 板 D10,接 ATmega328P-PU 的腳位 1(RESET)
Arduino Uno 板 D11,接 ATmega328P-PU 的腳位 17(MOSI)
Arduino Uno 板 D12,接 ATmega328P-PU 的腳位 18(MISO)
Arduino Uno 板 D13,接 ATmega328P-PU 的腳位 19(SCK)

接線完成後,再開啟一個 Arduino IDE

1.1. 準備好要燒錄的程式碼,如 LED 閃爍程式(如下)

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

void loop() {
  digitalWrite(13, HIGH);   
  delay(500);                       
  digitalWrite(13, LOW);    
  delay(500);                      
}


1.2.  【此步很重要,與我們一般使用 Arduino 開發版時上傳程式碼不同
草稿碼 => 以燒錄器上傳




1.3. 完成,會看到 LED 燈在閃爍




2. 使用 Arduino Uno 開發版,其扮演 ISP 燒錄器的角色,對裸(無預燒bootloader)的 ATmega328P 進行 bootloader 的燒錄

接線與直接上傳程式碼的完全不變,只是點的選項不同罷了

2.1.  直接點選 工具 => 燒錄 Bootloader



2.2. 按看看自己在麵包版上兜的開關 (其作用為使 ATmega328P 的 Reset 變為低電位) ,若有看到 LED 燈閃了幾下後就滅掉,那就表示成功(其行為與 Arduino UNO 開發版按 Reset 鈕時一模一樣)

: 當我們替 ATmega328P 燒錄好 Bootloader 後,往後就可以藉由 USB to Uart (如 FT232 ) 直接經由 Rx Tx 對這個具有 Bootloader 的 Atmega328P 進行程式碼的上傳,如同一個 Arduino Uno 開發版一樣。

事實上,Arduino UNO 開發版最基本的組合就是一個已燒 Bootloader 的 ATmega328P 加上 USB to Uart 的通訊轉換晶片而已。(當然還有一些有關於電源配置的電路,這方面就不是那麼的重要了)

3. 對已有 Bootloader 的 ATmega328P 進行程式碼的上傳

在第 2 點的地方,我們已經成功將 bootloader 藉由另一塊 Arduino Uno (充當燒錄器) 燒錄進一個完全空白的 ATmega328P 中

如果手邊有 FT232 這種 USB <-> Uart 的轉接器,我們就可以使用 uart 來進行板上燒錄了,這樣的好處在於如果我們將 ATmega328P 焊在電路版上時,若要進行程式的修改,就不需要將 ATmega328P 從電路板上拆解下來,再連接到 Arduino Uno 燒錄

接線部份很簡單,就直接將 FT232 的 Rx Tx 與 ATmega328P 的 Tx Rx 對接即可


打開 Arduino IDE ,選擇 FT232 的 COM port

接著有個地方需要注意,我們要勾選 Arduino IDE 偏好設定中的 "顯示詳細輸出 : 上傳選項",其作用等等就會知道



接著按下程式的上傳按鈕
此時下方的顯示幕會出現以下文字




在這個時候,趕緊按下 ATmega328P 電路中的 Reset 按鈕,此時才會進行燒錄的動作

若成功則會出現以下文字



若沒有這個按下 Reset 按鈕的動作則無法進行燒錄,會出現以下文字




20190113補充 :
若嫌還要手動按 Reset 麻煩,則可以將 FT232 的 DTR 腳位 "串聯一個 0.1uF 的電容並連接至 ATmega328P 的 Reset 腳位(pin1) "。如此一來他就會自動幫你達成按 Reset 按鈕的作用了





參考文章
將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片
用FTDI燒錄Atmege328p
FTDI DTR Pin usage?

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引