Wednesday, April 25, 2012

Setting Timer pada Microchip PIC 18


Pada tutorial ini penulis akan menunjukkan bagaimana melakukan programming timer pada Microchip PIC 18. Penulis akan menggunakan free compiler dari Microchip yaitu MPLAB IDE dan compiler C18. Untuk lebih lengkapnya bagaimana mendownload software ini lihat posting “Software Gratis MPLAB Untuk PIC Microchip”.

Berikut adalah contoh program setting timer.

#include 
#include 

unsigned int ms_cnt;

void main(void)
{
    // Initialize Timer 0
    OpenTimer0( TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_64 );
    WriteTimer0(100);

    INTCONbits.GIEL = 1; // global interrupt enabled
    INTCONbits.GIE = 1; // global interrupt enabled

    while(1)
    {
        // Main program here
        if ( (ms_cnt % 1000) < 500)
            LED = 1;
        else
            LED = 0;
    }
}

//=======================================================================
// Interrupt vector
//=======================================================================
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void)
{
  _asm
  goto ISRHigh  // jump to interrupt routine
 _endasm
}
#pragma code
#pragma code InterruptVectorLow = 0x18
void InterruptVectorLow(void)
{
  _asm
  goto ISRLow  // jump to interrupt routine
 _endasm
}

#pragma code
//=======================================================================
// Interupt Service Routine
// this a function reserved for interrupt service routine
// User may need it in advance development of the program
//=======================================================================
#pragma interrupt ISRHigh
void ISRHigh(void)
{
}

#pragma interrupt ISRLow
void ISRLow(void)
{
    if (INTCONbits.TMR0IF)
        tmr0_interrupt(); // Call the timer0 interrupt
}


Catatan: Hiraukan </timers.h></p18f2685.h>

Cukup rumit yaa? Tidak, tidak rumit sampai anda membaca satu per satu penjelasan berikut.

Contoh diatas penulis menggunakan mikro PIC18F2685. Berikut adalah langkahnya,
  1. Include timer header yaitu dengan perintah #include <timers.h>
  2. Initialisasi timer dengan perintah OpenTimer0 untuk timer0, OpenTimer1 untuk timer1, dsb.
  3. Beri nilai timer dengan perintah WriteTimer0 untuk timer0, WriteTimer1 untuk timer1, dsb.
  4. Kemudian set enable global interrupt dengan perintah " INTCONbits.GIEL = 1;" dan " INTCONbits.GIE = 1;".
  5. Tambahkan fungsi timer anda pada " void ISRLow(void)". dalam contoh diatas penulis menggunakan nama fungsi " tmr0_interrupt() ".
  6. Terapkan fungsi anda didalam " tmr0_interrupt() ".
Sekarang anda sudah tahu bagaimana cara untuk melakukan setting timer. Sekarang kita akan membahas lebih detail satu per satu program diatas.

Compiler C18 sudah dilengkapi dengan beberapa library yang bisa anda gunakan. Salah satu contoh dari library ini adalah timers.h. Coba lihat header file pada file ini anda akan melihat beberapa deklarasi fungsi – fungsi salah satunya adalah fungsi “WriteTimer0” dan “OpenTimer0” yang kita gunakan.

Sekarang pada installasi folder compiler C18 yaitu pada ..MCC18/doc, anda akan melihat beberapa dokumen yang salah satunya adalah keterangan mengenai fungsi – fungsi dari library. Anda buka “MPLAB-C18-Libraries_51297f.pdf”. Jangan kuatir jika anda tidak menemukan file ini, anda dapat mendownloadnya pada akhir tutorial ini. Buka pada bagian Chapter 2 > Timer Function. Anda akan menemukan dokumen mengenai fungsi OpenTimer0. Pada contoh diatas OpenTimer0 mempunyai beberapa nilai argumen dengan penghubung “&”. Berikut adalah keterangan penghubung tersebut.

TIMER_INT_ON” untuk meng-enable Timer.

T0_8BIT” menggunakan 8-bit mode timer (mempunyai nilai dari 0 sampai 255 desimal).

T0_SOURCE_INT” menggunakan internal clock untuk menghidupkan timer.

T0_PS_1_64” menggunakan prescaler 1:64

Misal anda menginginkan timer yang akan menginterrupt program setiap 1 millisecond (ms) yang berarti mempunyai frekuensi 1KHz (1/1ms), misal juga clock oscillator mikro yang anda gunakan 40MHz, maka gunakan persamaan berikut.

Fosc = Fclock/4 = 40MHz / 4 = 10MHz

Ftimer = Fosc / prescaler = 10MHz / 64

TimerCount = 256 – (Ftimer / Fdesired) = 256 – (10MHz/(64*1KHz)) = 99.75 atau dibulatkan 100

Sekarang nilai ini yang anda gunakan, pada fungsi “WriteTimer0(100)”, untuk menginterrupt timer0 setiap 1ms.

Jika anda menggunakan 16-bit mode maka persamaan TimerCount menjadi sbb,

TimerCount = 65536 – (Ftimer / Fdesired)

Pada bagian #pragma InterruptVectorHigh dan InterruptVectorLow mempunyai maksud yang sederhana. PIC18 mempunyai dua area interrupt yaitu yang mempunyai priority high dan low. Interrupt priority high mempunyai alamat di memory yaitu 0x08 sedangkan yang low mempunyai 0x18. Jika mikro sedang menjalankan program pada interrupt priority low kemudian terjadi interrupt priority high, maka program akan menjalankan interrupt priority high. Tetapi jika program sedang menjalankan interrupt priority high kemudian terjadi interrupt low maka mikro akan menghiraukannya sampai selesai menjalankan interrupt priority high.

Pada program diatas, ketika terjadi interrupt timer maka mikro akan memanggil “InterruptVectorLow(void)” karena kita menset timer secara default yaitu memanggil interrupt priority low. Kemudian fungsi ini akan memanggil “ISRLow(void)”.

Karena dalam sebuah mikro bisa terdapat berbagai macam interrupt seperti timer, serial, i2c, pwm, dll, maka untuk bisa membedakan apakah interrupt ini berasal dari timer ataukah bukan, penulis melakukan check pada timer interrupt flag. Flag ini akan diset secara otomatis ketika terjadi interrupt timer.
if (INTCONbits.TMR0IF)
    tmr0_interrupt(); // Call the timer0 interrupt
Jika benar dari timer0 interrupt maka program akan memanggil tmr0_interrupt(). Berikut adalah implementasi dari tmr0_interrupt().
// ** interrupt timer0 **
void tmr0_interrupt(void)
{
    // Interrupt every 1KHz 
    WriteTimer0(217);
    ms_cnt++; // increase by one the millisecond variable 
    INTCONbits.TMR0IF=0;
}
Dan sekarang anda bisa mencobanya. Dengan menggunakan MPLAB anda juga diberi kesempatan untuk melakukan simulasi. Coba anda simulasikan program diatas untuk mengetahui apakah program anda sudah benar ataukah tidak sebelum diimplementasikan pada mikro. Program diatas untuk menyalakan LED selama 500ms dan off selama 500ms.

Selamat mencoba.. ^_^

download MPLAB-C18-Libraries_51297f.pdf

No comments:

Post a Comment