Thân chào các bạn mình đang làm 1 số thứ có dính đến watchdog của AVR cụ thể là con ATMEGA32A, bật watchdog lên thì đơn giản thôi ko bàn, nhưng thấy nhiều bạn sau khi bật lên thì ko tắt watchdog được mà vụ stop WD thấy ít ai nói đến (dễ quá chăng). Nhân đây xin chia sẻ tí kiến thức.
Thứ nhất mình dùng watchdog loại OSC/2048K của codevision thiết lập sẵn. Theo datasheet thì nó bảo watchdog này cứ 2s reset mcu 1 lần, thế nhưng trên thực tế là chưa đến 0.8s là nó reset mcu rồi (đã kiểm nghiệm trên thực tế+ mô phỏng)
Thứ hai lần theo datasheet mình đã stop được WD. Đây là code dừng nó đây:
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
WDTCR=0x0F;
PORTA.0=0;
delay_ms(500);
PORTA.0=1;
WDTCR=0b00011000; // stop wd
WDTCR=0x00010000; // stop wd
(cái while để trống)
Xin giải thích cơ chế theo datasheet: cái Porta là mình xuất tín hiệu để kiểm tra xem wd có làm việc hay stop, cái dòng WDTCR=0x0F là khai báo của codevision cho phép wd hoạt động, hai dòng cuối là 2 lệnh của mình nhằm stop wd
Nếu wd đang hoạt động ok thì bạn sẽ thấy porta.0 nhấp nháy do bị reset liên tục (bỏ 2 dòng cuối đi)
Khi wd stop bạn sẽ thấy porta.0 nháy 1 lần rồi đơ
WDTCR=0b00011000 có nghĩa là bạn nạp giá trị 1 vào bit WDTOE và WDE trong thanh ghi WDTCR lúc này watchdog chưa stop đâu nha
WDTCR=0x00010000 có nghĩa là sau đó bạn cho WDE=0 bây giờ watchdog stop rồi đó, bạn có thề làm gì tùy thích
Xong ùi nếu thấy có ích thì thank hay commend or Re cho mình nhé vì lâu lâu mình mới post bài, cần động lực để post thêm
Comment