UNO是arduino一个开源的产品,基本上驱动程序,bootload等都可以在其官方上找到,不过说句实在的,因为一直没有成功写进atmega8u2-mc这款控制器里面,一直在怀疑着自己找到的是不是正确的bootload的。就这样子弄了两个星期无果,自己郁闷,公司估计也很郁闷。中间断断续续地焊了几块板,几乎把打样的板子都快用光了,刚开始怀疑是atmega8u2-mc焊接有问题,毕竟公司也是第一次焊QFN的封装,而且两个焊盘间距小得我在默认PCB画图的时候软件老会报错。在两个星期后终于开始把问题弄了个明朗。
在逛arduino官网的时候,一直没有找到关于USB转串口的模块,也就是atmega8u2-mu是怎么下载程序的,之前在提议下公司买了一个专用的下载器,在经过无数次下载程序后发现烧写得进去,但是好像还是行不通的。一直以来没有对UNO里面ISP下载有所想法,一直认为是给主控制部分mega328/168留着的两个ISP下载串口,实际上只能说自己太粗心了。
直到突然在看我画的PCB板的时候恍然大悟,怎么旁边那个ISP接口是跟ATMEGA8U2连在一起的呢?另外,看了一下数据手册,所接的串口还真的是ATMEGA8U2的ISP。
就是少了这个发现的情况下,让自己吃了不少夸呀。实践证明这里才是ATMEG8U2的下载口。
当时那个心情真的是无法形容,赶紧来了一个USBASP下载器(这个下载器是我自己的,当做为公司做贡献了),标准板本基本上是10个接口的,但是ATMEGA8U2是6个引脚的,不过这个对于我倒是好办,在avr单片机论坛/zixunimg/eepwimg/www.51hei.com/bbs/mcu-avr-1.html查了相关资料,把10口的引脚做成了6个引脚就搞定了。怀着忐忑的心情下载了程序,居然很顺利的下载到里面去了,下载界面显示:
本文引用地址:/zixunimg/eepwimg/www.eepw.com.cn/article/201611/323775.htm把UNO插进电脑,居然提示发现新硬件,并自动弹出一个安装驱动程序的下载框,心里那个高兴无法言表,打开IDE也发现了com口了。按照我的惯性思维:有发现com口是可以正常下载程序了,接着是下载程序了,可是无奈的事是下载程序的时候提示
看来是下载程序还有问题,这个问题看了下官网,按着解决办法弄了一个上午又没有什么进展。真是无语了,表示很蛋疼。
后来根据硬件在下载程序的时候灯的显示结果,电脑发送灯会亮,单片机接收灯也没有问题,问题是它们和接收有点不同步的感觉,我想有可能数据在那个地方丢失了,再看了一些AVR单片机的资料,哎,这次终于知道是为什么了,原来是我设置熔丝位的时候没有设置好,这就是对AVR单片机没有深入了解的结果。记得之前学习PIC的时候,在开头总会写上__CONFIG(0x313b);而AVR则不同。在经过一天的研究中,把公司的几个MEGA8U2熔丝位给弄坏了,终于在第五个的时候下载成功,IDE也发现在了COM口,下载程序给MEGA328的时候也顺利了,搞了半个多月的UNO终于算是完美地画了一个句号。下面把我这些天的学习,个人对AVR的设置的看法拿出来跟大家分享一下吧,也许对大家研究和学习AVR会有帮助。
我用的是USBASP下载器,用的软件是网上随便都能够下载得到的progisp。
1.它在编程的时候为0,未编程的时候为1(这里跟我们平时编程可能有点相反,我吃过这夸了,烧坏了两个芯片以后发现了这个问题,其实网上也有很多这方面资料,要是自己能够早点看到别人写的文章给说明一下就好了。自己可以给公司省几块还算值钱的IC呢)。
加密位设置:LB2,LB1为1,0或者0,0时,不能通过任何方式读取芯片内部的flash和eeprom数据。但是熔丝位的状态仍然可以读取,只是不是能修改。因为UNO可以确定bootload程序没有问题,而且考虑到用户买我们产品的时候会不小心修改掉bootload。所以我这里设置为了0,0.这个对一些技术比较厉害的高手对于程序的保护可能会有很大帮助。这也就是我在上一篇文章中提到的AVR的保密性比PIC高的原因。
WTDON为看门狗设置,1表示要用软件控制WTD(看门狗)才打开,0表示不用软件控制WTD一直打开,用户只能利用软件控制WTD的溢出时间。因为我们平时基本上都是不会让WTD一直工作的,所以我在UNO里选1,建议大家设置的时候也选一,要用的时候我们用软件控制就行了。呵呵。用软件控制感觉也不是很麻烦。
SPIEN,这个设置是关键,1表示禁止编程,之前我设置成1,下载程序的时候一直显示模式不对,选0下载成功。原因在于我用的下载方式是SPI下载的。所以这里要打开才行。
bootrst表示上电后从0x00执行还是bootload区执行,我设置的时候是0.表示从0x00开始执行,AVR单片机工作那么快,呵呵,多让它工作点没事,也不碍时间。所以我设置了0x00。实际上在UNO这里设置为1也是可以的。
6.系统时钟源的设置:1111-1010表示外接晶振,其它比如内部晶振,RC振荡我就不写啦,大家感兴趣的可以Q我,大家一起学习或者查一查资料。
CKOPT,CKSEL3 KSEL2,KSEL1,KSEL0.设置的是起振时电容的容量,因为我用的是外部晶振,22pF的方式提供时钟源,所以设置为:1,1,1,1.之前没有设置,所以导致了单片机不知道用那个作为时钟源,导致时钟混乱,所以也就是我看到的程序传输时接收和发送灯的闪亮问题。经过验证原因出在这里。
大概就这么多吧,当然要设置的还有其它,呵呵。时间比较有限,所以只是把我用到的进行了研究,其它一些位就等待以后再研究了。