Artikel ini saya tidak akan menjelaskan detil register2 untuk Watchdog Timer di AVR ataupun perhitungan yang rumit. Selain ribet, sudah cukup banyak artikel lain yang membahas hal tersebut.
Ok deh, langsung saja...
Secara singkat, watchdog timer yang biasa kita temukan di mikrokontroler AVR ataupun MCS-51. Berfungsi untuk membantu melakukan reset secara otomatis apabila program mengalami "hang" atau error. Watchdog timer membantu melakukan reset jika dalam kurun waktu yang sudah kita tentukan si program belum juga melakukan tugas yang dikehendaki.
Alur logikanya seperti ini....
Program akan selalu mengirimkan data serial melalui antarmuka UART tiap 1 mili detik.
Nah, jika suatu saat program error dan tidak mengirimkan data lagi, maka "pengawas"(watchdog timer) bertugas untuk melakukan reset otomatis jika lebih dari 1 mili belum juga mengirimkan data.
Sebelum kirim data serial, tentukan waktu tunggu dari "pengawas" agar melakukan reset otomatis. Apabila sudah melewati waktu tunggu, "pengawas" akan melakukan reset.
Pastikan waktu tunggu "pengawas" lebih lama dari pada waktu yang diperlukan untuk mengirimkan data serial. Contoh, kirim data serial perlu waktu 1ms, maka waktu pengawas bisa dibuat lebih dari 1ms. Jika kurang dari 1ms, maka akan reset terus...
Oleh karena itu, setelah mengirimkan data serial, aktifkan "pengawas".
Jika program berhasil mengirimkan data serial, maka matikan "pengawas".
Jika program tidak berhasil mengirimkan data serial, maka tentu saja si "pengawas" belum dimatikan. Setelah waktu tunggu dari "pengawas" habis, langsung deh reset otomatis....
![]() |
Ilustrasi logika penggunaan watchdog timer |
Kemudian bagaimana jika ingin menggunakannya??
Pada WinAVR sudah disediakan library yang tinggal pakai....
- Sertakan file include #include <avr/wdt.h>
- Kemudian tambahkan program ini
- Untuk mengaktifkan bisa menggunakan perintah wdt_enable(value)
- Untuk mematikan bisa menggunakan perintah wdt_disable();
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(); }
Nilai dari value :
Berikut ini cara penggunaannya...
#include <stdio.h> #include <util/delay.h> #include "uart.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(); } //aktifkan interrupt dari watchdog timer //pastikan fungsi get_mcusr diakses sebelum reset otomatis //jika tidak, maka program akan reset terus menerus ISR(WDT_OVERFLOW_vect ){ get_mcusr(); } void sendSMS(char ioNo){ wdt_enable(8); //perintah untuk mengerjakan sesuatu //jika sudah, maka matikan "pengawas" wdt_disable(); } int main(void){ uartinit(); DDRB=0x00; PORTB=0xFF; wdt_disable(); while(1){ if (!(PINB&(1<<0))){ sendSMS('1'); //Kode program selanjutnya.... } return 0; }
Selamat mencoba!!!!!!!!!!!
0 comments:
Post a Comment