# 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); } ```