Arduino中国 | Flamingo EDA

Apr/08

26

深入理解Arduino Bootloader

在调试新装的Arduino Diecimila贴片版本时,遇到一个非常诡异的现象:在将Bootloader通过编程器写入到ATmega168里之后,再通过Arduino的集成开发环境下载程序时,第一次下载完全正常,可第二次就无法完成下载了!

一开始怀疑是熔丝位设置的问题,可奇怪的是相同的设置在直插版本上就没有问题,试了一个晚上,无果。第二天Google了一下,Arduino论坛上有人遇到了现象跟我类似的问题,别人提供的解释是说没有对加锁位(Lock Bit)进行设置。以为找到了问题的症结所在,晚上回到家继续用我的编程器狂写ATmega168,但现象依然如旧:第一次下载没有问题,第二次无法下载。几乎崩溃!

同一个问题纠缠了两天,虽然没有解决,但是了解到了不少ATmega168有关熔丝位和Lock Bit的设置知识。根据Wolf Paulus对熔丝位的描述Aduino Playground里对锁定位的描述,在我的编程器里分别做了如下的设置:


其中BLB1的设置比较重要,它是用来对Bootloader进行保护的。其中SPIEN经实验,在不选中时用下载线能够正常下载Bootloader。

仔细分析了各种可能性,最后还是在对照PCB检查电路时发现了问题,焊接时没有焊C11,焊上去之后就一切正常了,郁闷了我三个晚上的尽然就是一个小小的电容!

查了查 Arduino Diecimila有关自动重启的说明,总算搞清这个电容是用来连接FT232RL的DTR和ATmega168的RESET,如果不接这个电容,或者数值不对(比如今天我就错接了22pF的),都有可能导致Arduino程序无法正确下载。

同样的问题也会发生在Arduino Mini上,得到的启示是在连接USB Adapter和Arduino Mini时,除了电源之外,还要将DTR和RST通过一个100nF的电容连接起来! 真是到处都是陷阱啊,不过这么一折腾,倒是弄清楚了不少东西,虽然时间是花了不少:)

No tags

No comments yet.

Leave a Reply

<<

>>