Contoh Program Forth (Avise) – Traffic-Light Sederhana


Sebelum membaca tulisan ini, ada baiknya Anda membaca tulisan terkait berikut ini:

  1. Avise (AVR Virtual Stack Engine)
  2. Contoh Program Forth (Avise) – LED Blink

Jika Anda sudah membaca dua tulisan di atas, maka setidaknya Anda sudah mempunyai gambaran tentang Avise. Dan sekarang kita bahas sedikit tentang sequential relay.

Sequential Relay adalah sistem yang tersusun dari beberapa relay yang bekerja dengan urutan tertentu berdasarkan pewaktuan. Sebutan lain dari Sequential Relay adalah Sequential Timer.

Sequential Relay umumnya digunakan untuk melakukan proses yang mana proses tersebut dilakukan secara berurutan. Berakhirnya proses tahap pertama memicu proses tahap kedua. Berakhirnya proses tahap kedua memicu proses tahap ketiga. Dan seterusnya sampai proses tahap terakhir dilakukan. Ketika proses tahap terakhir selesai, proses bisa dihentikan atau bisa dilanjutkan dengan secara otomatis mengulang ke tahap awal, tergantung kebutuhan sistemnya.

Pada tulisan ini akan saya tunjukkan betapa mudahnya membuat sistem sequential relay menggunakan bahasa pemrograman Forth (Avise) yang telah tertanam pada mikrokontroler ATmega8. Berikut ini adalah foto board mikrokontroler + board relay 4-channel.

Contoh aplikasi yang akan kita selesaikan atau kerjakan menggunakan sequential relay adalah pengontrolan traffic-light tunggal dengan 3 buah lampu, yakni merah, kuning dan hijau.

Adapun proses atau urutan proses yang akan kita program adalah sebagai berikut:

  1. Start, mikrokontroler on atau reset
  2. Relay-1 On, lampu merah menyala
  3. Delay Timer 35000ms, selama 35 detik
  4. Relay-1 Off, lampu merah padam
  5. Delay Timer 500ms
  6. Relay-2 On, lampu kuning menyala ( I )
  7. Delay Timer 1000ms
  8. Relay-2 Off, lampu kuning padam
  9. Delay Timer 1000ms
  10. Relay-2 On, lampu kuning menyala ( II )
  11. Delay Timer 1000ms
  12. Relay-2 Off, lampu kuning padam
  13. Delay Timer 1000ms
  14. Relay-2 On, lampu kuning menyala ( III )
  15. Delay Timer 1000ms
  16. Relay-2 Off, lampu kuning padam
  17. Delay Timer 1000ms
  18. Relay-3 On, lampu hijau menyala
  19. Delay Timer 20000ms, selama 20 detik
  20. Relay-3 Off, lampu hijau padam
  21. Delay Timer 500ms
  22. Relay-2 On, lampu kuning menyala ( I )
  23. Delay Timer 1000ms
  24. Relay-2 Off, lampu kuning padam
  25. Delay Timer 1000ms
  26. Relay-2 On, lampu kuning menyala ( II )
  27. Delay Timer 1000ms
  28. Relay-2 Off, lampu kuning padam
  29. Delay Timer 100ms
  30. Relay-2 On, lampu kuning menyala ( III )
  31. Delay Timer 1000ms
  32. Relay-2 Off, lampu kuning padam
  33. Delay Timer 1000ms
  34. Ulangi langkah 2

Cukup banyak juga ya, ada 30-an langkah.

Nah, bagaimanakah kode program Forth (Avise) nya? Mari kita buat bersama-sama.

 

Kode Program

Pertama-tama kita perlu ketahui konfigurasi pin untuk mengontrol relay-relay lampu merah, kuning dan hijau:

  • Relay-1 (lampu merah) dikontrol oleh pin PB0
  • Relay-2 (lampu kuning) dikontrol oleh pin PB1
  • Relay-3 (lampu hijau) dikontrol oleh pin PB2

Kontrol Relay On/Off

Perintah untuk mengontrol (on/off) pin adalah sebagai berikut:

   $b0 oh   \ PB0 = HIGH
   $b0 ol   \ PB0 = LOW
   $b1 oh   \ PB1 = HIGH
   $b1 ol   \ PB1 = LOW
   $b2 oh   \ PB2 = HIGH
   $b2 ol   \ PB2 = LOW

Karena driver relay yang kita gunakan aktif low, maka untuk mengaktifkan Relay-1 (menyalakan lampu merah) digunakan perintah $b0 ol dan untuk mematikan Relay-1 digunakan perintah $b0 oh.

Delay Timer

Forth secara umum memiliki perintah MS atau ms yang berfungsi melakukan tundaan waktu atau delay. Untuk melakukan tundaan waktu dalam Forth, perintahnya adalah:

   100 ms   \ tundaan waktu 100 milidetik

Avise juga memiliki perintah ms namun sedikit berbeda dengan Forth pada umumnya. Perintah ms pada Avise hanya mengaktifkan timer dengan counter timer senilai parameter yang dimasukkan. Untuk menghasilkan tundaan waktu, Avise menambahkan perintah wait. Jadi untuk melakukan tundaan waktu selama 250 milidetik, perintahnya adalah:

   250 ms wait

 

Kode Program Traffic-Light

Kita dapat membagi proses di atas menjadi beberapa bagian atau rutin yakni:

  1. merah
  2. kuning
  3. hijau
  4. traffic-light

merah kita definisikan sebagai berikut:

   : m $b0 ol 35000 ms wait $b0 oh 500 ms wait ret

Baris program di atas ini mewakili tahapan proses nomor 2 – 5.

hijau kita definisikan sebagai berikut:

   : h $b2 ol 35000 ms wait $b2 oh 500 ms wait ret

yang mewakili tahapan proses mulai nomor 18 – 21.

Sedangkan kuning kita definisikan sebagai berikut:

   : k $b1 ol 1000 dup ms wait $b1 oh ms wait ret

yang mewakili tahapan proses mulai nomor 6-9, 10-13, 14-17, 22-25, 26-29 dan 30-33.

Lampu kuning menyala berkedip sebanyak 3 kali. Untuk menghasilkan output seperti itu, kita dapat dengan sangat mudah sekali memanggil kata (fungsi) k sebanyak 3 kali sebagai berikut:

   k k k

Hah? Masa begitu? Bagaimana kalau perlu diulang 10 kali?

Gampang!!!

   k k k k k k k k k

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

Menuliskan k sebanyak 3 kali atau 10 kali hasilnya sama saja dengan perulangan 3 kali atau 10 kali bukan? Dan menulis ulang itu jauh lebih mudah daripada perulangan.

Forth is simple and simple is beautiful.

Begitulah Forth. 🙂

Jadi dengan demikian, kita bisa menyusun urutan perintah untuk menghasilkan 1 siklus traffic-light dengan cara yang sangat mudah yakni:

   m k k k h k k k

Untuk menghasilkan proses yang berulang secara terus-menerus, kita membutuhkan perintah perulangan.

Perulangan Forth (Avise)

Forth memiliki beberapa perulangan (tergantung pada pembuatnya) yakni antara lain:

   do ... loop
   for
   repeat ... until
   begin ... until

Namun demikian, Avise versi AVR ATmega8, dikarenakan keterbatan memori, maka hanya menyediakan satu macam perulangan yakni repeat … until.

dengan perulangan tersebut, kita bisa mendefinisikan traffic-light sebagai berikut:

   : tl repeat m k k k h k k k key? until ret

Dalam perulangan repeat … until, proses yang terjadi adalah

  1. memanggil m
  2. memanggil k
  3. memanggil k
  4. memanggil k
  5. memanggil h
  6. memanggil k
  7. memanggil k
  8. memanggil k
  9. key? mengecek apakah ada tombol keyboard ditekan (data masuk via serial)

Proses nomor 9 berfungsi sebagai penghenti perulangan. Perulangan repeat … until di atas akan berhenti ketika mikrokontroler menerima sebuah karakter sembarang dari PC.

 

Screenshot Eksperimen

Nah, sekian dulu catatan eksperimen saya dengan Avise. Semoga bermanfaat.

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