Fungsi Soft Timer untuk Keperluan Operasi Tundaan dan Penjadwalan (Scheduling) Pada Sistem Embedded (Oleh Iwan Setiawan)
[email protected] 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 16 bit). Agar anda cepat memahami cara penggunaan softtimer tersebut, pada bagian akhir artikel, saya juga berikan contoh pemanfaatan atau pemanggilan softtimer pada studi kasus sistem kontrol pemanas (tentunya lewat desain Statechart).
Semoga bermanfaat
Fungsi Soft Timer Untuk Keperluan Operasi Tundaan dan Penjadwalan (Scheduling) Pada Sistem Embedded
Iwan Setiawan, http://iwan.blog.undip.ac.id
//******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 registerregister 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 */
2
Fungsi Soft Timer Untuk Keperluan Operasi Tundaan dan Penjadwalan (Scheduling) Pada Sistem Embedded
Iwan Setiawan, http://iwan.blog.undip.ac.id
//**************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) { uchar index; // Inisialisasi ulang nilai register Timer1 (16 bit) TCNT1H=0xFE; TCNT1L=0x0E; // pengecekan status soft timer (tiap 1ms) for(index=0;index< MAX_TIMER;index++) { if(my_timer[index].enable)
3
Fungsi Soft Timer Untuk Keperluan Operasi Tundaan dan Penjadwalan (Scheduling) Pada Sistem Embedded
Iwan Setiawan, http://iwan.blog.undip.ac.id
{ 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.
4
Fungsi Soft Timer Untuk Keperluan Operasi Tundaan dan Penjadwalan (Scheduling) Pada Sistem Embedded
Iwan Setiawan, http://iwan.blog.undip.ac.id
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; } }
Selanjutnya dalam program utama, fungsi tersebut dapat dipanggil misal setiap 50 ms sekali (perhatikan, frekuensi pemanggilan fungsi harus disesuaikan dengan waktu minimal operator menekan tombol Start atau tombol Stop).
5
Fungsi Soft Timer Untuk Keperluan Operasi Tundaan dan Penjadwalan (Scheduling) Pada Sistem Embedded
Iwan Setiawan, http://iwan.blog.undip.ac.id
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 } } }
6