Sebelum menjelaskan mengapa pada post EEPROM : Error data saat penyimpanan kok bisa terjadi error saat penyimpanan data padahal coding-nya tidak jauh berbeda dan justru coding yang tepat malah terkesan lebih panjang dibanding coding yang tidak tepat.
Coding Tidak Tepat (kiri) dan Coding yang Tepat (kanan)
Memang pada posting EEPROM : Mengakses EEPROM AVR menggunakan EEPROM sangatlah mudah, sama seperti menentukan variabel biasa yang hanya ditambahkan kata eeprom atau _eeprom di depan variabel tersebut.
Tapi mengakses EEPROM tidaklah semudah seperti membuat variabel untuk EEPROM. Oleh sebab itu perlu diketahui apa itu EEPROM di mikrokontroller AVR.
EEPROM pada AVR
Sumber : en.wikibooks.org
Hampir semua mikrokontroller AVR memiliki EEPROM internal kecuali ATtiny11 dan ATtiny28. EEPROM pada AVR adalah penyimpanan data yang bersifat semi-permanent dan non-volatile yaitu mampu menyimpan data meskipun tidak diberikan power supply.
Alamat memory EEPROM tidak terpetakan (mapped) didalam memori program maupun memori data sehingga meskipun EEPROM AVR adalah internal EEPROM tetapi mengaksesnya seperti mengakses external EEPROM yang menggunakan register IO, register pointer spesial, dan instruksi read/write yang menyebabkan mengakses EEPROM lebih lambat dibanding mengakses internal RAM.
EEPROM AVR dapat ditulis hingga minimal 100.000 kali dan agar batas limit ini dapat dicapai, sebaiknya anda menggunakan skema wear-leveling ketika menulis di internal EEPROM AVR. Ketika mikrokontroller dipabrikasi dan dijual oleh Atmel, kondisi EEPROM telah terhapus dengan nilai semua EEPROM adalah 0xFF (logika 1 semua bukan logika 0).
Beberapa AVR memiliki errata (koreksi) tentang menulis/write di EEPROM pada alamat 0 ketika kondisi daya tertentu (biasanya ketika brownout), sehingga Atmel merkomondasikan untuk tidak menulis EEPROM pada alamat 0. Contohnya : Errata AT90S1200
Penjelasan Error Data
Dari penjelasan EEPROM pada AVR maka jelaslah bahwa menulis di internal EEPROM lebih lambat dibanding menulis data di internal RAM, karena meskipun internal EEPROM tetapi mengaksesnya seperti mengakses eksternal EEPROM.
Pada contoh aplikasi di post : EEPROM : Error data saat penyimpanan, ketika data UART dari komputer dikirim terus-menerus ke mikrokontroller yang kemudian mikrokontroller menyimpan data tersebut langsung ke EEPROM, maka saat mikrokontroller sedang "sibuk menulis" data ke EEPROM ternyata komputer masih terus-menerus memberikan data ke MCU sehingga menghasilkan data error di alamat tertentu pada memori EEPROM AVR.
Hal inilah yang menyebabkan:
- Semakin panjang data yang dikirim dari komputer ke MCU maka semakin besar pula error yang dihasilkan.
- Semakin cepat komunikasi komputer dengan MCU (baudratenya cepat) errornya juga semakin besar.
Solusinya yaitu : Ketika komunikasi / transfer data sedang berlangsung, data yang diterima dari komputer disimpan dulu di internal RAM, dan ketika komunikasi / transfer data selesai barulah data dari internal RAM dipindahkan ke Internal EEPROM.
Oiya coba cari referensi / literatur tentang skema wear-leveling, itu sangat menarik untuk mengetahui teknik penyimpanan data ke EEPROM agar umur EEPROM bisa panjang / bisa mencapai batas maksimum penulisan EEPROM.
Semoga membantu ...^^v...