Ok Para penggemar Arduino , Pada kesempatan ini saya akan menyampaikan sedikit tentang Sleep mode dan Watchdog timer pada Arduino tapi lebih tepatnya pada setiap mikrokontroller.
Langsung aja Gun !!!
Check this Out !!!
Semoga Bermanfaatnya kawan-kawan !!!
Disini saya akan mencoba melalui Simulasi , Jadi yang kita gunakan adalah Proteus 7.1.0 .
PERCOBAAN PERTAMA
1. Sleep Mode Selama 4 detik dan Wake UP saat terjadi Timer OverFlow.
Pada percobaan kali
ini akan dibuat program untuk mengakses mode sleep pada mikrokontroller . Mode
Sleep akan terjadi selama 4 detik , kemudian mikrokontroller akan aktif kembali
(wake up). Pada saat Wake up , mikrokontroller akan
melakukan perubahan terhadap kondisi led yang terhubung pada pin 12. sehingga
jika program dijalankan , seakan-akan Led akan berkedip-kedip selang waktu 4
detik . Namun sebenarnya selama 4 detik tersebut mikrokontroller sedang dalam
sleep mode ( tidak melakukan apa-apa).
Langsung ke Prosedur :
a. Rangkailah rangkaian dibawah ini menggunakan software Proteus 7.1.0
Gambar
Rangkaian percobaan 1
b. Setelah rangkaian diatas
sudah dibuat di Proteus , kita lanjutakan membuat programnya pada Arduino IDE , kemudian lakukan kompilasi dan uploud.
#include <avr/sleep.h>
#include <avr/power.h>
#define LED_PIN (12)
volatile int f_timer=0;
ISR(TIMER1_OVF_vect){
if(f_timer == 0) {
f_timer =1 ;
}
}
void enterSleep(void)
{
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer2_disable();
power_twi_disable();
sleep_mode();
power_all_enable();
}
void setup()
{
pinMode(LED_PIN, OUTPUT);
TCCR1A = 0x00 ;
TCNT1 = 0x0000;
TCCR1B = 0x05;
TIMSK1= 0x01;
}
void loop ()
{
if (f_timer==1)
{
f_timer = 0;
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
enterSleep();
}
}
#include <avr/power.h>
#define LED_PIN (12)
volatile int f_timer=0;
ISR(TIMER1_OVF_vect){
if(f_timer == 0) {
f_timer =1 ;
}
}
void enterSleep(void)
{
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer2_disable();
power_twi_disable();
sleep_mode();
power_all_enable();
}
void setup()
{
pinMode(LED_PIN, OUTPUT);
TCCR1A = 0x00 ;
TCNT1 = 0x0000;
TCCR1B = 0x05;
TIMSK1= 0x01;
}
void loop ()
{
if (f_timer==1)
{
f_timer = 0;
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
enterSleep();
}
}
Lihat apa yang terjadi dan coba Simpulkan !!!
Kesimpulan dari pratikum ini adalah para mikrokontroller kita dapat mengistirahatkan dalam beberapa detik dan manfaat dari Mode Sleep mode ini adalah kita dapat menghemat daya pada mikrokontroller saat tidah digunakan.
PERCOBAAN KEDUA
2. Sleep Mode Selama 8 Detik dan Wake Up Saat Watchdog Timer Aktif
Pada percobaan kali ini akan dibuat
program untuk mengakses watchdog timer pada mikrokontroller. Watchdog timer
akan digunakan untuk mengaktifkan kembali mikrokontroller dari mode sleep .
Watchdog timer akan terjadi tiap 8 detik.
Langsung ke Prosedur kawan !!!
Rangkaian sama seperti diatas tinggal ganti program !!!
A. Tulis sintaks program di bawah ini , kemudian kompilasi dan uploud ke simulasi proteus
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#define LED_PIN (12)
volatile int f_wdt=1;
ISR(WDT_vect)
{
if (f_wdt == 0 )
{
f_wdt=1;}
else
{
Serial.println("WDT Overrun !!!");
}
}
void enterSleep(void)
{
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
sleep_enable(); sleep_mode();
sleep_disable (); power_all_enable();
}
void setup ()
{
Serial.begin(9600);
Serial.println ("Initialising...");
delay(100);
pinMode(LED_PIN,OUTPUT);
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 1<<WDP0 | 1<<WDP3;
WDTCSR |= _BV(WDIE);
Serial.println("Initialisation complete.");
delay(100);
}
void loop ()
{
if (f_wdt == 1)
{
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
f_wdt=0; enterSleep();
}
}
#include <avr/power.h>
#include <avr/wdt.h>
#define LED_PIN (12)
volatile int f_wdt=1;
ISR(WDT_vect)
{
if (f_wdt == 0 )
{
f_wdt=1;}
else
{
Serial.println("WDT Overrun !!!");
}
}
void enterSleep(void)
{
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
sleep_enable(); sleep_mode();
sleep_disable (); power_all_enable();
}
void setup ()
{
Serial.begin(9600);
Serial.println ("Initialising...");
delay(100);
pinMode(LED_PIN,OUTPUT);
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 1<<WDP0 | 1<<WDP3;
WDTCSR |= _BV(WDIE);
Serial.println("Initialisation complete.");
delay(100);
}
void loop ()
{
if (f_wdt == 1)
{
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
f_wdt=0; enterSleep();
}
}
Kesimpulan ya adalah bahwa fungsi dari WatchDog Timer adalah untuk mengaktifkan atau membangun lagi mikrokontroller yang di Sleep atau di istirahatkan .
Manfaat penggunaan watchdog timer pada mikrokontroller untuk mereset
kembali program ketika terjadi masalah atau program tersebut macet. Jadi ketika
program yang sedang berjalan macet maka kita gunakan watchdog timer untuk
mereset kembali program.
0 comments:
Posting Komentar