ฉันมีปัญหาในการใช้งานตัวควบคุม watchdog ใน AVR ATtiny84A ที่กำลังรีเซ็ตชิปแม้ว่าตัวจับเวลาควรมีเวลาเหลืออีกมาก สิ่งนี้เกิดขึ้นอย่างไม่สอดคล้องกันและเมื่อใช้รหัสเดียวกันในหลายส่วนทางกายภาพ บางรีเซ็ตทุกครั้งบางรีเซ็ตบางครั้งและบางคนไม่เคย
เพื่อแสดงให้เห็นถึงปัญหาฉันได้เขียนโปรแกรมง่าย ๆ ที่ ...
- เปิดใช้งานการจ้องจับผิดด้วยการหมดเวลา 1 วินาที
- รีเซ็ตสุนัขเฝ้าบ้าน
- กะพริบไฟ LED สีขาวเป็นเวลา 0.1 วินาที
- กะพริบไฟ LED สีขาวเป็นเวลา 0.1 วินาที
- ปิดใช้งานการจ้องจับผิด
เวลารวมระหว่างการเปิดใช้งานและปิดใช้งานการเฝ้าระวังน้อยกว่า 0.3 วินาที แต่บางครั้งการเฝ้าระวังการตั้งค่าจะเกิดขึ้นเมื่อดำเนินการตามลำดับการปิดใช้งาน
นี่คือรหัส:
#define F_CPU 1000000 // Name used by delay.h. We are running 1Mhz (default fuses)
#include <avr/io.h>
#include <util/delay.h>
#include <avr/wdt.h>
// White LED connected to pin 8 - PA5
#define WHITE_LED_PORT PORTA
#define WHITE_LED_DDR DDRA
#define WHITE_LED_BIT 5
// Red LED connected to pin 7 - PA6
#define RED_LED_PORT PORTA
#define RED_LED_DDR DDRA
#define RED_LED_BIT 6
int main(void)
{
// Set LED pins to output mode
RED_LED_DDR |= _BV(RED_LED_BIT);
WHITE_LED_DDR |= _BV(WHITE_LED_BIT);
// Are we coming out of a watchdog reset?
// WDRF: Watchdog Reset Flag
// This bit is set if a watchdog reset occurs. The bit is reset by a Power-on Reset, or by writing a
// logic zero to the flag
if (MCUSR & _BV(WDRF) ) {
// We should never get here!
// Light the RED led to show it happened
RED_LED_PORT |= _BV(RED_LED_BIT);
MCUCR = 0; // Clear the flag for next time
}
while(1)
{
// Enable a 1 second watchdog
wdt_enable( WDTO_1S );
wdt_reset(); // Not necessary since the enable macro does it, but just to be 100% sure
// Flash white LED for 0.1 second just so we know it is running
WHITE_LED_PORT |= _BV(WHITE_LED_BIT);
_delay_ms(100);
WHITE_LED_PORT &= ~_BV(WHITE_LED_BIT);
_delay_ms(100);
// Ok, when we get here, it has only been about 0.2 seconds since we reset the watchdog.
wdt_disable(); // Turn off the watchdog with plenty of time to spare.
}
}
เมื่อเริ่มต้นโปรแกรมจะตรวจสอบว่าการรีเซ็ตก่อนหน้านี้เกิดจากการหมดเวลาของ watchdog หรือไม่และถ้าเป็นเช่นนั้นไฟ LED สีแดงจะสว่างขึ้น ฉันเชื่อว่ารหัสนี้ไม่ควรดำเนินการและไฟ LED สีแดงไม่ควรเกิดขึ้น แต่บ่อยครั้งที่มันทำ
เกิดขึ้นที่นี่คืออะไร?