http://iwan.blog.undip.ac.id
Pada artikel Engineering View: Control Problems and Tools , saya telah sedikit menyinggung sistem embedded berkatagori reactive. Dalam sistem jenis reactive ini, interaksi sistem dengan lingkungan pada dasarnya memiliki kekangan waktu yang nyata sekali (bersifat real time). Sekarang coba anda bayangkan, apa yang terjadi jika sistem alarm gedung baru berbunyi tiga puluh menit setelah terjadinya kebakaran. Bagaimana perasaan anda jika lima menit setelah transaksi penarikan di ATM, uang belum juga keluar dari mesin tersebut. Apakah anda merasa nyaman, jika AC mulai hidup setelah dua menit tombol ON pada remote control ditekan. Apakah anda tidak merasa kecewa ketika sistem pengingat pada jam tangan tidak berbunyi setelah waktu setting berlalu?. Bagaimana nasib pengendara mobil mewah, jika airbag pada steer mobil baru mengembang lima detik setelah terjadinya tabrakan (ya terlambat hanya lima detik saja...). dst..dst... Intinya, selain kebenaran logika program, salah satu syarat penting yang harus dipenuhi dalam sistem-sistem embedded reactive adalah masalah kekangan dan respon waktu sistem.
Terkait dengan pengembangan sistem-sistem embedded reactive tersebut, sebelum anda melakukan coding, lakukan terlebih dulu thinking dan drawing, untuk lebih jelasnya silahkan anda rujuk (kembali): Design of Embedded Control System Using Statechart: One Picture is Worth a Thousand of Words ! dan Tutorial Perancangan Sistem Embedded Berbasis Statechart: Studi Kasus Pada Line Follower Mobile Robot .
Jika kode fungsi yang merepresentasikan prilaku sistem embedded telah anda dapatkan (tentunya lewat tiga tahapan utama: Thingking, Drawing and Coding), maka permasalahannya sekarang adalah bagaimana program utama menjadwal pemanggilan fungsi tersebut.
Pada artikel ini saya akan menyajikan semacam template softtimer yang dapat anda gunakan sebagai sistem penjadwal dan sekaligus dapat dimanfaatkan juga sebagai basis operasi tundaan yang mungkin anda perlukan dalam sistem reactive yang sedang dibangun.
Dengan menggunakan softtimer yang nanti tersaji, anda dapat meng-create timer dengan jumlah sesuai kebutuhan. Softtimer tersebut saya coding-kan dengan bahasa C (compiler CodevisionAVR) untuk microcontroller AVR. Softtimer dirancang menggunakan tipe data struktur dengan memanfaatkan perangkat keras timer1 (timer
//******this template created by i-one for u*********/ //jumlah timer soft, disesuaikan dengan kebutuhan
#define MAX_TIMER 2;
typedef unsigned int uint; typedef unsigned char uchar; typedef struct{
uint delay; // delay dlm detak (tick)-> 1 tick = 1 ms
uchar time_out; //time_out=1 ->delay telah tercapai
uchar enable; //1 enable, 0 disable counting down
} soft_timer;
//deklarasi soft timer
soft_timer my_timer[MAX_TIMER];
//******deklarasi fungsi-fungsi pengaksesan timer
void init_reg_timer1();
/*
fungsi ini dipanggil untuk inisialisasi register- register timer1. fungsi cukup dipanggil 1x, jika anda
menggunakan timer lain, kode inisialisasi anda sesuaikan */
void set_timer(unchar no_timer, uint delay_ms);
/*
Jika fungsi ini dipanggil, maka count down timer akan mulai dijalankan
-no_timer: nomer timer yang digunakan (0,1,2,dst) -delay_ms: waktu tunda dlm satuan milisecond
*/
void kill_timer(uchar no_timer);
/*
fungsi ini digunakan untuk menghentikan proses counting down soft timer
*/
uchar get_timeout(uchar no_timer);
/*
fungsi ini digunakan untuk mengecek apakah waktu seting timer (lihat fungsi set_timer) sudah tercapai atau belum */
//**************definisi-definisi fungsi soft timer
void init_reg_timer1() {
//inisialisasi reg timer 1
//gunakan bantuan program generator
TCCR1A=0x00; TCCR1B=0x02;
//nilai awal timer 16 bit =0xFFFF->agar lsng interupsi
TCNT1H=0xFF; TCNT1L=0xFF;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04; }
void set_timer(uchar no_timer,uint delay_ms) {
my_timer[no_timer].delay= delay_ms;
my_timer[no_timer].time_out=0; //reset
my_timer[no_timer].enable=1; //start countdown timer
}
void kill_timer(uchar no_timer) {
my_timer[no_timer].enable=0;
my_timer[no_timer].time_out=0; }
uchar get_timeout(uchar no_timer) {
return my_timer[no_timer].time_out; }
/* Timer 1 overflow interrupt service routine tiap 1 ms Clock kristal: 4 MHz, untuk clock crystal yang berbeda sesuaikan nilai TCNT1H dan TCNT1L –nya*/
interrupt [TIM1_OVF] void timer1_ovf_isr(void) {
{
if(my_timer[index].delay==0) {
my_timer[index].time_out =1; //set time_out
my_timer[index].enable=0; } else my_timer[index].delay --; //decrement } } } //**************end of template*******************
Contoh Perancangan Sistem Pemanas dan ilustrasi pemanfaatan fungsi soft timer Gambar berikut memperlihatkan diagram blok perangkat keras sistem kontrol pemanas
Rancanglah perangkat lunak sistem pemanas tersebut dengan prilaku sebagai berikut: Sesaat setelah kita menekan tombol berlabel Start, pemanas akan menyala selama 30 menit --kecuali jika kita tekan tombol berlabel Stop.
Penyelesaian
Berdasarkan problem diatas, nampak bahwa kita hanya membutuhkan dua state (keadaan) yang berbeda untuk merepresentasikan prilaku yang diharapkan: state Heater Off dan State Heater On. Transisi dari satu state ke state lain sudah cukup jelas. Gambar dibawah memperlihatkan prilaku sistem dalam bentuk statechart-nya.
Dengan mengacu statechart diatas maka realisasi fungsi transisi state (fungsi prilaku ) dapat mengambil bentuk:
void statechart_heater(void) {
switch(state) {
case HEATER_OFF: if(PB_START==PUSHED) {
HEATER=ON; count_mnt=0;
set_timer(0,60000); // seting timer 1menit state=HEATER_ON;
} break;
case HEATER_ON : if(get_timeout(0)) { count_mnt++; set_timer(0,60000); } if((PB_STOP==PUSHED)||(count_mnt>=30)) { HEATER=OFF; kill_timer(0); state=HEATER_OFF; } break;
Berikut adalah potongan kode program utama untuk sistem kontrol heater tersebut:
…… ……
enum {HEATER_OFF, HEATER_ON} #define PORTB.0 HEATER
#define OFF 0 // anggap heater active high #define ON 1 //anggap heater active high uchar state;
main() {
//inisialisasi Hardware -> DDRB.0 =output
DDRB.0=1;
//inisialisasi register timer1
init_reg_timer1();
//inisialisai state dan output heater
state=HEATER_OFF; HEATER=OFF;
//enable general interupt
asm(“SEI”)
//set timer soft 1 selama 50 ms
set_timer(1,50);
//never ending looping dengan penjadwalan while(1)
{
if(get_timeout(1) {
statechart_heater();
set_timer(1,50); //set ulang softtimer1 selama 50ms
} } }