Posted in Artikel

Aplikasi Timer 1 Interrupt Menggunakan dsPIC30F2020: Stopwatch Sederhana

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.

Image

 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:

Image

Tcy merupakan  periode mikrokontroler untuk melakukan satu kali siklus instruksi. Nilainya tergantung dari Fcy atau frekuensi siklus instruksi, dimana:

Image

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:

Image

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:

Image

Program diawali dengan pengaturan lcd, register timer, bit-bit interrupt (priorityflag 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:

  1. Microchip, 2006. dsPIC30F1010/202X Data Sheet. U.S.A: Microchip Technology Inc.
  2. 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)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s