Teknik Elektro LinksBarrier-Gate & Turnstile Interface, Thermostat, Relay Driver, Microcontroler Board

FORTHUNER46 – Minimum System ATmega8 Dengan Sistem Operasi Forth (Avise)

FORTHUNER46 adalah board sistem minimum mikrokontroler AVR ATmega8 yang telah ditanami sistem operasi Avise (Forth). Avise adalah AVR Virtual Stack Engine, yakni implementasi Forth untuk AVR ATmega yang dibuat oleh sebuah perusahaan asal Jerman.

Dengan board ini, kita bisa mengeksplorasi mikrokontroler secara interaktif tanpa perlu menggunakan alat tambahan seperti programmer (USBASP, AVRISPMKII). Bahkan, kita juga tidak memerlukan IDE dan Compiler semacam AVR-GCC, CVAVR dan BASCOM.

Spesifikasi Hardware FORTHUNER46

  • Mikrokontroler ATmega8A – DIP
  • Running menggunakan clock internal 8MHz
  • Interface Serial RS232 DB9/Female
  • Baudrate komunikasi serial 19200
  • LED Indicator pada pin PB5 (pin13 kalau pada board Arduino)
  • Buzzer pada pin PD2 dengan jumper
  • Dual port untuk power supply, yakni socket bulat dan terminal screw
  • Jumper pin RX dan TX. Jika jumper terhubung, pin RX/TX mikrokontroler terhubung ke konverter RS232/TTL ke port DB9. Jika ingin menggunakan modul USB/TTL bisa ditancapkan melalui pin RX/TX dengan melepas jumper terlebih dahulu.
  • Mengekspose seluruh pin GPIO ATmega8 dengan konektor berupa single male-header

Mengapa Avise (Forth)?

Dengan Avise (Forth), kita tidak lagi memerlukan programmer seperti USBASP atau AVISPMKII untuk mengupload file program ke memori mikrokontroler. Bahkan, kita tidak lagi memerlukan IDE dan Compiler semacam AVR-GCC dan CVAVR. Cukup dengan program terminal serial, kita dapat secara interaktif mengeksplorasi AVR ATmega8, menguji rutin-rutin program, dan membuat program secara keseluruhan sampai jadi.

Kok bisa?

Bisa. Pertama, karena Forth dilengkapi dengan fitur REPL (Read Evaluate Print Loop) yang dapat menerima perintah dari user, mengevaluasi perintah tersebut dan menampilkan hasilnya. Hasilnya bisa berupa hasil evaluasi dari perintah yang benar atau error (jika perintah salah).

Kedua, karena Forth dilengkapi dengan kompiler. Setiap perintah yang diterima akan langsung diterjemahkan ke dalam bentuk bahasa mesin. Forth menerapkan teknik subroutine threaded code dimana kode program diterjemahkan dalam bentuk pemanggilan terhadap subrutin-subrutin yang sudah disediakan.

Forth mengenal istilah fungsi primitif, yakni fungsi-fungsi bawaan yang berhubungan dengan CPU. Fungsi primitif dibuat menggunakan bahasa Assembly. Dari fungsi primitif inilah fungsi-fungsi baru yang lebih kompleks dapat diciptakan hingga menjadi sistem yang utuh. Sebagai gambaran, versi eForth yang dibuat oleh C.H. Ting hanya memiliki 30-an fungsi primitif, dan dengan 30-an fungsi primitif itulah, sebuah sistem operasi yang lengkap dapat dibuat.

Dengan fungsi primitif yang tersedia, kita dapat mengeksplorasi fitur-fitur CPU mikrokontroler selayaknya kita memrogram dalam bahasa Assembly, tapi lebih mudah. Kita dapat langsung mencoba dan menguji deretan perintah-perintah singkat yang akan secara langsung dieksekusi oleh Forth (Avise) dan segera ketahuan hasilnya.

Referensi mengenai register-register CPU beserta alamat dan fungsinya sangat diperlukan bilamana ingin mendayagunakan Forth secara maksimal.

 

Contoh Interaksi User Dengan Forth (Avise)

Board FORTHUNER46 dilengkapi dengan LED Indicator pada pin PB5 dan BUZZER pada pin PD2. Untuk menyalakan LED sangatlah mudah, cukup dengan mengetik perintah:

   $B5 OH

$B5 adalah representasi dari PORTB bit ke-5 dan OH adalah fungsi primitif bawaan Avise yang berfungsi untuk mengeset bit (PB5 menjadi berlogika HIGH).

Dan untuk mematikan LED, perintahnya adalah:

   $B5 OL

OL adalah fungsi primitif yang berfungsi untuk mereset nilai bit ke-5 dari PORTB.

Mudah bukan? Btw, Forth menganut notasi postfix atau RPN (Reverse Polish Notation) dimana parameter fungsi diletakkan sebelum fungsinya. Ini sangat wajar karena Forth berbasis stack. Forth menggunakan stack untuk menjalankan operasinya. Parameter-parameter fungsi harus dimasukkan stack (pushed) terlebih dahulu karena fungsi nantinya akan mengambilnya (poped) dan memanipulasinya.

Sekarang untuk Buzzer. Untuk mengaktifkan dan mematikan Buzzer pada PD2 perintahnya tak jauh beda,

   $D2 OH
   $D2 OL

Avise juga menyediakan fungsi MS yang berfungsi untuk mengaktifkan timer dan menghitung hingga nilai tertentu. Pada Forth, umumnya fungsi MS digunakan untuk melakukan tundaan proses dalam waktu tertentu. Tapi tidak demikian pada Avise. MS pada Avise hanya mengaktifkan timer dan tidak menghentikan proses sementara. Untuk menghentikan proses sementara, Avise menyediakan fungsi WAIT. Jadi untuk melakukan penundaan waktu atau delay, perintah pada Avise adalah sbb:

   1000 MS WAIT

Dengan demikian untuk mengaktifkan Buzzer selama 1 detik, kita bisa memasukkan perintah:

   $D2 OH 1000 MS WAIT $D2 OL

 

Membuat Fungsi Baru Pada Sistem Forth

Sistem Forth hanya menyediakan fungsi primitif yang siap dikembangkan menjadi aplikasi mikrokontroler. Untuk itu diperlukan fasilitas untuk membuat fungsi baru. Dengan fasilitas ini, kita bisa membuat fungsi-fungsi baru yang merupakan turunan atau bolehlah saya katakan berbahan dasar fungsi primitif.

Untuk membuat fungsi baru, digunakan fungsi yang diawali dengan karakter : dan diakhiri dengan RET. Pada sistem Forth, umumnya fungsi : diakhiri dengan ;. Tapi tidak demikian dengan Avise. Avise menggunakan RET.

Kok gak standar? Memang begitulah Forth. Penamaan fungsi pada setiap versi Forth sangat tergantung pada pembuatnya, kecuali kalau pembuatnya menggunakan nama-nama sesuai dengan standar ANSFORTH. Tapi itu bukan masalah karena setiap versi Forth pasti dilengkapi dengan dokumentasi.

Sebagai contoh, mari kita membuat fungsi BEEP. Kita beri nama fungsi baru ini B1. Fungsi ini berfungsi untuk mengaktifkan Buzzer selamat 1 detik kemudian mematikannya dan menunggu lagi 1 detik. Kode programnya adalah sebagai berikut:

   : B1 $D2 OH 1000 MS WAIT $D2 OL 1000 MS WAIT RET

Selanjutnya, kita bisa memanggil B1 jika ingin membunyikan Buzzer selama 1 detik on dan 1 detik off.

   B1

Dan untuk menghasilkan 3 kali bunyi buzzer, maka kita bisa memberikan perintah:

   B1 B1 B1

Lho, masa begitu? Bagaimana jika 15 kali bunyi Buzzer?

Gampang!

Untuk menghasilkan 15 kali bunyi Buzzer, cukup dengan perintah:

   B1 B1 B1 B1 B1 B1 B1 B1 B1 B1 B1 B1 B1 B1 B1

Gampang sekali, bukan?

Walah, kok tidak pakai perulangan? Gak keren ituhhh?

Itulah sisi lain dari Forth. Filosofi Forth ‘mengajarkan’ untuk melakukan hal-hal semudah mungkin dan untuk tidak melakukan hal-hal yang tidak perlu.

Menuliskan B1 sebanyak 5 kali atau 10 kali atau 15 kali, hasilnya sama saja dengan perulangan 5 kali atau 10 kali atau 15 kali, betul kan? Dan menulis ulang jauh lebih mudah daripada perulangan.

Forth is simple and simple is beautiful.

Apakah Forth tidak memiliki fungsi perulangan? Tentu saja punya. Berikut ini adalah contoh program untuk menghasilkan fungsi untuk menyalakan LED sebanyak N kali dengan durasi on/off T.

   : led-on $b5 oh ret
   : led-off $b5 ol ret
   : delay ms wait ret
   : blink led-on dup delay led-off delay ret
   : nblink repeat swap dup blink swap dek dup 0= until ret

Baris pertama mendefinisikan fungsi led-on untuk menyalakan LED. Baris kedua mendefinisikan led-off untuk mematikan LED.

Baris berikutnya (ketiga) mendefinisikan fungsi delay. Fungsi ini membutuhkan 1 nilai parameter. Baris keempat mendefinisikan fungsi blink yang berfungsi untuk menyalakan LED dengan durasi tertentu dan mematikannya dengan durasi tertentu. Fungsi ini menghasilkan 1 kali blink pada LED.

Baris terakhir mendefinisikan fungsi nblink yang melakukan perulangan sebanyak N kali. Fungsi ini membutuhkan 2 parameter yakni jumlah perulangan dan durasi on/off dari LED.

Dengan demikian, selanjutnya kita bisa menghasilkan LED kedip sebanyak 20 kali dengan durasi on/off 500 milidetik dengan memanggil fungsi nblink sebagai berikut:

   500 20 nblink

 

Bagaimana Dengan Syntax-Checking?

Forth tidak mengenal syntax-checking. Apapun yang dimasukkan user akan langsung dievaluasi oleh Forth. Jadi bilamana terdapat kesalahan ketik perintah, maka Forth akan mengembalikan error dan berhenti.

Forth memiliki apa yang disebut sebagai dictionary, yakni tabel kumpulan fungsi. Setiap kata yang diterima evaluator akan dicari di dalam dictionary, jika ada maka akan langsung dieksekusi, jika tidak ditemukan, maka Forth akan menganggapnya sebagai sebuah nilai dan memasukkannya ke dalam stack. Tapi jika sebuah perintah tidak tergolong fungsi maupun nilai, maka Forth akan mengembalikan error.

Seperti telah saya singgung di atas, Avise menerapkan teknik subroutine threaded code, yang berarti bahwa sesungguhnya, kode program Forth tak lebih dari sederetan nilai dan fungsi yang dieksekusi secara berurutan oleh Forth. Jika berupa nilai, maka nilai tersebut akan dimasukkan ke dalam stack dan jika bukan nilai, maka Forth akan membandingkan perintah tersebut dengan dictionary yang dimilikinya. Jika ketemu, maka fungsi yang bersangkutan dipanggil atau dieksekusi, dan apabila tidak ketemu, maka Forth akan menampilkan pesan error.

Jadi, karena Forth mengevaluasi deretan perintah tanpa melakukan pengecekan, maka menjadi kewajiban pemrogram untuk ekstra teliti dan hati-hati.

 

Apakah Ada Stack-Checking?

Seperti halnya syntax-checking, Forth tidak melakukan stack-checking. Jadi kondisi stack sepenuhnya menjadi tanggung jawab pemrogram. Sebagai stack machine (stack engine), Forth (Avise) menggantungkan hidupnya pada stack. Jika pemrogram tidak teliti dalam melakukan kalkulasi stack, maka bisa dipastikan program tidak akan berjalan dengan benar.

Avise menyediakan stack dengan ukuran 20 words. Sepertinya tidak banyak memang, tapi kebanyakan aplikasi Avise tidak membutuhkan stack dengan kedalaman lebih dari 8 sel.

Sedikit menambahkan pengetahuan, bahwasanya prosesor Forth RTX2010 yang digunakan sebagai kontroler Philae Lander dalam misinya mendarat di komet 67P/Churyumov–Gerasimenko memiliki stack dengan ukuran 256 words saja. Philae berhasil mendarat di komet 67P/Churyumov–Gerasimenko setelah menempuh perjalanan selama 10 tahun 8 bulan semenjak lepas-landas dari bumi. Wow! (RTX2010 adalah prosesor 16-bit yang bekerja pada kecepatan clock 8MHz).

Kembali ke tidak adanya syntax-checking dan stack-checking, apakah dengan demikian Forth itu menyusahkan? Bisa iya, bisa tidak.

Forth menawarkan kebebasan tingkat dewa. Pemrogram bebas sebebas-bebasnya mengembangkan sistem Forth yang ada. Namun demikian, ada rupa ada harga. Kebebasan yang sebebas-bebasnya itu terkadang harus dibeli dengan harga yang pantas. Dalam kasus pemrograman Forth, puyengnya bisa berlipat-ganda dibanding dengan menggunakan bahasa lain.

Lalu bagaimana cara agar kita bisa aman dan nyaman memrogram dalam bahasa Forth? Simak pembahasan singkat mengenari faktorisasi berikut ini.

 

Faktorisasi

Forth mengajarkan teknik faktorisasi. Chuck Moore, pencipta Forth, mengajarkan untuk melakukan faktorisasi, yakni memecah-mecah masalah hingga menjadi bagian-bagian kecil yang paling sederhana. Sangat kecil sehingga kita dapat membuat subrutin programnya dengan sangat mudah dan tidak mungkin berbuat kesalahan ketika membuatnya.

Chuck Moore menegaskan bahwa definisi fungsi baru Forth seyogyanya hanya terdiri dari maksimal 2 baris saja. Kalau bikin subrutin sesederhana itu masih salah, ya mungkin kita sendiri yang kebangetan. Mungkin begitu maksudnya. Hahaha.

Dan kita sebagai pemrogram harus berdisiplin diri bahwa kita hanya melakukan hal yang perlu saja dan tidak melakukan hal yang tidak diperlukan. Kita hanya membuat fungsi-fungsi yang memang diperlukan saja untuk membuat aplikasi berjalan. Tidak lebih dari itu.

Contoh program traffic-light mungkin bisa memberikan sedikit gambaran.

Nah, dengan cara seperti itu, maka kita akan memiliki fungsi-fungsi yang tangguh dan teruji. Dari fungsi-fungsi yang paling sederhana tadi, kita beranjak lebih lanjut mendefinisikan fungsi-fungsi yang lebih komplek. Demikian seterusnya sampai kepada program utama penyelesaian masalah yang sedang kita selesaikan. Dengan teknik seperti ini, bug bisa diminimalisir, bahkan tanpa bug.

 

 

Program Disimpan Dimana?

Tentu saja di memori flash dari mikrokontroler. Setiap fungsi baru yang berhasil didefinisikan, secara otomatis tersimpan di flash dan tidak akan hilang meskipun power dimatikan. Bilamana ada fungsi baru yang tidak diperlukan, bisa dihapus menggunakan perintah forget sehingga memori bisa diklaim kembali. Contoh:

   forget B1

 

Looping Program Utamanya Bagaimana?

Forth memiliki fungsi yang umum disebut sebagai turnkey. Fungsi ini akan menyimpan alamat fungsi utama yang dijadikan turnkey yang mana alamat fungsi utama tersebut akan dipanggil ketika sistem di reboot. Pada Avise, fungsi turnkey ini dinamakan fungsi AUTOEXE.

Contoh, kita gunakan kembali contoh LED blink diatas dan menambahkan fungsi program utama yang akan dijalankan ketika mikrokontroler reset/reboot dan akan dijalankan secara terus-menerus oleh mikrokontroler.

   : led-on $b5 oh ret
   : led-off $b5 ol ret
   : delay ms wait ret
   : blink led-on dup delay led-off delay ret
   : main repeat 500 blink key? until drop ret
   autoexe main
   init

Fungsi main melakukan proses perulangan yang akan menghasilkan LED kedip dengan durasi on/off 500 milidetik secara terus-menerus. Untuk keluar dari perulangan tersebut, user cukup menekan sebuah tombol pada keyboard. Fungsi key? akan menghasilkan TRUE bilamana ada tombol yang ditekan (dalam hal ini, mikrokontroler menerima data sebuah karakter dari port serial). Nilai TRUE ini akan menghentikan fungsi until sehingga tidak melompat (mengulang) kembali ke repeat.

Setelah perintah autoexe main, maka ketika mikrokontroler di reset (reboot), maka fungsi main akan dijalankan. Mudah, bukan?

 

Pengkondisi IF/ELSE/ENDIF (update 22/11/2017)

Update ini dilakukan setelah mendapat pertanyaan dari teman Facebook.

Jadi berikut saya berikan contoh penggunaan pengkondisi IF/ELSE/ENDIF pada Avise melalui contoh program berikut ini:

   : BTN $C5 DUP IP RIO RET
   : LED IF $B5 OH ELSE $B5 OL ENDIF RET
   : -----> RET
   : MAIN REPEAT BTN DUP -----> LED 48 + EMIT KEY? UNTIL DROP RET

BTN berfungsi mengonfigurasi pin PC5 sebagai input dengan internal pullup dan membaca nilai atau kondisi dari PC5. Konfigurasi PC5 tersebut dilakukan dengan $C5 IP. Fungsi DUP ditengah adalah menduplikasi nilai $C5 untuk selanjutnya menjadi parameter masukan untuk fungsi RIO yang berfungsi membaca nilai input sebuah pin.

LED berfungsi mengupdate kondisi LED pada PB5 sesuai dengan kondisi BTN pada PC5.Fungsi ini menggunakan IF/ELSE/ENDIF. Fungsi IF mengambil 1 parameter. Jika parameter masukan bernilai 1 (TRUE), maka bagian program setelah IF akan dijalankan, yakni $B5 OH (LED ON). Dan jika parameter masukan bernilai 0 (FALSE), maka bagian program setelah ELSE akan dijalankan, yakni $B5 OL (LED OFF). Fungsi IF diakhiri dengan ENDIF. Jadi update kondisi LED sesuai dengan kondisi BTN dapat ditulis sbb:

   BTN LED

Sedikit tambahan, format IF/ELSE/ENDIF secara lebih detil bisa ditulis sebagai berikut:

   <logic-input> IF <if-true> ELSE <if-false> ENDIF

Demi menunjukkan sedikit kekerenan bahasa Forth, maka saya definisikan fungsi:

   : -----> RET

—–> tersebut tidak memiliki fungsi apapun. Namun demikian, dengan didefinisikannya fungsi tersebut, maka penulisan perintah BTN LED bisa ditulis dengan cara:

   BTN -----> LED

Lebih keren, bukan?

Lanjut. Fungsi MAIN mendefinisikan perulangan REPEAT/UNTIL untuk melakukan update status LED berdasarkan kondisi BTN secara terus-menerus.

   : MAIN REPEAT BTN DUP -----> LED 48 + EMIT KEY? UNTIL DROP RET

Fungsi ini juga menampilkan status BTN dengan mengirimkan (EMIT) karakter ‘1’ atau ‘0’ ke PC. Perulangan ini akan berakhir jika user menekan tombol pada keyboard.

Perintah DUP pada BTN DUP —–> LED akan menduplikasi nilai 1/0 (true/false) yang dihasilkan oleh fungsi BTN sehingga nilai BTN tidak hilang (dengan cara menduplikasi stack teratas) setelah diambil oleh fungsi LED. Nilai hasil duplikasi BTN akan ditambah dengan 48 dan dikirim ke PC sebagai karakter ASCII dengan perintah EMIT.

Fungsi KEY? akan mengecek apakah user menekan tombol pada keyboard. Jika TRUE maka UNTIL akan berakhir, dan selanjutnya, fungsi DROP akan membuang nilai stack teratas karena sudah tidak diperlukan. Mengingat bahwa kondisi stack sepenuhnya adalah tanggung jawab pemrogram.

Berikut adalah screenshot eksperimen IF/ELSE/ENDIF.

 

Kesimpulan

  1. Dengan Forth, kita tidak memerlukan peralatan tambahan seperti programmer (USBASP, AVRISPMKII) untuk memrogram dan berinteraksi dengan mikrokontroler.
  2. Dengan Forth, kita tidak memerlukan program IDE dan Compiler semacam CVAVR, AVR-GCC, Arduino dan BASCOM.
  3. Dengan Forth, kita bisa menggunakan komputer dengan spesifikasi terendah sekalipun, asalkan punya program terminal serial.
  4. Dengan Forth, kita bisa mengeksplorasi secara lebih cepat dengan adanya fitur interaktif REPL yang disediakan oleh Forth.
  5. Dengan Forth, kita bisa bereksperimen dengan lebih cepat dibanding dengan sistem selain Forth.
  6. Kita bisa mengembangkan fungsi primitif yang disediakan menjadi fungsi-fungsi baru yang lebih kompleks sesuai dengan kebutuhan aplikasi.
  7. Dengan Forth, tak hanya untuk memudahkan bereksplorasi dan bereksperimen, tapi kita juga bisa membuat program sehingga sistem mikrokontroler berfungsi sebagai kontroler yang mengontrol sebuah sistem (plant).

 

Sekedar Screenshot

Berikut ini adalah sekedar tampilan terminal serial (saya menggunakan picocom) yang terhubung dengan board FORTHUNER46 dengan sistem operasi Forth (Avise).

Semoga tulisan ini dapat lebih mengenalkan Anda kepada Forth, khususnya Avise (AVR Virtual Stack Engine).

 

Harga Board FORTHUNER46

Jika Anda berminat dengan board FORTHUNER46, Anda bisa langsung menghubungi saya melalui SMS/WA ke nomor 081231784018. Harga board FORTHUNER46 yang telah ditanami sistem operasi Forth (Avise) adalah 150 ribu. Jika Anda membeli board ini, Anda akan mendapatkan jatah gratis pelatihan online selama 1 jam.

 

Pelatihan Forth

Saya memberikan layanan pelatihan pemrograman Forth secara online dengan biaya 100 ribu untuk durasi 3 jam. Berikut adalah cuplikan pelatihan Forth dengan salah seorang pengguna FORTHUNER46.

Nah, jika berminat, langsung saja hubungi saya.

Selamat belajar dan selamat berkarya.

 

Tulisan terkait

Avise – AVR Virtual Stack Engine

Contoh Program Forth (Avise) – LED Blink

Contoh Program Forth (Avise) – Traffic Light Sederhana

 

Add a Comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>