|
|
本帖最后由 tempchar 于 2015-10-29 21:53 编辑
最近发现自己做的一块板不稳定,要隔几天reset一下,就学习了看门狗。
拿一片328p刷了pro mini和uno、nano,然后用mega2560当作isp下载这段程序测试看门狗功能。
测试时发现,饿死狗以后L灯(D13)狂闪,reset无效。
研究了下网上的几个解决方法。
1是bootloader太旧,看门狗有bug。对照了自己的IDE是1.64,hardware\arduino\avr\boards.txt里的bootloader都是optiboot,应该是最新版。
2是用编程器下载程序。我现在都是用IDE的“使用编程器上传”功能。
除了这两个问题都想不到其他出错的可能,大家帮忙看下要怎么办
#include <avr/wdt.h>
void setup() {
wdt_disable();
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, INPUT);
pinMode(10, INPUT);
for (int i = 0 ; i <= 10 ; i ++) {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
wdt_enable(WDTO_8S);
}
void loop() {
if (digitalRead(11) == LOW) {
delay(500);
}
else {
delay(200);
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
wdt_reset() ;
}
}
------------------------------------------------分割线------------------------------------------------
放了好久最近又看了些文档才搞明白。
问题果然出在bootloader上,我之前都是用官方IDE里带的optiboot。
今天从github上下载了最新版本的bootloader,测试以后还就行了!
下载解压缩后放到系统盘Documents\Arduino\hardware\optiboot\avr目录下,把boards.txt改到适合arduino 1.6.4,增加2行
pro328o.upload.tool=arduino:avrdude
pro328o.bootloader.tool=arduino:avrdude
把pro328o.bootloader.file=optiboot_atmega328_pro_8MHz.hex改成pro328o.bootloader.file=optiboot/optiboot_atmega328_pro_8MHz.hex。
因为我用的是328p和内部8M时钟,再把pro328o.bootloader.low_fuses=0xff改成pro328o.bootloader.low_fuses=0xf2。
完整的配置如下:
pro328o.name=[Optiboot] Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
pro328o.upload.protocol=arduino
pro328o.upload.maximum_size=32256
pro328o.upload.speed=115200
pro328o.upload.tool=arduino:avrdude
pro328o.bootloader.tool=arduino:avrdude
pro328o.bootloader.low_fuses=0xf2
pro328o.bootloader.high_fuses=0xdc
pro328o.bootloader.extended_fuses=0x05
pro328o.bootloader.path=optiboot
pro328o.bootloader.file=optiboot/optiboot_atmega328_pro_8MHz.hex
pro328o.bootloader.unlock_bits=0x3F
pro328o.bootloader.lock_bits=0x0F
pro328o.build.mcu=atmega328p
pro328o.build.f_cpu=8000000L
pro328o.build.core=arduino:arduino
pro328o.build.variant=arduino:standard
烧录后刷个看门狗程序就成功了。 |
|