#include <avr/wdt.h>
const int ledPin = 13; // the number of the LED pin
void setup() {
wdt_disable();
Serial.begin(9600);
Serial.println("System Init OK!");
pinMode(ledPin, OUTPUT);
Serial.println("Wait 5 Sec..");
delay(5000);
wdt_enable(WDTO_8S);
Serial.println("Watchdog enabled!");
}
uint8_t timer = 0;
void loop() {
if (!(millis() % 1000)) {
Serial.print(millis());
Serial.print("--");
timer++;
Serial.println(timer);
digitalWrite(ledPin, digitalRead(ledPin) == 1 ? 0 : 1); delay(1);
}
// wdt_reset();
}
這個程序無法正常復位,13引腳的燈一直閃爍。帖子里有人用了:
解決方案:http://www.nongnu.org/avr-libc/u ... _avr__watchdog.html
這里的說明: Note that for newer devices (ATmega88 and newer, effectively any AVR that has the option to also generate interrupts), the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms). It is therefore required to turn off the watchdog early during program startup, the datasheet recommends a sequence like the following: 對于atmega88以及新型號的單片機(自帶產生中斷的),看門狗可能會在系統復位之后,依然運行(除掉電復位外)。因此,需要在程序啟動早期,關閉看門狗。datasheet中推薦插入一段這樣的程序:
#include <stdint.h>
#include <avr/wdt.h>
uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
void get_mcusr(void) \
__attribute__((naked)) \
__attribute__((section(".init3")));
void get_mcusr(void)
{
mcusr_mirror = MCUSR;
MCUSR = 0;
wdt_disable();
}
但是這段程序我加了好幾個位置都不行,還是不斷地復位,等反復閃爍,哪位大神能狗解決這個問題?
|