Selamat Tahun Baru 2014 kepada pembaca setia aisi555 dot com. Semoga ditahun yang baru ini berbagi ilmunya semakin bermanfaat bagi kita semua. Doakan saya juga agar sehat dan terus berkreasi serta membagi ilmu kepada kalian semua.
Tahun baru ini dimulai dengan berbagi trick mengatasi masalah hilangnya catuan pada microcontroller. Kita tidak akan membahas fasilitas sleep mode dan low power mode lainnya karena ada alasan yg menyebabkan hal ini tidak diperlukan pada level mikrokontroler sederhana. Yang kita akan bahas adalah jawaban dari pertanyaan yang beberapa hari yang lalu disampaikan oleh pembaca.
- Bagaimana membuat jam digital tetap jalan saat lampu mati sehingga saat nyala kembali jam tidak kacau ?
- Bagaimana melanjutkan hasil counter di alat saya pada saat catuan menyala lagi ?
Pembahasan kali ini menggunakan metode battery backup dan yang lainnya menggunakan memory EEPROM yg sudah dimiliki mikrokontroler untuk menyimpan data sebelum catuan hilang. Untuk itu sebelum melanjutkan agar terlebih dahulu membaca pembahasan mengenai eeprom disini.
Bagaimanakah logika dari rangkaian diatas ? Prinsip yang digunakan adalah prinsip arus searah dari dioda.
VCC atau sumber tegangan dari microcontroller yang masih ditoleransi adalah minimal 2.5 volt (kecuali pengukuran ADC). Saat supply utama masih memberikan tegangan maka gambar dibawah ini mewakili kondisinya.
Jika tegangan baterai yang diberikan bernilai kurang dari VCC + 0.5 volt (forward voltage) dari tegangan dikiri katode maka arus tidak akan mengalir ke arah VCC. Dalam contoh digunakan 3 buah baterai 1.5 volt yg ekivalen kurang dari 4.5 volt. Apa yang terjadi ketika sumber utama tidak ada ? Berikut ini gambarannya.
Dengan tidak adanya sumber di kiri katoda maka VCC akan benilai tegangan baterai dikurangi 0.5 volt yang merupakan forward voltage dari dioda. Trick yg mungkin menghemat penggunaan baterai saat catuan utama mati adalah dengan mematikan fungsi yg memakan energi besar. Ini menjawab pertanyaan no 1 yang intinya adalah untuk menjaga fungsi waktu tidak kacau sehingga tidak diperlukan tampilan ke display 7 segmen. Caranya adalah dengan menggunakan supply yg terpisah ke catuan display 7 segmen dan catuan ini bersumber ke adaptor/trafo yg akan mati ketika PLN mati. Cara lainnya adalah dengan menggunakan deteksi tegangan menggunakan transistor.
Script deteksinya mudah saja
if(bit_is_clear(PIND, PIND2) ) // jika catuan normal
{
yang_boros_nyala();
}
else // jika catuan mati dan baterai aktif
{
yang_boros_mati();
}
Trick seperti gambar diatas dapat juga digunakan untuk menjawab pertanyaan kedua. Ini alasannya mengapa deteksinya dipasang di PIN D2 yang juga merupakan pin untuk INT 0. Marilah kita ingat pembahasan interrupt disini. Jadi saat power supply mati maka deteksi dari low ke high akan kita gunakan untuk proses penyimpanan data counter sebelum sumber benar-benar hilang. Bagaimana ceritanya menjalankan mikrokontroller padahan tegangan sumber tidak ada ? Jawabannya cukup simpel dengan menggunakan kapasitor pada VCC untuk menyimpan tegangan 5 volt beberapa saat.
Bagaimana dengan scriptnya ? Kita inisialisasi dulu Interuptnya , kali ini menggunakan ATMega 8535
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h> // INI JANGAN LUPA !!
#include <avr/eeprom.h>
#include <util/delay.h>
uint8_t EEMEM eecounter;
uint8_t counter;
void init_interupt(void)
{
// interrupt aktif ketika perubahan Low ke High (0--> 1)
MCUCR |= (1<<ISC01)|(1<<ISC00) ;
// aktifkan INT 0
GICR |= (1<<INT0);
sei();
}
Dan ketika saat power PLN mati dan kemudian basis transistor tidak mendapatkan tegangan maka transistor akan ada pada kondidi cut off sehingga pada pin INT 0 terjadi perubahan dari LOW (0) ke HIGH (5volt) dan berdasarkan inisialisasi telah ditentukan trigger interrupt pada kondisi "rising edge" . Pada kondisi ini hasil dari counter disimpan ke EEPROM.
ISR(SIG_INTERRUPT0)
{
eeprom_write_byte(&eecounter,counter);
}
Dan ketika listrik menyala kembali yang pertama dilakukan adalah membaca isi eeprom dari counter
int main(void)
{
counter= eeprom_read_byte(&eecounter); //baca eeprom
init_interupt(); //inisialisasi interrupt
while(1)
{
// contoh program penambahan counter
// sesuaikan dengan keperluan
counter++;
_delay_ms(2000);
}
return(0);
}
SELAMAT MENCOBA
mau nanya, mas, skema baterai emang sengaja begitu ya... kalo ndak salah yg panjang yg positif kan ya, tapi disambung ke GND?
BalasHapussengaja saya balik (di skematik) biar ada yg kritis .....salut bro anda menemukan errornya
BalasHapus