使用Atmega 16/16A的Arduino复制板串口通信

使用Atmega 16/16A的Arduino复制板串口通信

前面我们用Atmega16/16A的“裸片”在Arduino IDE下创建了Arduino开发板的复制板。从Atmega16/16A与Arduino的管脚对应关系上看,我们将拥有31个数字引脚和7个模拟引脚,3路PWM信号引脚,这些都是传统Arduino UNO所不及的——不过我们只是关心它比Arduino板省空间。

但是Atmega16/16A毕竟是复制板,它不支持Arduino常规的串口通信。我们使用的 MightyCore板卡库似乎没有定义Serial库,这在官方说明里介绍过了,所以我们把目光转向了SoftwareSerial库,即虚拟软串口。

结果断断续续调试了一天,最终得到了正确的方案。要点如下:

  1. 使用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)
  1. 设置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); 
}

  1. 接USB To TTL烧录器。这3条线必须必须必须全要连接,这个是关键。
Atmega16/16A USB To TTL
16(D10) TX
17(D11) RX
11(GND) GND
  1. 使用SSCom调试,正常。估计匹配其他波特率、给Atmega使用外部晶振完全没有问题。

下面说明一下哪些做法是不成功的,避坑之法:

  1. 低于9600的软串口波特率设置,基本都是乱码,怎么改动也不行。
  2. 虽为软串口,但如果连接Atmega16/16A上的16、17脚到Arduino的D0、D1脚,能够接收到数据,但均为乱码,上图即是。
  3. 必须使用另一个USB To TTL连接Atmega16/16A的16、17脚,且同时连接双方的GND,否则接收仍为乱码。
  4. Atmega16/16A的软串口与USB To TTL连接时,用Arduino作为编程器给Atmega16/16A编程,所有连接都不用改动,不必担心串口被占用的问题,也算是提供了一个方便。

至此,使用Atmega系列芯片完全替代Arduino基本实现,在未来的作品上把这些芯片直接焊在万能板上,大概也不必再心疼了。

(0)

相关推荐