Contoh Program Forth (Avise) – LED Blink


Pada beberapa waktu yang lalu, saya memposting tentang Avise – AVR Virtual Stack Engine, yakni implementasi Forth untuk mikrokontroler AVR ATmega. Pada postingan tersebut saya mencoba Avise dengan mikrokontroler ATmega8. Kekurangan dari postingan tersebut adalah saya tidak memberikan contoh program yang konkrit.

Nah, pada postingan ini, saya akan memberikan sebuah contoh program yang semoga dapat memberikan gambaran secara sedikit lebih gamblang tentang bagaimana memrogram mikrokontroler ATmega8 menggunakan Avise. Contoh program yang saya berikan sangat sederhana yakni lampu kedip yang dalam judul di atas saya sebut LED Blink.

Btw, pada eksperimen ini saya menggunakan board NEO STARDUINO seperti ditunjukkan oleh gambar berikut ini.

Output siap pakai yang tersedia pada board adalah sebuah LED yang dikontrol dengan pin PB5 dan sebuah Buzzer yang dikontrol dengan pin PD2.

 

Avise LED Blink

Pertama-tama, kita simak dulu programnya, kemudian kita bahas secara detil masing-masing baris perintah dalam program tersebut.

 

Kode Program LED Blink Avise (Forth)

: 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

 

Penjelasan Kode Program

Dalam bahasa pemrograman Forth, : berfungsi untuk mendefinisikan sebuah kata (word). Fungsi dalam bahasa Forth disebut dengan word. Kata-kata (words) membentuk pustaka atau dictionary.

Baris perintah

   : led-on $b5 oh ret

berfungsi mendefinisikan kata led-on. Sedangkan

   $b5 oh

berfungsi untuk mengeset (output-high) bit ke-5 dari PORTB. Dan

   ret

berfungsi mengakhiri definisi led-on.

Penjelasan yang sama berlaku untuk baris perintah

   : led-off $b5 ol ret

dimana ol adalah kata yang berfungsi mereset (output-low) bit ke-5 dari PORTB.

Baris perintah selanjutnya adalah

   : delay ms wait ret

Baris perintah ini mendefinisikan kata delay yang berfungsi untuk melakukan tundaan waktu. Kata ini memerlukan 1 buah parameter yakni nilai delay dalam satuan milidetik. Contoh pemanggilan kata delay adalah sebagai berikut

   100 delay     \ delay 100ms
   500 delay     \ delay 500ms

ms berfungsi mengaktifkan timer dan wait akan menghentikan proses dan menunggu sampai timer mencapai nol.

Baris perintah selanjutnya sedikit lebih panjang, yakni

   : blink led-on dup delay led-off delay ret

Kata blink memerlukan 1 buah parameter yakni nilai delay dalam satuan milidetik. Contoh pemanggilannya adalah sbb

   200 blink

yang akan menghasilkan urutan proses

led-on - delay200ms - led-off - delay200ms

dup dalam definisi kata blink berfungsi untuk menduplikasi nilai stack teratas. Dalam hal ini nilai teratas tersebut adalah nilai satuan delay untuk blink. Penduplikasian ini bertujuan agar kedua delay dalam kata blink memiliki parameter nilai tundaan waktu yang sama.

Nah, sekarang kita sampai pada baris terakhir yakni

   : nblink repeat swap dup blink swap dek dup 0= until ret

nblink adalah kata yang dengan kata ini kita bisa menghasilkan proses LED Blink sebanyak x kali dengan tundaan waktu y milidetik. Cara pemanggilan kata nblink adalah sbb

   y x nblink

Contoh, untuk menghasilkan LED Blink sebanyak 5 kali dengan durasi nyala/mati 500 milidetik, maka perintahnya adalah

   500 5 nblink

Adapun penjelasan dari baris perintah terakhir ini adalah:

  • repeat … until, adalah fungsi perulangan yang akan terus-menerus mengulang perintah-perintah diantara keduanya hingga sebuah kondisi benar (true) muncul.
  • dup, seperti telah dibahas sebelumnya, adalah fungsi untuk menduplikasi nilai teratas stack. Perintah 10 dup akan menghasilkan kondisi stack dengan nilai teratas 10 dan nilai dibawahnya adalah 10.
  • swap, adalah fungsi untuk menukar nilai stack teratas dengan nilai stack dibawahnya. Perintah 100 200 swap akan menukar 200 (stack teratas) dengan 100 sehingga selanjutnya 100 akan menjadi nilai teratas stack.
  • dek, adalah fungsi untuk mengurangi 1 nilai stack teratas. Jadi fungsi ini adalah fungsi decrement. Mengapa bukan dec? Karena Avise ini buatan Jerman. 😀
  • 0=, adalah fungsi perbandingan. Fungsi ini membandingkan nilai teratas stack dengan nol. Jika benar (sama dengan nol), maka fungsi ini akan menempatkan nilai true pada stack teratas. Jika salah (tidak sama dengan nol), maka fungsi ini akan menempatkan nilai false pada stack.
  • until, fungsi ini mengambil nilai teratas stack. Jika nilainya true, maka proses akan dilanjutkan ke perintah selanjut. Jika false, maka proses akan diulang (melompat kembali) ke perintah setelah repeat.

Sangat beda dengan bahasa pemrograman umum seperti C, Pascal? Tentu saja, karena Forth menganut Reverse Polish Notation (RPN) atau disebut juga postfix notation yang menempatkan parameter di depan fungsinya. Karena Forth adalan stack-machine / stack-engine, maka nilai-nilai parameter harus dimasukkan ke dalam stack terlebih dahulu, baru kemudian diproses oleh fungsinya.

Awalnya memang sedikit membingungkan, tapi dengan selalu mengingat bahwa Avise (Forth) adalah stack-engine dan menggunakan notasi RPN, maka sangat membantu memahami kode program Forth.

 

Screenshot Serial Terminal

 

Penutup

Semoga contoh program beserta penjelasan di atas dapat sedikit memberikan gambaran tentang bagaimana memrogram mikrokontroler menggunakan Avise secara khusus dan Forth secara umum.

Saya menyediakan board dengan mikrokontroler yang sudah terisi Avise (Atmega8) atau FlashForth (ATmega328) dan juga menyediakan pelatihan dasar pemrograman Avise maupun FlashForth.

Contoh penggunakan FlashForth dapat Anda baca pada tulisan berikut ini:

KISUNO – Dialek Pemrograman Ala Ladder Pada Arduino UNO

Selamat belajar dan selamat berkarya.

 

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini:
search previous next tag category expand menu location phone mail time cart zoom edit close