使用Atmega 16/16A的Arduino復(fù)制板串口通信
前面我們用Atmega16/16A的“裸片”在Arduino IDE下創(chuàng)建了Arduino開(kāi)發(fā)板的復(fù)制板。從Atmega16/16A與Arduino的管腳對(duì)應(yīng)關(guān)系上看,我們將擁有31個(gè)數(shù)字引腳和7個(gè)模擬引腳,3路PWM信號(hào)引腳,這些都是傳統(tǒng)Arduino UNO所不及的——不過(guò)我們只是關(guān)心它比Arduino板省空間。
但是Atmega16/16A畢竟是復(fù)制板,它不支持Arduino常規(guī)的串口通信。我們使用的 MightyCore板卡庫(kù)似乎沒(méi)有定義Serial庫(kù),這在官方說(shuō)明里介紹過(guò)了,所以我們把目光轉(zhuǎn)向了SoftwareSerial庫(kù),即虛擬軟串口。 結(jié)果斷斷續(xù)續(xù)調(diào)試了一天,最終得到了正確的方案。要點(diǎn)如下: - 使用Arduino UNO R3作為燒錄器。燒入ArduinoISP,編程器:Arduino As ISP:
接線: Arduino UNO | Atmega16 |
---|
5V | 10(VCC) | GND | 11(GND) | 10 | 9(RESET) | 11 | 6(MOSI) | 12 | 7(MISO) | 13 | 8(SCK) |
- 設(shè)置Atmega16/16A板。Internal 8MHz、Standard Pinout,使用Upload with Programmer。

代碼:
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX int pin=14;//注意這句 void setup() { mySerial.begin(115200); pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); mySerial.print("Milliseconds\n"); delay(500); digitalWrite(pin, LOW); delay(500); }
- 接USB To TTL燒錄器。這3條線必須必須必須全要連接,這個(gè)是關(guān)鍵。
Atmega16/16A | USB To TTL |
---|
16(D10) | TX | 17(D11) | RX | 11(GND) | GND |
- 使用SSCom調(diào)試,正常。估計(jì)匹配其他波特率、給Atmega使用外部晶振完全沒(méi)有問(wèn)題。

下面說(shuō)明一下哪些做法是不成功的,避坑之法:
- 低于9600的軟串口波特率設(shè)置,基本都是亂碼,怎么改動(dòng)也不行。
- 雖為軟串口,但如果連接Atmega16/16A上的16、17腳到Arduino的D0、D1腳,能夠接收到數(shù)據(jù),但均為亂碼,上圖即是。
- 必須使用另一個(gè)USB To TTL連接Atmega16/16A的16、17腳,且同時(shí)連接雙方的GND,否則接收仍為亂碼。
- Atmega16/16A的軟串口與USB To TTL連接時(shí),用Arduino作為編程器給Atmega16/16A編程,所有連接都不用改動(dòng),不必?fù)?dān)心串口被占用的問(wèn)題,也算是提供了一個(gè)方便。
至此,使用Atmega系列芯片完全替代Arduino基本實(shí)現(xiàn),在未來(lái)的作品上把這些芯片直接焊在萬(wàn)能板上,大概也不必再心疼了。 
|