Program ini dibuat dengan memanfaatkan fitur timer 1 interrupt pada dsPIC30F2020. Interrupt bila diartikan secara bahasa berarti “menyela/memotong”. Dalam acara debat biasanya seseorang sering mengatakan “interupsi” untuk memotong pembicaraan lawan bicaranya dan kemudian langsung menyampaikan argumennya (tentunya setelah dizinkan). Hal ini serupa dengan apa yang terjadi di dalam sebuah mikrokontroler. Ketika terjadi interrupt, program utama (main routine) yang sedang berjalan akan dihentikan dan kemudian menjalankan serangkaian perintah dalam ISR (interrupt service routine). Setelah seluruh list program dalam ISR selesai dilakukan, maka program utama akan dilanjutkan.
Gambar 1. Alat Timer 1 Interrupt
Kemunculan interrupt ini bersifat periodis dan waktunya bisa diatur sesuai kebutuhan programmer. Dalam aplikasi ini, perintah ISR digunakan untuk menambah variabel counter per 10 ms. Dengan kata lain, periode interrupt yang diinginkan adalah 10 ms. Setelah terjadi 100 kali counter, maka variabel detik bertambah 1. Bila variabel detik mencapai 60 maka variabel menit bertambah 1, sederhana bukan ?
Periode interrupt diatur dengan mengisikan nilai tertentu pada register timer PR1 karena interrupt terjadi setelah periode timer selesai. Jumlah bit register PR1 ada 16 buah, jadi nilai maksimalnya adalah 216 = 65535. Nilai PR1 dapat dicari dengan persamaan sebagai berikut:
Tcy merupakan periode mikrokontroler untuk melakukan satu kali siklus instruksi. Nilainya tergantung dari Fcy atau frekuensi siklus instruksi, dimana:
Fosc adalah frekuensi osilator yang diatur melalui register FOSCEL dan FOSC. Pada program ini Fosc yang digunakan adalah FRC_PLL atau Fast Reference Clock with PLL dengan pilihan FRC_LO_RANGE atau low range FRC option, sehingga nilai Fcy:
Nilai Tcy adalah 51.546 ns.
Prescaler yang disediakan ada empat jenis dan dapat diatur dengan mengisikan nilai 0-3 pada register T1CON bagian TCKPS. Pemilihan prescaler berguna untuk mereduksi nilai PR1 apabila nilainya melebihi 65535. Pada program ini digunakan prescaler 1:256 atau T1CONbits.TCKPS = 3.
Nilai PR1 agar periode interrupt sebesar 10 ms adalah:
Program diawali dengan pengaturan lcd, register timer, bit-bit interrupt (priority, flag dan enable) dan terakhir meng-ON-kan timer. Berikut ini adalah source code program-nya.
#include <p30f2020.h> #include <stdio.h> #include "lcd.h" #define FCY 19400000 // Fcy = 310.4/(8*2) = 19.4 MHz // Configuration settings _FOSCSEL(FRC_PLL); //Fast Reference Clock w/ PLL //Fosc x PLL = 9.7 MHz x 32 = 310.4 MHz _FOSC(CSW_FSCM_OFF & FRC_LO_RANGE); //Sw Disabled, Mon Disabled & low range _FWDT(FWDTEN_OFF); // Watchdog timer off // Function prototype for timer 1 ISR void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void); int menit=0; int detik=0; int counter=0; int main() { char layar[16]; initialize_lcd(16); // Configure Timer 1. // PR1 and TCKPS are set to call interrupt every 10ms. // Period = PR1 * prescaler * Tcy = 758 * 256 * 51.546ns = 10 ms // Tcy=1/((PLL*FRC clock)/16) T1CON = 0; // Clear Timer 1 configuration T1CONbits.TCKPS = 3; // Set timer 1 prescaler (0=1:1, 1=1:8, 2=1:64, 3=1:256) PR1 = 758; // Set Timer 1 period (max value is 65535) _T1IP = 1; // Set Timer 1 interrupt priority _T1IF = 0; // Clear Timer 1 interrupt flag _T1IE = 1; // Enable Timer 1 interrupt T1CONbits.TON = 1; // Turn on Timer 1 while(1) { lcd_xy(0,0); sprintf(layar,"%2d : %2d : 2d",menit,detik,counter); lcd_str(layar); } } // Timer 1 interrupt service routine void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void) { counter++; if(counter==100){ detik++; counter=0; } if(detik==60){ menit++; detik=0; } _T1IF = 0; // Clear Timer 1 interrupt flag }
Interrupt merupakan fitur penting yang sering digunakan. Selain timer interrupt, yang juga sering dipakai adalah PWM interrupt dan ADC interrupt. Pada proses switching sakelar semikonduktor, PWM interrupt biasa digunakan.
Referensi:
- Microchip, 2006. dsPIC30F1010/202X Data Sheet. U.S.A: Microchip Technology Inc.
- Ted Burke, “Simple Timer 1 interrupt example for the dsPIC30F4011”. [Online].Available: http://batchloaf.wordpress.com/2012/04/12/simple-timer-1-interrupt-example-for-the-dspic30f4011/
Oleh:
Hartanto Prabowo dan Gatya Dhanawan W. (Magatrika 2010, Power Electronic)