涂鸦arduino中文社区活动
查看: 9656|回复: 11

全新AVR芯片ATMEGA328P烧录程序的教程

[复制链接]

该用户从未签到

发表于 2019-12-23 17:05 | 显示全部楼层 |阅读模式
本帖最后由 陈叨叨 于 2019-12-23 17:25 编辑

潜水多年,觉得有义务贡献一些内容,此贴作为最近学习Arduino的一个总结。

玩Arduino有几年了,断断续续的。最近开发一个项目,因为我本身不是电子专业,只是对UNO有些经验,所以先用各种模块搭建的系统进行了测试。
测试通过后,开始设计PCB打样,一开始使用的是和UNO一样的芯片进行设计,结果在打样的时候出了问题。

这是我第一次PCB打样,才知道淘宝打样都是10cm以内20元,超过10cm要额外计算,价格差出好几倍。然后我的设计原件比较多,小了板子空间放不下。
然后想起了Arduino mini,用的是tqfp封装的芯片,可以节省空间,这个芯片和UNO的唯一区别就是封装。
所以改板,重新画PCB,打样,采购元件,安装焊接,中间历经坎坷就不多说了。
本来以为一切就绪,结果出现了新问题,程序下载不进去!开始以为是焊接问题,但是按说我这手法不应该出问题啊,但是不管了,马上重新焊一片,问题依旧。

后来上网查询学习,总结知识点一:如何为全新AVR芯片烧录程序

1. Arduino不是指AVR单片机芯片,而是基于AVR单片机搭建的一个平台。
2. ATMEGA328P是AVR单片机的一个型号,常用的Ardunio UNO和Arduino Pro Mini都是基于这款芯片,当然也有基于其他型号芯片的其他版本Arduino。
3. AVR芯片本身只支持SPI方式烧录程序,新的芯片内不含任何程序。
4. 我们平时用的Arduino编程软件,一般情况下是通过串口烧录程序的。

后面两条看起来相悖,这是为什么呢?因为虽然说硬件只支持SPI方式烧录,但试想一下,如果芯片里已经有一个程序,可以通过串口接收数据,写入到芯片里,就实现了串口烧录。这就是Arduino使用的烧录方式,而这个程序,就是Bootloader。

刚才说了,新的AVR芯片不含任何程序,当然也不含Bootloader,所以我们像为UNO烧录程序一样为新的AVR芯片烧录,自然是不行。那怎么办?答案你已经想到了,就是先通过SPI方式为芯片烧录Bootloader程序。

SPI烧录程序有两种方式,一种是单独买一个烧录设备,学名叫做USBISP,这是一个通用硬件,可以为AVR、51等单片机下载程序,支持通用的烧录软件。但是Arduino用不了,因为Arduino对USBISP的协议做了稍稍的修改,将其命名为USBasp。USBISP可以通过刷固件改为USBasp,这里今天先不说这个,因为今天先不讲USBasp方式烧录。有人说你废了半天话,还卖关子。其实不是的,因为一个是要单独买硬件需要成本,更重要的是win10下没有USBasp驱动,虽然有解决办法但是比较复杂。不如下面说的第二种方式来的简单。

第二种方式,是通过把现有的Arduino模拟成USBISP,实现烧录。这种方式无需为驱动操心,因为你的UNO早就和你的电脑愉快的玩耍在一起了吧。

总结知识点二:通过现有Arduino板为新的AVR芯片烧录程序(烧录Bootloader)

首先连接好UNO,打开Arduino软件,选择文件-示例-ArduinoISP-ArduinoISP,这时软件自动打开了一个程序

20191218172507.jpg

选择在工具菜单中设置好开发板的型号UNO,以及软口号。
注意因为这个步骤是为你的UNO烧录程序,所以此处设置和平时烧录程序一样。如果你不是UNO就按你的版本设置。

20191218172726.jpg

然后点上传,和平时一样,为你的UNO烧录程序。
之后你的UNO就以为成为一块模拟USBISP了,按照arduino的说法就是Arduino as ISP。
现在接口定义为:10.RESET、11.MOSI、12.MISO、13.SCK,如果你不是UNO,那就查一下刚才打开这个程序的代码,看下具体定义。

20191223161959.jpg

现在准备为你新的AVR芯片烧录程序,连接好上面说的4条线路,另外不要忘了+5V和GND。
这里用到了TQFP32烧录器,一会交给大家做法。
然后注意软件设置!端口不变,还是你UNO的端口。开发板和处理器按照你的目标AVR芯片设置,和UNO无关!比如我的目标是328P,5V电压,16M晶振,这里就如图设置。


这里可能又有人要问了,为什么开发板选择的是Arduino Pro Mini?因为Pro Mini是328P芯片啊!刚才说了,Arduino是基于AVR搭建的平台,他卖的是平台不是芯片,所以这里不会提供给你芯片型号选项,而是提供Arduino版本选项,所以你选择和你使用同样芯片的版本就行了。

然后编程器选择Arduino as ISP,如果是使用USBasp,这里就选择USBasp。

20191218173147.jpg

然后到这里,一切都准备妥当了。之后有两条路,需要注意了。

如果你单纯想烧录程序,不想要Bootloader,可以按住shift再点上传,每次都用这种方式烧录程序就可以了。
如果你想以后和玩Arduino一样,用串口烧录和调试,点击菜单工具-烧录引导程序,这样就写进去Bootloader了,以后就可以用串口操作了。

如果烧录报错了就检查你的硬件,按照我经验如果连线没问题,一般都是晶振未起震。

总结知识点三:新的AVR芯片开光无需设置熔丝位!

新的AVR芯片开光无需设置熔丝位!新的AVR芯片开光无需设置熔丝位!重要的事情说三遍!

不知道什么时候开始,网上教程都说要为芯片设置熔丝位,那是低级的51的玩法好么!我们这么高级的Arduino,才不用设置熔丝位,你烧录Bootloader的时候,程序帮你一切都做好了。

总结知识点四:328P最小系统设计

20191223163718.jpg

直接看图吧,一共7个外围元件,图中接出了SPI口和串口,当然还有RESET和DTR。
这里要区别一下DTR和RESET,RESET是芯片本身的引脚,而DTR是通过电容接在RESET脚上的。
SPI刷机方式用的是RESET脚,而使用串口刷机方式使用的是DTR信号。

某些版本的USB转串口设备,比如我手上这块CP2102,本身已经集成了DTR电容,那么也可以直接使用RESET引脚。这样就省略了C5,只剩下6个元件。
如果使用村田3脚晶振,因为晶振内置了对地电容,所以C3C4就可以省略了,参照Pro Mini,这样就剩下4个元件。
也就是说保证功能和稳定的前提下,328P的最小系统只要4个元件!

总结知识点五:328P的烧录板制作

在大批量烧录的时候,我们不可能一个一个的去焊引脚,所以就需要一个烧录板,可以快速批量作业。
查了一下万能的淘宝,TQFP32座好贵,要60块钱!
这不是最重要的,重要的是竟然没有成品卖!好吧,我只能自己做一个了。

需要元件:TQFP32座,还有最小系统所需的几个元件。
然后就是手工活了,找了个洞洞板,按照上面电路图焊就行了。

正面样子
微信截图_20191223165228.jpg

背面
微信截图_20191223165241.jpg

插上烧录座
微信截图_20191223165259.jpg

烧录座针脚特写
微信截图_20191223165313.jpg

连接NUO的接线


连接USBasp的接线
微信截图_20191223165338.jpg

连接CP2102的接线
微信截图_20191223165350.jpg

好了完工,此帖到此结束。

最后因为强迫症,打算有时间画个专用的烧录座PCB,把元件烧录座都弄到一张板子上,现在这样好几层看着不舒服。
但是因为有这个能用了,再单画一个又有点不值,所以如果大家有需要的,我就画一个做几片,大家出点费用,不会超过100块钱,如果没有需要的就算了。


该用户从未签到

发表于 2019-12-25 01:17 | 显示全部楼层
详尽、准确程度让我一个玩 AVR 十年的宅都没挑出毛病来,LZ 真的很用心在写。

不过还是要给 LZ 个坏消息的:最小系统的 RESET 缺少对 VCC 的钳位二极管。
至于这个二极管的作用,可以负责的告诉 LZ,没有的话你的 Arduino 自动下载(Bootloader 引导)
会变得生不如死:动不动就不识别,无法自动复位。

该用户从未签到

发表于 2019-12-25 22:54 | 显示全部楼层
陈叨叨 发表于 2019-12-25 21:33
你说的太专业了,我不太懂钳位的概念,能不能给个图纸我学习下。

昨天又测试了一下,DTR电容减小的话, ...

钳位二极管啊,说白了就是限制 RESET 最高电压的概念。

看下边两种方案,(a)没有钳位二极管,(b) 有。在 Vi 有两个相近的低脉冲时(假定低电平持续时间为 T,并且间隔高电平很窄):
(a) 方案可能无法在后一个低脉冲时正常复位(Vo不够低),原因是电容没来及放电;
(b) 方案因为钳位二极管的存在,两个低脉冲间短暂的高电平足以给 C 充分放电(通过钳位二极管),为后一个低脉冲复位做好准备。
     上述通过钳位二极管给 C 放电,使得 Vo 仅仅比 VCC 高 PN 压降(~0.6V)的过程,称之为“电压钳位”,系二极管的用途之一。

rst.png


粗看来上述不可靠复位的 BUG 仅仅发生在 RC<<T 的情况(绿色曲线)。

在 RC>>T 时(橙色曲线)似乎复位没啥问题,都可靠。但为何不被采用?

原因是如果某种情况导致 DTR 长时间低电平(PC端串口可控),就会有很长时间的 RESET 有效时间,
结果 Arduino 长时间不工作,看起来仿佛死机了一样。

例如你用 680k上拉,实际 AVR-RESET 内置了约 50k 上拉,并联以后还是约么 50k,对应 10uF 电容,
结果时间常数 约么 0.5s,就是每次复位后约么 0.5s 后 Arduino 才能运行起来,已经有明显的卡顿。

正常说来玩 Arduino 不必纠结到这个程度。但你要设计系统板的话,很多事情要说清楚才能避免踩坑。

该用户从未签到

 楼主| 发表于 2019-12-25 02:58 | 显示全部楼层
t3486784401 发表于 2019-12-25 01:17
详尽、准确程度让我一个玩 AVR 十年的宅都没挑出毛病来,LZ 真的很用心在写。

不过还是要给 LZ 个坏消息的 ...

你说这个问题我看到过相关帖子,总结原因就是CP2102芯片DTR驱动能力弱,然后有好几个解决方案。你说的加二极管方案我有印象,我没加是因为我这从来没出过这个问题。

然后正好我今天有空测试了一下,我发现我的CP2102上串在DTR上的电容是10u的,而网上资料大部份都是104!我把这个电容换成了104,果然出了问题!然后就悲剧了,换下来的电容掉地上找不到了,手头又没有这个型号。。。

你有空可以测试下,如果10u电容也不行,必须加二极管,那我赶紧改图纸,正好最近有个板子要打样。

该用户从未签到

发表于 2019-12-25 03:16 | 显示全部楼层
陈叨叨 发表于 2019-12-25 02:58
你说这个问题我看到过相关帖子,总结原因就是CP2102芯片DTR驱动能力弱,然后有好几个解决方案。你说的加 ...

我有各种版本的 UNO,以及自己画的类似的系统板(AVR+USB串口),
转串口的芯片我用过 PL2303,FT232,CH340G/C,16U2,8U2,
涉及 DTR 自动复位的都有 RESET 上拉钳位问题。

更为根本原因,是 AVR-RESET 引脚内部没有对 VCC 的钳位二极管,用于兼容高压编程。
就连 AVR 官方手册都推荐外加钳位,当然代价是:
加了钳位二极管,就不能用高压编程了(需要在 RESET 加 12V 高压)。

10uF 电容在一次 DTR 自动复位过程中,不至于被充满,所以下次自动复位还行;
0.1uF 在一次 DTR 自动复位后就充满了(~1s),如果无钳位二极管放电,
就根本没法继续下拉 RESET,导致接下来自动复位失败

该用户从未签到

 楼主| 发表于 2019-12-25 21:33 | 显示全部楼层
t3486784401 发表于 2019-12-25 03:16
我有各种版本的 UNO,以及自己画的类似的系统板(AVR+USB串口),
转串口的芯片我用过 PL2303,FT232,CH3 ...

你说的太专业了,我不太懂钳位的概念,能不能给个图纸我学习下。

昨天又测试了一下,DTR电容减小的话,相应增大RESET上拉电阻可以解决问题。经过测试1u的电容配680K电阻100%正常,0.1u配680K偶尔失败。

该用户从未签到

发表于 2020-2-3 17:25 | 显示全部楼层
请问烧录座打样了吗?我正好须要,可否转一个给我?

该用户从未签到

发表于 2020-5-12 09:37 | 显示全部楼层
t3486784401 发表于 2019-12-25 22:54
钳位二极管啊,说白了就是限制 RESET 最高电压的概念。

看下边两种方案,(a)没有钳位二极管,(b) 有。在 ...

给大佬敬茶,上香!

该用户从未签到

发表于 2020-9-21 20:48 | 显示全部楼层
我搞了几次都没搞成功,先收藏感谢

该用户从未签到

发表于 2020-10-11 15:06 | 显示全部楼层
烧录程序是吧,不错不错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

字符串是否对比该使用哪个函数?
字符串是否对比该使用哪个
现有问题是, 串口接收到的数据是正常的,(通过print函数打印串口收
用电阻式压力传感器(SEN0294)做一个简单的杯垫
用电阻式压力传感器(SEN0
“多喝开水”这句话在目前似乎已经成了一种戏谑的玩笑话,可是多喝水还是很有好处
刚刚买的arduino,希望大神帮我,让我可以对照一下逻辑
刚刚买的arduino,希望大
用什么屏幕无所谓,按键接什么位置无所谓
1602显示时间,如何显示01-09
1602显示时间,如何显示01
请问,如何让1602显示屏,显示00-00-00,我写完程序后,它不显示01-09.显示的是1-9
stm32f103刷arduino 掉坑里了,出不来了
stm32f103刷arduino 掉坑
买了一个stm32f103c8t6的小板子,照教程刷了generic_boot20_pc13.bin,一切正常,用us
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表