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.
Cukup rumit yaa? Tidak, tidak rumit sampai anda membaca satu per satu penjelasan berikut.
Contoh diatas penulis menggunakan mikro PIC18F2685. Berikut adalah langkahnya,
- Include timer header yaitu dengan perintah #include <timers.h>
- Initialisasi timer dengan perintah OpenTimer0 untuk timer0, OpenTimer1 untuk timer1, dsb.
- Beri nilai timer dengan perintah WriteTimer0 untuk timer0, WriteTimer1 untuk timer1, dsb.
- Kemudian set enable global interrupt dengan perintah " INTCONbits.GIEL = 1;" dan " INTCONbits.GIE = 1;".
- Tambahkan fungsi timer anda pada " void ISRLow(void)". dalam contoh diatas penulis menggunakan nama fungsi " tmr0_interrupt() ".
- 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