Kamis, 17 Februari 2011

EEPROM : Penjelasan EEPROM dan Error Data

.
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...

EEPROM : Error data saat penyimpanan

.
Cara menggunakan / mengakses EEPROM sudah saya bahas di post
EEPROM : Mengakses EEPROM AVR.

Yang ingin saya bahas pada post ini adalah beberapa masalah yang biasa terjadi atau bahkan sering anda alami tetapi tidak anda sadari.
Dan lebih berbahayanya adalah anda tidak menyadari masalah ini yang mungkin bikin pusing anda ketika memprogram mikrokontroller / hardware anda.

Masalahnya yang ingin saya bahas yaitu data yang disimpan di EEPROM tidak sesuai dengan data yang kemudian dibaca dari EEPROM tersebut.
Saat anda ingin menulis data di EEPROM misalnya :
"SAYA MENULIS KALIMAT INI DAN TERSIMPAN DI EEPROM."
tetapi ketika mencoba membaca data tersebut untuk ditampilkan di LCD atau dikirim ke komputer, ternyata datanya tidak sesuai atau bahkan kacau balau.

Contoh Kasus
Anda ingin merancang suatu sistem yang pengontrollan berdasarkan waktu atau Time Scheduling Control misalnya seperti ingin mematikan atau menyalakan beberapa lampu di beberapa ruangan yang dikendalikan oleh mikrokontroller.

Transfer data melalui port USB atau port COM.
Sesuai keinginan anda.


Data Bulan, Hari, Tanggal, Jam, dan Menit ditentukan oleh User melalui software komputer yang kemudian software mentransfer data tersebut ke MCU (Microcontroller Unit). Oleh MCU data tersebut disimpan di dalam EEPROM agar dapat disimpan secara (semi) permanen dan data dapat digunakan ketika sistem / perangkat dinyalakan setelah power supplynya Off (dicabut).

Data yang dikirim oleh komputer misalnya protokolnya seperti berikut : #02,16,04,08,00;ON;01,02,03,04,05~
Artinya :
  • # : Karakter awal / Start Byte berfungsi untuk informasi ke MCU bahwa Komputer akan mengirimkan serangkaian data ke MCU.
  • , (koma) : Karakter pemisah antar data.
  • 02,16,04, : Bulan ke 2 (Februari), tanggal 16, hari ke-4 (rabu, minggu hari ke-1)
  • 08,00 : Jam 8 menit ke 00 (tepat jam 8 pagi).
  • ; (titik koma) : Karakter pemisah Perintah
  • ON : Perintah On untuk menyalakan lampu dan OF (2 karakter dan bukan OFF) untuk mematikan lampu.
  • 01,02,03,04,05 : Ruangan yang di On-kan adalah ruang 1, 2, 3, 4, dan 5.
  • ~ : Karakter akhir data / Stop Byte berfungsi untuk informasi ke MCU bahwa data telah selesai di kirimkan.

Coding yang Tidak Tepat dan Coding yang Tepat








Jika anda memprogram seperti coding di atas maka data yang tersimpan di EEPROM kemungkinan ERROR-nya mencapai 40-80 % (Xixixixixi... survey asal-asalan) tergantung panjang data yang ditransfer lalu disimpan di EEPROM. Artinya semakin panjang data yang di transfer terus-menerus ke MCU dan kemudian di simpan di EEPROM maka semakin besar pula kesalahan data-data yang tersimpan di EEPROM. Oleh sebab itu saya sarankan untuk memprogram seperti Coding berikut :




Penjelasannya di Post :
EEPROM : Penjelasan EEPROM dan Error Data

Panjaaaang nih..
Semoga membantu ...^^v...

Rabu, 02 Februari 2011

ATmega128 / 1280 : Multi USART / UART

.
Anda mungkin pernah mengakses ATmega128 yang memiliki 2 USART (Universal Synchronous Asynchronous serial Receiver and Transmitter) atau bahkan 4 USART seperti yang dimiliki ATmega1280.

Bagaimana cara mengakses setiap USART tersebut dan bagaimana menentukan proses pengiriman data / karakter pada setiap USART tersebut ?
Jika belum pernah mencoba multi USART maka anda tidak akan tahu masalah-masalahnya dan kesulitan yang akan dihadapi.
Jadi klo ada waktu dan dana sebaiknya dicoba deh..
Bermanfaat kok n ga bakal rugi...
Aplikasinya pasti luaaaaassss banget..

Perbedaan USART dan UART ?
Baca topik : Komunikasi Data.
Beberapa rekan-rekan masih menanyakan apa itu USART dan apa bedanya dengan UART ?
Klo saya misalkan seperti bertanya apa perbedaan sepeda biasa dengan sepeda bermotor listrik seperti pada gambar.






Sepeda bermotor listrik adalah sepeda biasa yg memiliki motor listrik, artinya bisa digunakan seperti sepeda biasa atau menggunakan motor listriknya sesuai keinginan.
Sumber gambar : Sepeda Listrik dan Sepeda Onthel

Dari kepanjangannya saja sudah menjelaskan perbedaannya,
UART : Universal Asynchronous serial Receiver and Transmitter
USART : Universal Synchronous Asynchronous serial Receiver and Transmitter

Mikrokontroller yang memiliki fitur UART berarti hanya tersedia fungsi untuk komunikasi serial asinkron sedangkan untuk komunikasi lainnya anda harus membuat program sendiri.

Sedangkan USART selain tersedia fitur / fungsi komunikasi serial asinkron (UART) juga bisa digunakan serial sinkron (USRT) dan PIN / PORT yang digunakan adalah sama.
Oiya USART pada mikrokontroller AVR semuanya adalah FullDuplex.

Langkah Coding pada CVAVR
Saya akan membahas untuk mikrokontroller ATmega1280 karena sudah saya coba dan cukup mewakili untuk multi USART mikro AVR lainnya.
Langkah-langkah :





  • Jalankan CoViAVR, buat Project baru, dan gunakan CodeWizzard. Pilih chip : ATmega1280, clock 11.0592 MHz.
  • Secara otomatis akan tampil tab USART0, USART1, USART2, dan USART3, lakukan pengaturan sesuai keinginan dan kebutuhan anda.
  • Pada gambar di atas, baudratenya saya buat berbeda-beda silahkan anda pilih baudrate-nya sama semua (agar mudah pengujiannya) yaitu Protokol : Baudrate :9600,8N1.
  • Jika telah selesai kemudian File-Generate, Save and Exit.
  • Secara otomatis akan muncul beberapa fungsi antara lain : getchar1(void), getchar2(void), getchar3(void), putchar1(void), putchar2(void), dan putchar3(void).
  • Buat fungsi untuk mengirim "kata" / "kalimat" yaitu putsf1(), putsf2(), dan putsf3().
Klik gambar untuk melihatnya.
Ketika anda meng-Compile-nya akan muncul 3 buah pesan Warning untuk fungsi putsf1, putsf2, dan putsf3 yang bisa diabaikan.

Wahh... ternyata tidak jelas gambarnya... Mungkin kebesaaran kali ya. Saya pecah jadi 4 gambar deh..














Penjelasan Singkat

Coding tersebut akan mengirim kata "test USART0" atau "test USART1" atau "test USART2" atau "test USART3" setiap 500 mS untuk semua USART atau setiap 2000 mS untuk salah satu USART.

Saya memberikan nilai Baudrate yang berbeda-beda untuk setiap USART sehingga ketika dicoba menggunakan Hyperterminal atau program terminal yang tersedia pada CoViAVR jangan lupa untuk mengubah baudratenya sesuai dengan PORT USART yang dihubungkan.
Hal ini untuk menunjukkan bahwa mikrokontroller AVR yang memiliki banyak USART mampu untuk transfer data dengan protokol yang berbeda-beda untuk setiap port USART-nya karena secara internal, setiap USART memiliki register dan rangkaian tersendiri yang independen.
Selain itu setiap USART juga mampu untuk mengirim data (hampir) secara bersamaan.

CMIWW.. aj deh...
Semoga membantu ...^^v...

Topik yang Populer