# ATMEGA328p 燒錄
參考自https://hkgoldenmra.blogspot.com/2020/02/bootloader-atmega328p.html
1. 使用 Arduino Uno 開發版,其扮演 ISP 燒錄器的角色,對裸(完全全白)的 ATmega328P 直接進行程式碼的上傳
2. 使用 Arduino Uno 開發版,其扮演 ISP 燒錄器的角色,對裸(完全全白)的 ATmega328P 進行 bootloader 的燒錄
3. 對已有 Bootloader 的 ATmega328P 進行程式碼的上傳
## 1.用ArduinoUno做為燒錄器
接線如下:
![](https://i.imgur.com/Mi9tdXS.png)
a.左邊藍色做為燒錄器, 以USB接電腦; 右邊綠色為被燒錄
![](https://i.imgur.com/dPRbsv4.png)
燒錄空白晶片的接線方式
![](https://i.imgur.com/cIPpZXx.png)
![](https://i.imgur.com/wMSoYrf.png)
| Pin腳 | 元件 | 接線 |
|:------------:|:---------------:|:------------:|
| Pin7(VCC) | | 5V |
| Pin20(AVCC) | | 5V |
| Pin8(GND) | | GND |
| Pin22(AGND) | | GND |
| Pin9(XTAL1) | 16Mhz石英震盪器 | Pin10(XTAL2) |
| Pin9(XTAL1) | 22pF陶瓷電容 | GND |
| Pin10(XTAL2) | 22pF陶瓷電容 | GND |
| Pin1(RESET) | 10K歐姆電阻(上拉電阻) | 5V |
| Pin1(RESET) | 輕觸開關(拉低復位) | GND |
| Pin15(D9) | LED+220歐姆電阻 | GND |
ATmega328P-PU 的腳位 19 (D13) 接一個 220 歐姆的電阻,串連 LED ,最後接至 GND
![](https://i.imgur.com/wUq4iCR.png)
b.打開 Arduino IDE 中的範例 => 11. ArduinoISP => 草稿碼
c.選取正確的COM port, 按上傳, 完成後 Uno 就成為燒錄器了。
## 進行燒錄
### 燒錄 bootloader
有些空白的ATMega328P-PU買來時沒有bootloader, 照方法1燒錄程式可正常執行,但無法用USB2TTL線的TX/RX, 與電腦進行連線, 此時需先燒錄 bootloader 才能連線。
### Arduino bootloader 是什麼 ?
對於 ATMEL AVR 晶片來說,就是類似 PC 的 BIOS!
### Arduino bootloader 做什麼用途?
Bootloader 是一個 .hex 的檔案,將它預先燒錄到晶片之後,就可以利用串列通訊(Serial Port)的方式,將Arduino的sketch(.ino)上傳到晶片裡面執行。
![](https://i.imgur.com/HY0bZr7.png)
燒錄器改為Arduino as ISP
![](https://i.imgur.com/xOn5pzy.png)
進行 bootloader 燒錄
### 如何燒錄程式至 ATMega328P-PU 晶片?
因為是透過Arduino Uno轉燒錄, 因此燒錄器仍應維持"Arduino as ISP", 打開要燒錄的程式, 選單中 草稿碼=>以燒錄器上傳
![](https://i.imgur.com/hMjkXEb.png)
## 2.透過 USB 轉 TTL 線燒錄
如果晶片已燒錄 bootloader, 則可以透過 USB 轉 TTL 線進行燒錄。
| USB2TTL | ATMega328p |
|:-------:|:----------:|
| 5V | 5V |
| GND | GND |
| TX | RX |
| RX | TX |
![](https://i.imgur.com/vhcbxSF.png)
接線方式
不透過 Uno 正常燒錄, 需將燒錄器改回 AVRISP mkII, 接著
<font color='red'>很重要!!很重要!!很重要!!</font>
<font color='blue'>按住RESET輕觸開關, 再按上傳, 等畫面顯示"上傳中"後, </font><font color='red'>立刻放開 RESET</font>
![](https://i.imgur.com/JXJkiSX.png)
若出現燒錄失敗, 可能是 bootloader 毀損或是無 bootloader, 應重新燒錄 bootloader。
![](https://i.imgur.com/lJxq5D8.png)
但是最常發生的原因, 是放開RESET的時機不對, 在訊息列<font color='red'>一出現"上傳中"時, 立刻放開RESET</font>
也可以打開選單->檔案->偏好設定->勾選"顯示詳細輸出"
![](https://i.imgur.com/FoNUsqj.png)
編譯完成後, 出現"上傳中...", 訊息欄中<font color='blue'>看到 Using Port 及 Baud Rate, 立刻放開RESET</font>
![](https://i.imgur.com/uglq8fE.png)
這樣便可以順利上傳程式到 ATMega328P 晶片中。
## 藍芽模組
常用的藍芽模組 HC-05、HC-06可以接在TX/RX位置, 讓程式可以透過Serial.read()取得藍芽的輸入訊息。
| Uno/ATMega328P | HC-05 | HC-06 |
|:--------------:|:-----:|:-----:|
| 5V | 5V | 5V |
| GND | GND | GND |
| TX | RX | RX |
| RX | TX | TX |
| 預設BaudRate | 38400 | 9600 |
```
// 程式功能: 當手機或電腦藍芽與HC-05/HC-06連線成功後, 送出'a'=>LED點亮,送出'b'=>LED熄滅
// 接線注意: 連接藍牙模組的序列埠, UNO RX->BT TX, UNO TX->BT RX
char val; // 儲存接收資料的變數
boolean LightOrNot = false; //是否亮燈
int LEDPin = 9;
void setup() {
// 設定藍牙模組的連線速率
// 如果是HC-05,請改成38400
// 如果是HC-06,請改成9600
Serial.begin(38400); // 將藍芽模組接在TX/RX, 則可以用Serial取得藍芽輸入訊息
Serial.println("BT is ready!");
pinMode(LEDPin, OUTPUT);
}
void loop() {
// 若收到「序列埠監控視窗」的資料,則送到藍牙模組
if (Serial.available()) {
val = Serial.read();
Serial.print("Got ");
Serial.println(val);
if (val=='a')
LightOrNot = true;
else if (val=='b')
LightOrNot = false;
}
if (LightOrNot)
digitalWrite(LEDPin, HIGH);
else
digitalWrite(LEDPin, LOW);
}
```