RTC DS3231

[ [ images, codes & links ] ]
[su_panel border=”3px solid #99BB3D” radius=”10″]

Keterangan mengenai RTC (Real-Time Clock) sudah pernah disampaikan melalui kutipan di post terdahulu. Di halaman itu yang dibahas adalah komponen RTC DS1307, yang lazim diperdagangkan dalam bentuk papan yang ditandai sebagai Tiny RTC. Kali ini saya coba rangkumkan mengenai DS3231 dari berbagai sumber sebagai awalan untuk memperlajarinya. RTC ini dilaporkan memiliki akurasi yang lebih baik dari RTC DS1307.

Gambar 1.

 

With a backup button cell (e.g. CR2032) on the underside of the module, these DS1307 modules will keep time even when disconnected from the main power source for months and even years on end. However, in our experimental projects (using this RTC with an Arduino for dataloggers amongst other things), we have found these DS1307 modules to vary hugely in their time-keeping accuracy – some gaining/losing a few seconds per day, and others gaining/losing as much as 3-5 minutes per day. While they have proved to be very consistent – i.e. a unit which gains 3 minutes per day will gain 3 minutes per day every day – having to test each unit individually over a few days and then modifying the Arduino project code to cancel out errors is not practical.

Some of the error is caused by ambient temperature changes affecting the accuracy of the timing of the crystal resonator. Some more of the error is also caused by the quality of the crystal itself and its attachment to the PCB in these economical modules.

In extensive testing we have found the time-keeping of these modules to be excellent. The DS3231 chip on the module is marketed as being accurate to 2ppm (parts per million), which means less than one second lost or gained every 5 to 6 days. The units we have tested thus far have all come in at under 1ppm accuracy, so a couple of seconds at most lost or gained per month.

This accuracy is achieved in part by the incorporation of a temperature sensor in the DS3231 which can compensate for changes in ambient temperature. The measurements from this temperature sensor are also accessible to the user (accurate to +/- 3 Celcius) which makes for a handy extra feature. These DS3231 modules also have 32kb of available EEPROM memory which can be utilised by your projects, and many other useful features.

~reuk.co.uk

 

sumber: Benchmarks: Real Time Clocks – Results for Raspberry Pi/Arduino – DS3231 / PCF8563 / MCP79400 / DS1307

 

Gambar 2. [randomnerdtutorials.com]

 

[/su_panel] [su_panel border=”3px solid #30C0F0″ radius=”10″]

Terdapat beberapa pustaka/library untuk tiap RTC. Dua yang disampaikan dalam “mashup ini adalah pustaka dari Adafruit dan pustaka dari Makuna.

[/su_panel] [su_panel border=”3px solid #FF6666″ radius=”10″]

Contoh-contoh kode program sistem Arduino untuk RTC DS3231.

[/su_panel] [su_panel border=”3px solid #288AC7″ radius=”10″]

Sistem ini dirancang untuk bekerja dengan menggunakan baterai “khusus”, yaitu baterai yang bisa diisi ulang (rechargeable) seperti LIR2032. Di papan sudah disediakan sistem pengisian ulang untuk baterai tersebut. Karena itu jika kita mempergunakan baterai tipe yang tidak bisa diisi ulang (non-rechargeable) seperti CR2032 maka ada perubahan yang perlu dilakukan. Hal ini untuk mencegah agar baterai primer yang tidak bisa diisi ulang itu tidak berusaha diisi oleh sistem. Caranya adalah dengan melepas/membuang diode seperti pada Gambar 3 berikut.

ds.jpgGambar 3. [sumber: tronixlabs.com]

 

[/su_panel] [su_panel border=”3px solid #00C700″ radius=”10″] [intense_tabs direction=”right” active_tab_background_color=”#000000″ active_tab_font_color=”#ffff00″ trigger=”click”] [intense_tab title=”Video01″ border=”3px solid #e8e8e8″ link_target=”_self” content_background_color=”#000000″ content_font_color=”#ffffff” icon_size=”1″ icon_position=”left”]

[/intense_tab] [intense_tab title=”Video02″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video03″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video04″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video05″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [/intense_tabs] [/su_panel] [su_panel border=”3px solid #990066″ radius=”10″] [/su_panel]

 

Save

DT COMBO AVR 51

Pada post sebelumnya, saya sudah membuat catatan mengenai sistem papan DST-51. Sedang pada post ini saya membuat catatan mengenai DT-COMBO AVR-51. Papan ini juga merupakan papan lama yang saya miliki saat belajar beralih dari arsitektur MCS-51 (seperti AT89C52/AT89S52) ke arsitektur Atmel AVR. Sebelum papan Arduino banyak tersedia dengan harga yang relatif terjangkau seperti sekarang ini, papan yang disebut minimum sistem adalah papan mikrokontroler yang tersedia untuk belajar. Peningkatan dari minimum sistem dengan beberapa pelengkap seperti DT-COMBO AVR-51, lebih memudahkan bagi mereka yang belajar.

Catatan ini saya buat karena sistem ini sudah semakin tua, dikhawatirkan manual akan semakin sulit ditemukan. Selain itu ada hack kecil hasil tinkering yang semakin memudahkan penggunaan sistem ini.

http://www.innovativeelectronics.com/innovative_electronics/images/DT-COMBO/DT-COMBO%20AVR-51.gifGambar 1. Penampakan asli [sumber]

Salah satu keunggulan papan seperti ini untuk belajar adalah sudah tersedianya komponen-komponen tambahan yang memudahkan proses belajar. Bahkan di tahap lanjutan juga akan mempermudah proses prototyping. Misalnya adalah keberadaan push-button dan LED, seperti yang terlihat di Gambar 1.

Gambar 2.

Papan DT-COMBO milik saya terlihat di Gambar 2. Ada dua hal yang saya kombinasikan di sistem itu, yang pertama adalah soket ZIF seperti yang juga terlihat di Gambar 3. Soket ini memudahkan proses untuk mengganti-ganti IC yang dipakai pada papan sistem, juga mengurangi kemungkinan (kaki) IC rusak pada saat bongkar-pasang di papan.

Gambar 3.

Gambar 4.

Pada Gambar 2, dan lebih jelas lagi pada Gambar 4, terlihat bahwa saya mempergunakan USBasp untuk melakukan pemrograman di papan sistem DT-COMBO (menggunakan header yang tersedia). USBasp bisa dibuat sendiri karena rancangannya telah sengaja disebarluaskan di Internet.

Gambar-gambar berikut saya kutip dari manual yang juga saya cantumkan link-nya di bagian bawah post ini.

Gambar 5. Port

Gambar 6.

 

Gambar 7.

Gambar 8.

 

Manual dan file-file untuk DT-COMBO AVR-51:

 

 

 

 

 

Mengisi ulang bootloader papan Arduino Uno

Sebelum memulai, pertanyaan yang mungkin timbul adalah mengapat kita perlu mengisi ulang/membakar (burn) bootloader untuk Arduino Uno? Sebelumnya apakah bootloader itu sendiri? Mari mulai dari istilah firmware, secara singkat firmware adalah program yang paling awal diisikan ke sebuah mikrokontroler, program ini bersifat permen (atau tepatnya semi-permanen). Sekali diisikan, program ini tidak mudah untuk diubah seperti program lain. Menurut sumber di Arduino.cc ini, “So named because you couldn’t change it once it had been programmed in the chip.”

Lebih lengkap lagi bisa dipelajari dari sumber ini:

Lalu bagaimanakah bootloader menurut Arduino sendiri ? Jawabannya bisa dibaca di sini:

What’s a bootloader?

Microcontrollers are usually programmed through a programmer unless you have a piece of firmware in your microcontroller that allows installing new firmware without the need of an external programmer. This is called a bootloader.

Not using a bootloader

If you want to use the full program space (flash) of the chip or avoid the bootloader delay, you can burn your sketches using an external programmer.

Secara sederhana bootloader Arduino memudahkan pengguna (programmer) untuk memprogram mikrokontroler di papan sistem. Pengguna tidak perlu hardware programmer lainnya, cukup menggunakan kabel USB (dahulu kabel serial) ke papan sistem Arduino. Kecuali pengguna memilih untuk memprogram tanpa bantuan bootloader.

Kembali ke pertanyaan awal, mengapa perlu mengisi ulang bootloader ? Sekenario yang bisa terjadi adalah karena adanya kerusakan pada bootloader, meskipun kemungkinannya kecil. Kemungkinan lain adalah karena mikrokontroler asli pada papan Arduino mengalami kerusakan. Jika mikrokontroler yang dipergunakan adalah versi DIP. Salah satu penjual di salah satu toko online menjual μC ATmega328P dengan harga kurang dari dua puluh ribu rupiah (di luar ongkos kirim). Bisa juga karena ingin menggunakan μC ATmega328P yang berisi bootloader Arduino di tempat lain, misalnya seperti yang ditulis di link ini dan link ini. Lalu kemungkinan ketiga adalah karena ingin/perlu mengganti bootloader dengan versi lain.

  Bootloader (firmware) untuk Arduino:    <<klik di sini untuk membuka>>
Sekarang dengan menggunakan AVRDUDE dan AVRDUDESS kita melihat kondisi awal (kosong) dari mikrokontroler ATmega328P.

Gambar 1.

Bandingkan dengan kondisi default sebagaimana yang bisa dilihat di sini:

Gambar 2.

Gambar 3.

Pada Gambar 3, untuk mengisi bootloader pilih board yang sesuai dengan papan yang hendak diisi lalu pilih item menu Burn Bootloader. Gambar 4 menunjukkan proses pengisian berlangsung lancar.

Gambar 4.

Gambar 5.

Dapat dilihat di Gambar 5 kondisi fuse bits & lock bits setelah Arduino Nano diisi dengan bootloader, bandingkan dengan kondisi yang terlihat pada Gambar 1.

Gambar 6.

Makna dari konfigurasi bits dapat dilihat pada Gambar 6. Konfigurasi seperti ini dapat dengan lebih mudah diatur dengan bantuan fasilitas yang tersedia secara online, misalnya fusecalc atau Engbedded Atmel AVR® Fuse Calculator. Meskipun fasilitas bantuan seperti ini tidak selalu dapat sepenuhnya menggantikan keperluan untuk membaca datasheet. Bahkan sering kali kita juga perlu belajar dari pemahaman dan pengalaman orang lain yang telah mencoba terlebih dahulu, jadi bukan hanya belajar kepada pegawai dari produsen saja. Sebagai contoh, untuk memahami tentang CKSEL pada Gambar 6, kita bisa membaca di halaman ini. Dalam kutipan berikut bisa diketahui konfigurasi seperti pada Gambar 6, CKSEL=1111 diartikan bahwa frekuensi dapat dipilih berdasarkan nilai crystal antara 8 MHz sampai 16 MHz.

Gambar 7. Uji coba bootloader yang baru diisikan pada Arduino Uno

Sekadar sebagai pembanding cara-cara untuk mengisi bootloader Arduino bisa dibaca di sini: Installing an Arduino Bootloader.

Berikutnya adalah percobaan untuk menggunaakan bootloader Optiboot. Saya akan mencobanya di Arduino Nano dengan ATmega328P 5 V.

Gambar 8. Kondisi awal Arduino Nano ATmega328P

Gambar 9. Lock bits berubah setelah penghapusan isi

Gambar 10. Pengaturan konfigurasi untuk pengisian bootloader

Gambar 11.

Pada Gambar 11, terlihat adanya pesan kesalahan (failed). Meskipun begitu sebenarnya proses pengisian bootloader optiboot telah berhasil. Pesan kesalahan terjadi karena pengaturan efuse (extended fuse) yang sesungghuhnya tidak benar-benar mengakibatkan kesalahan. Solusi dari permasalahan ini adalah pengaturan konfigurasi di boards.txt:

## Optiboot for ATmega328p
## ---------------------------------------------
optiboot32.menu.cpu.atmega328p=ATmega328p
optiboot32.menu.cpu.atmega328p.upload.maximum_size=32256
optiboot32.menu.cpu.atmega328p.upload.maximum_data_size=2048

optiboot32.menu.cpu.atmega328p.bootloader.high_fuses=0xDE
optiboot32.menu.cpu.atmega328p.bootloader.extended_fuses=0xFD
optiboot32.menu.cpu.atmega328p.bootloader.file=optiboot/optiboot_atmega328.hex

optiboot32.menu.cpu.atmega328p.build.mcu=atmega328p

Untuk mempelajari lebih lanjut tentang masalah ini silakan baca: <<klik di sini untuk membuka>>

Gambar 12. Pengisian bootloader dengan USBasp, AVRDUDE dan AVRDUDESS

Gambar 13.

Gambar 13 menunjukkan proses bootloader burning setelah perbaikan boards.txt, tidak ada pesan kesalahan sama sekali; bandingkan dengan Gambar 11.

Gambar 14. Pengisian program menggunakan bootloader Arduino otiboot melalui ttyUSB0

Gambar 15. Upload program Arduino melalui USB port (ttyUSB0)