Pada postingan ini saya akan menjelaskan cara mengakses internal EEPROM AVR, yang berupa intruksi read dan write EEPROM, serta akan saya berikan sebuah contoh aplikasi untuk merealisasikannya dalam sebuah program.
Beberapa mikrokontroler AVR telah memiliki EEPROM (Electrically Erasable Programmable Read Only Memory) internal sebagai tempat penyimpanan data semi-permanen. Jadi seperti halnya flash memory, EEPROM tetap dapat menyimpan data meskipun catu daya dimatikan, dengan kata lain data tidak akan hilang walaupun catu daya dimatikan. EEPROM internal ini tidak dipetakan bersama dengan register utama, register I/O dan SRAM. EEPROM hanya dapat diakses melalui register spesial dan operasi read/write sehingga waktu aksesnya lebih lamban dari pada mengakses register ataupun SRAM.
Mikrokontroler ATmega8535 memiliki alamat memory EEPROM internal sebesar 512 bit dengan lebar data memory 8 bit. Sehingga mampu menampung data sebesar 512 byte. Untuk melakukan intruksi write/read ke memory EEPROM dilakukan melalui beberapa register yaitu register EEARH, EEARL, EEDR dan EECR. Untuk masing-masing fungsi dan penjelasan register tersebut dapat dibaca datasheet ATmega8535, silakan download datasheet ATmega8535 disini.
Inilah salah satu kelebihan bahasa pemrograman high level dalam hal ini bahasa C dengan compiler CodeVision AVR, dimana teman-teman tidak dituntut harus tahu mengenai register-register tersebut untuk dapat melakukan akses write/read EEPROM. Dikarenakan compiler CodeVision sudah menyediakan sebuah intruksi untuk dapat mengakses EEPROM internal AVR.
Sebenarnya saya sudah banyak membaca beberapa buku tentang cara mengakses EEPROM internal AVR, tetapi penjelasan tersebut terlalu sulit saya tangkap, jadi disini saya akan menjelaskan dengan bahasa saya sendiri, sehingga mungkin akan lebih mudah teman-teman mengerti.
Untuk dapat melakukan operasi write/read EEPROM internal, sebelumnya kita harus mendeklarasikan sebuah variabel yang digunakan untuk menunjuk pointer EEPROM. Cara penulisannya adalah sebagai berikut:
[type data] eeprom *[variabel];
Jika saya menggunakn tipe data integer dan variabelnya saya beri nama pointer_eeprom maka akan menjadi:
int eeprom *pointer_eeprom;
Jika teman-teman sudah mendeklarasikan seperti diatas, maka secara otomatis CodeVision AVR akan menghasilkan sebuah variabel lagi yang bernama pointer_eeprom (tanpa tanda bintang diawalnya). Mengapa harus menghasilkan variabel ini? Variabel ini, yaitu pointer_eeprom (tanpa tanda bintang diawalnya) nantinya digunakan untuk menunjuk alamat EEPROM internal yang akan kita tulis/baca (write/read).
Baiklah, jika saya ingin menuliskan (write) variabel data (bernilai 10) ke alamat 0 di memory EEPROM internal maka:
data=10; → data yang akan ditulis
pointer_eeprom=0; //alamat EEPROM yang akan ditulis
*pointer_eeprom=data; // instruksi penulisan ke EEPROM
pointer_eeprom=0; //alamat EEPROM yang akan ditulis
*pointer_eeprom=data; // instruksi penulisan ke EEPROM
Sekarang bagaimana jika ingin membaca (read) data pada alamat 0 di memory EEPROM. Caranya adalah sebagai berikut.
pointer_eeprom=0; // alamat EEPROM yang akan dibaca
data=*pointer_eeprom; // instruksi pembacaan dari EEPROM
data=*pointer_eeprom; // instruksi pembacaan dari EEPROM
Pasti teman-teman sekarang sudah mengerti, mudah bukan?
Untuk lebih mengerti lagi disini saya ingin membuat sebuah aplikasi dimana terdapat 5 buah pushbutton, jika saya tekan tombol 1 maka akan menyimpan data=0 ke EEPROM, jika saya tekan tombol 2 maka akan menyimpan data=1 ke EEPROM dan seterusnya. Kemudian ditampilkan ke LCD, jika catu daya saya matikan maka data hasil penekanan tersebut tidak akan hilang.
Berikut adalah schematik dan listing program lengkap:
#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <lcd.h>
#include <delay.h>
#include <stdlib.h>
#include <lcd.h>
int data;
char temp[8];
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
void tulis_data_ke_eeprom()
{
*pointer_eeprom=data;
}
void baca_data_ke_eeprom()
{
data=*pointer_eeprom;
}
void tampil_lcd()
{
lcd_gotoxy(0,0);
lcd_putsf(“ElectrO-cOntrOl”);
itoa(data,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
}
void main(void)
{
PORTD=0x1f;//memberikan logika high pada push button jika tidak ditekan
DDRD=0×00;//PD dikonfigurasikan sebagai input
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;
// LCD module initialization
lcd_init(16);
pointer_eeprom=0;//alamat eeprom yg akan ditulis/dibaca
baca_data_ke_eeprom();//memanggil fungsi baca eeprom
while (1)
{
if (PIND.0==0)//jika ditekan maka akan menulis data=0 ke EEPROM
{
data=0;
lcd_clear();
delay_ms(300);
tulis_data_ke_eeprom();
}
if (PIND.1==0)//jika ditekan maka akan menulis data=1 ke EEPROM
{
data=1;
delay_ms(300);
lcd_clear();
tulis_data_ke_eeprom();
}
if (PIND.2==0)//jika ditekan maka akan menulis data=2 ke EEPROM
{
data=2;
delay_ms(300);
lcd_clear();
tulis_data_ke_eeprom();
}
if (PIND.3==0)//jika ditekan maka akan menulis data=3 ke EEPROM
{
data=3;
delay_ms(300);
lcd_clear();
tulis_data_ke_eeprom();
}
if (PIND.4==0)//jika ditekan maka akan menulis data=4 ke EEPROM
{
data=4;
delay_ms(300);
lcd_clear();
tulis_data_ke_eeprom();
}
tampil_lcd();//menampilkan data ke LCD
};
}
Catatan: setelah program diatas didownload kemikrokontroler maka akan menampilkan nilai -1. Inilah nilai default dari isi memory EEPROM. Matikan catu daya mikrokontroler, kemudian nyalakan kembali, maka akan menampilkan nilai sesuai data penekanan tombol yang terakhir.
mas,saya sudah mencoba program di atas tetapi pada simulasi proteus hanya muncul angka4 jika button lain di tekan hanya ada efek mati kemudian hidup lagi,itu knapa??
BalasHapusmaaf mas masalahnya udah ktemu,ternyata nilai PORTD yang tadinya 0X0F,saya rubah menjadi 0xff baru angka dapat berubah,terima kasih programnya sangat membantu
BalasHapusok terima kasih, ternyata ada kesalahan sedikit seharusnya nilainya 0x1f karena saya menggunakan 5 buah push button (kirain 4 buah, makanya nilainya 0x0f)... sekarang telah saya perbaiki...
BalasHapusmas klo saya pngn bkin aplikasi pemungutan suara pemilu pke eeprom internal bisa ga ya?
BalasHapusbisa saja, asalakan lebar data yg disimpan ke memori eeprom 8 bit dan mempunyai maksimal alamat 512
BalasHapusmaaf, tolong jangan membahas program pada kolom komentar.. lebih baik melalui email
BalasHapusprogram anda tidak akan dapat menyimpan hasil konter karena anda mengetikkan program tulis eeprom diluar instruksi while (1)
coba deh instruksi tulis_data_ke_eeprom(); anda tulis dibawah listing lcd_clear();
oh bisa y mas.saya kan ingin buat itu utk TA saya mas.jadi switch 1 smpai 3 mas untuk memasukan suara pemilu.nah untuk switch 4 untuk menampilkan suara pemilu yg udh masuk ke LCD mas?mhon bntuan y mas....
BalasHapusjika ingin berdiskusi silakan melalui email...
BalasHapuskontrol.elektro@gmail.com
mas,kalau saya mau menyimpan data yg lebih dari 8 bit bagaimana caranya? misal saya mau mnyimpan angka dengan nilai 1000 ke dalam eeprom.
BalasHapusintinya anda harus menyimpannya sebanyak max 8 bit. kalo algoritma saya sih seperti ini untuk memanipulasi programnya.
BalasHapusmisal datanya 1000
data tersebut saya bagi dengan 255 maka hasilnya 3, dan mempunyai sisa 235.
hasil pembagian yg bernilai 3 saya simpan pd alamat 0 eeprom, dan sisa pe,bagian saya simpan pd alamat 1 eeprom.
untuk proses pembacaan data tersebut adalah saya baca alamat 0 eeprom dan alamat 1 eeprom.
kemudian tinggal masukan ke rumus:
data=isi alamat 0 eeprom*255 kemudian ditambah isi alamat 1 eeprom
atau
data= (isi alamat 0*255)+isi alamat 1
Mungkin anda punya algoritma yg lebih bagus lagi... silakan share disini...
semoga bermanfaat...
terima kasih mas.mau tanya lagi nih,arti "char temp[8]dan itoa (data,temp)" fungsinya untuk apa ?
BalasHapusn angka yg ada didalam "char temp" itu menendakan apa?
itoa=integer to array, fungsinya mengubah tipe data integer ke array
BalasHapusitoa (data,temp) artinya variabel data dengan tipe data integer diubah ke array yg disimpan ke variabel temp, dikarenakan array maka harus dideklarasikan panjang array tersebut yaitu 8 sehingga temp[8].
angka 8 tsb bisa anda ganti dngn 15, karena kolom LCD jumlahnya 15 jika dimulai dari 0.
sebenarnya cara menampilkan ke lcd bisa menggunakan instruksi sprint, tp saya terbiasa menggunakan cara tersebut...
mas..klo mengakses eeprom pake keypad matriks 3x4 caranya gmn ya?thanx
BalasHapusmakasih byk infonya. kebetulan lagi nyari materi ttg eeprom. skg udh bisa akses eeprom di avr.
BalasHapussalam..
ok semoga bermanfaat
BalasHapusmas mau tanya gmana ya klo ngalamati eeprom pakek alamat yang lainyya gmana,,,sya kok binggung ya..
BalasHapusatau penyimpananan data pada alamat eeprom yang berbeda-beda atau lebih dari satu...
mohon bantuannya, maklum masih beginner masih butuh bimbingan banyak mengenai eeprom ini..
Mas...kalau ingin menggunakan lebih dari satu alamat gimana caranya??kok saya coba ganti nilai pointer_eeprom nya dengan selain 0 selalu programnya error seperti ini --> a value of type 'char' can't be assigned to an entity of tipe 'eeprom int*'
BalasHapuskira-kira yang salah dimananya ya mas??mohon bantuannya
Kalau ingin menggunakan beberapa alamat gimana?kok saya coba ganti alamatnya selalu error
BalasHapushehe kunjungi juga http://goes-open.blogspot.com/2012/02/akses-eeprom-internal-atmega32-dengan.html
BalasHapusaku ada problem ni mas,,, tolong dipecahin yah mas,, sebelumyna terima kasih...
BalasHapusaku mau buat tugas ni mas, mendeteksi orang di pintu pake "satu laser<-->ldr",
"satu laser<-->ldr" ini nanti akan mendeteksi keberadaan orang di depan pintu,,
begini ceritanya mas...
pas ada 2 orang yag lewat pintu dhitung sama si ldr trus disimpan hasilnya,
kemudian ada 3 orang lagi yang lewat pada ldr yang sama dan hasilnya disimpan juga,,
kemudian kedua hasil itu dibandingkan,jumlah orang yang lebih banyak akan lebih ditumakan untuk membuka pintu terlebih dahulu
aku bingungnya pas nyimpan hasilnya itu mas dan membandingkan jumlah orangnya.,,
gimana ya mas??
tolong dibalas ya mas ke mail aku "sogiaras@yahoo.com"
thanks mas...
mas,,,itu kan untuk menulis ke eeprom dan membacanya,trus kalau mau menghapusnya bagaimana?
BalasHapusterima kasih...
mas itu kan cuma untuk baca n tulis aja,,,trus kalau hapusx gmna?
BalasHapus