Pengetahuan Dasar penggunaan Timer Counter Microcontroller AVR

timer

Pin Timer /Counter pada AVR

Pin Timer / Counter Pada Atmega8535

Tujuan Pembahasan timer dan counter AVR :

1. Melaksanakan tugas tertentu secara ber ulang  (mode normal).

2. Menghitung panjang pulsa (input capture)

3. Menghitung banyaknya event ( sebagai counter).

4. Mengendalikan kecepatan motor DC (pulsa wide modulation /PWM).

5. Membuat penundaan waktu (delay).

6. Sinyal generator .

Komponen utama Timer/Counter adalah sebuah register  yg tugasnya hanya berhitung dari 0 sampai batas maximumnya, register ini pada AVR disebut  register TCNT .  Misalnya  sebuah register TCNT    pada AVR adalah 8 bit,  maka nilai maksimunya adalah 255.

Register yang digunakan untuk mendukung operasi Timer Counter pada AVR :

  • Register TCNT = register pencacah dari 0 sampai nilai maximum yg kita tentukan.
  • Register TCCR =Untuk pengaturan mode  operasi  Timer/Counter
  • Register TIMSK =Untuk  memilih Timer Counter  mana yg aktif.
  • Register TIFR = Untuk mengetahui adanya interupsi akibat operasi Counter Timer .
  • Register OC (output compare) = untuk menyimpan nilai pembanding dgn nilai pd register  TCNT.
Jadi kalau kita ingin melakukan pengaturan (men set up )   Timer/Counter kita fokuskan ke register TCCRn .  n adalah nomer timer ,  misal  jika kita ingin menggunakan Timer 0 maka yg kita atur adalah TCCR0,timer 1 TCCR1A dan TCCR1B.

Kapan  dia  berfungsi sbg timer dan kapan dia berfungsi sbg counter?

konseptimer

Ketika sumber clock  dari   system clock  (kristal) maka ia  berfungsi sbg timer.

Ketika sumber clock dari external / pin T maka ia berlaku sebagai counter.

pemilihan sumber clock ada pada bit  CS pada register TCCR.

MODE TIMER O 

Untuk menentukan mode timer O di lakukan pd bit WGM-OO dan WGM-OI pada register control (TCCRO) seperti pada tabel dibawah ini.

modetimer0

1.  Mode Normal  

Memilih mode ini dgn cara menset semua bit  WGM OI =O dan WGMOO=O  , pada register TCCR

Digunakan  untuk melaksanakan pekerjaan yang berulang dgn interval tertentu juga bisa digunakan utuk membuat delay.  Nilai TCNT akan terus menerus mengalami kenaikan tiap di clock oleh simber clok yg sudah dipilih. Jika sudah mencapai maksimumnya nilai TCNT akan kembali 0  dan mengeset bit Flag TOV0 di register TIFR.  Waktu interval  dapat dirubah rubah dengan merubah nilai maximum TCNT.  Makin kecil nilai maximum TCNT makin kecil pula waktu intervalnya.  Contoh sebagai gambaran saja , jika periode clock yg di berikan ke timer 1 detik,  maka dgn nilai max TCNT diset 255 , interval timer  1 x255 = 255 detik. untuk nilai max  TCNT  di set 10 . Maka periode interval 1×10 = 10 detik.

Untuk mode normal penggunaanya cukup mudah, contohnya anda bisa baca disini.

pada mode normal selain bisa diset sebagai timer    juga sebagai counter, dgn cara merubah sumber clocknya menggunakan triger di pin TO .  Pengantian sumber clock melalui set bit CSO2:CSOl:CSOO pada register TCCRO seprti tampak pd gambar dibawah ini(  untuk lebih jelasnya lihat  penjelasan no 3.  mode normal sbg  counter   )

modenormal

Cara seting pilihan sebagai Timer atau counter pada codewizard di codevision

setwizardtimer

pilihan scala clock CS02:CSo1:CSoo untuk xtal 11.059.200hz  pd codevision sudah berupa pilihan  frekwensi clock timer:

timer_systemclock_cavr

2.  Mode Input Capture pada Timer 1 .

Input capture digunakan untuk meng hitung periode pulsa yang mentriger pin ICP1.  Setiap kali Pin ICP1 di triger  oleh perubahan sinyal (faaling atau rising )akan mengcopy nilai register 16 bit TCNT ke register 16 bit ICR1 (ICR1H dan ICR1L). perbedaan dengan  timer 0 adalah nilai TCNT continyu bergulir  tanpa ada start dan stop timer sedangkan pa timer0 ada start dan stop timer.

oleh karena itu nilai register ICR1 harus segera dibaca sebelum di overwrite oleh data TCNT yg baru ketika terjadi perubahan sinyal berikutnya.

modeICP

cara menghitung periode pulsa

misalkan triger oleh rising edge (perubahan sinyal rendah ke tinggi) pada pin ICP1

1.   set timer1 ke mode input capture

2.   enable interupsi timer1 overflow dan interupsi input capture

3.   baca nilai ICR1 pada interupsi triger pertama dan baca ICR1 pada interupsi triger kedua

4. selisih hasil bacaan tsb adalah periode pulsa.

contoh kode

#include <mega16.h>
/*define Port C as output for pulse width*/

unsigned char ov_counter;
unsigned int counterSekarang,counterSebelumnya;
unsigned int jumlahStep;
/*Timer 1 overflow ISR*/
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
++ov_counter;
}
/*Timer 1 input capture ISR*/
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
counterSekarang = 256*ICR1H + ICR1L;
jumlahStep=(unsigned long)counterSekarang+ ((unsigned long)ov_counter * 65536)- (unsigned long)counterSebelumnya;
PORTC = ~(clocks / 750); /*output milliseconds to Port C*/

ov_counter = 0;
counterSebelumnya = counterSekarang;             //simpan hasil bacaan ICR1  pertama
}
void main(void)
{
DDRC=0xFF; /*set Port C for output*/
TCCR1A = 0; /*disable all waveform functions*/
TCCR1B = 0xC2;/*Timer 1 input to clock/8, enable input capture*/
TIMSK = 0x24; /*unmask timer 1 overflow and capture interrupts*/
#asm(“sei”) /*enable global interrupt bit*/
while (1)
{
; /*do nothing here*/
}
}

3.  Mode Normal sebagai Counter


Digunakan untuk menghitung jumlah event yang mentriger pin T0 (portB.0) jika kita menggunakan  timer0  atau T1 (portB.1) pada timer1.

/*===================================================
Chip type           : ATmega8535
Author              : Pccontrol.wordpress.com
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

unsigned int hitunganMSB;
unsigned int hitunganLSB;
 unsigned char bufferCounter[15];
 unsigned long int hitungan;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//hitungan lebih dari 255

hitunganMSB = hitunganMSB + 1;

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Timer/Counter 0 initialization
// Clock source: T0 pin Falling Edge
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x06;
TCNT0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("counter :");
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
      hitunganLSB = TCNT0;
      hitungan = hitunganMSB + hitunganLSB; 

      sprintf(bufferCounter,"%i ", hitungan );
   lcd_gotoxy(0,1);
   lcd_puts(bufferCounter);
      };
}

4. Mode PWM , Pulsa Wide Modulation.

Mode PWM ada dua yaitu PWM phase correct dan Fast PWM.  perbedananya yaitu pada PWM phase corect counter  (TCNT) bergulir/mencacah naik dan turun . sedangkan pada Fast PWM counter  (TCNT) hanya bergulir naik saja .

Untuk menjadikan Timer counter  mode PWM phase corect yaitu  dgn Cara men set bit WGM01=1 dan bit WGM0 =0  ,  pada register TCCR.

MODETIMER
Salah satu kegunaan sinyal PWM  antara lain untuk  mengendalikan Kecepatan putaran  Motor DC.   Gambar berikut ini menunjukan berbagai bentuk PWM dan efek terhadap kecepatan Motor DC yang berbeda sesuai bentuk pulsa PWM.

Pulsa Wide Modulation

 

Cara pembentukan sinyal Fast  PWM 

Nilai pada register Counter TCNT akan terus menerus naik sampai nilai maximum, lalu kembali ke 0. begitu seterusnya selama sinyal clock diberikan kepada timer. Nilai OCR diset untuk mengatur pembentukan PWM.

saat nilai TCNT  >  nilai OCR maka pin OC mengeluarkan sinyal HIGH ,

saat nilai TCNT < nilai OCR maka pin OC mengeluarkan sinyal LOW.

Gambar berikut menunjukan tiga buah nilai OCR yang berbeda ,yg  menghasilkan  sinyal output  PWM   berbeda pula pada pin OC.

mode PWM

Cara Membuat PWM pada CodeWizard  di Codevision spt pada gambar berikut:

membuat pwm 25% pada output OC0 dgn Timer0

code program:

#include <mega8535.h>

// Declare your global variables here

void main(void)
{

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz
// Mode: Phase correct PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x63;
TCNT0=0x00;
OCR0=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

while (1)
      {
      // Place your code here

      };
}

PWM phase corect
PWM PHASE CORRECT
5. Membuat Delay dengan Timer.
#include <mega8535.h>

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
delay = delay + 1
}

void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3.906 kHz
// Mode: Normal top=FFh
TCCR0=0x05;
TCNT0=0xD9;
// Timer0 enable
TIMSK=0x01;
// Global enable interrupts
#asm("sei")

while (1)
      {
      //program utama disini
       delay(100);   //delay 1 detik   (100*10ms=1000ms)
      };
}

Void delay(int delay_ms)
{
   TCNT0=0xD9;  //interval  timer = 10 ms
   delay=0
   while(delay<=delay_ms)
   {
    //muter2 disini
    }
}

Timer Mode CTC (clear timer on compare match)

Pada mode ini counter TCNT akan bergulir/mencacah naikkemudian akan kembali 0 saat nilai  TCNT = OCR0. Untuk menghasilkan gelombang kotak pd pin OC kita set OC0 toggle yaitu dgn memberi nilai  COM1 =0 dan COM0 =1 di register TCCR.   

modectc
====================================================================
Kesimpulan cara Pengesetan register TCCR0 untuk timer 0
timer_seting

referensi :

http://www.atmel.com/dyn/resources/prod_documents/doc2505.pdf

Advertisements

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis untuk pemula.

Posted on 14/08/2011, in Menengah-2. Bookmark the permalink. 20 Comments.

  1. , Terima kasih mas, saya masih bingung masalah timer, heheh

  2. Mksih atas pencerahaannya…

  3. abdul aziz effiyatna

    maaf mas mau tanya , gimana ya coding bascom avr pengaturan pwm untuk pengaturan nyala lampu menggunakan sensor ldr..klo ada ini alamat email saya : abdulazizeffiyatna@yahoo.com

  4. mau tanya mas, saya msih bingung masalah counter, khususunya penyusunan programnya … saya mau bikin fungsi seperti IC4017.. jika misalnya inputnya udah di beri logika 1 sebnyak 5 kali.. misalnya pinc.1 aktif… itu gmana programnya mas? tolong di bantu :) soalnya sudah saya coba2 ttp ga bisa :P.. hehehe

  5. maaf mas mau tanya saya mau buat program timer dg bahasa bascom untuk inputnya dari port mikrokontroler, bila input kita kasih maka timernya jalan dan bila inputnya kita putus maka timernya berhenti dan ada jumlah waktunya…nah inputnya hanya disalah satu pinnya saja….gmn? tks

    syahdami

  6. coba” C&AVR “

  7. mas saya mau tanya,,
    ada nggak program antrian bank,,
    klu ada kirim ke e-mail saya ya,,
    ini emailny >> ishaqnasution@yahoo.co.id
    sebelumnya terima kasih

  8. 5. Membuat Delay dengan Timer.
    #include

    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    delay = delay + 1
    }

    void main(void)
    {
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 3.906 kHz
    // Mode: Normal top=FFh
    TCCR0=0x05;
    TCNT0=0xD9;
    // Timer0 enable
    TIMSK=0x01;
    // Global enable interrupts
    #asm(“sei”)

    while (1)
    {
    //program utama disini
    delay(100); //delay 1 detik (100*10ms=1000ms)
    };
    }

    Void delay(int delay_ms)
    {
    TCNT0=0xD9; //interval timer = 10 ms
    delay=0
    while(delay<=delay_ms)
    {
    //muter2 disini
    }
    }

    ini kok masih ada error ya
    Error: the expression must be a modifiable lvalue

  9. Mas saya udah coba tapi hasil pembacaan pulsa gak keluar nih. Cuman “periode pulsa :” aja. padahal saya udah kasih triger di pin ICP nya.

  10. Waduh, maksudnya bentuk pulsa nya begini mas:
    |—————-|
    ————–| |
    ICR1L ICR1H ——-> ICR1l + ICR1H = TCNT

  11. Mas mau tanya. Saya mau baca panjang pulsa dari 2 masukan ke mikro. Nah di metode “Mode Input Capture”

    unsigned char bufferperiodeL[15];
    unsigned char bufferperiodeH[15];

    // Timer 1 input capture interrupt service routine
    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    {

    sprintf(bufferperiodeL,”%i “,ICR1L);
    sprintf(bufferperiodeH,”%i “,ICR1H);

    lcd_gotoxy(0,1);
    lcd_puts(bufferperiodeH);
    lcd_gotoxy(4,1);
    lcd_puts(bufferperiodeL);

    ICR1H=0;
    ICR1L=0;
    TCNT1L =0;
    TCNT1H =0;
    %maksudnya ini menghitung pulsa seperti ini gak mas:
    |—————|
    ————–| |
    ICR1L ICR1H ——-> ICR1l + ICR1H = TCNT
    }

    Bagaimana saya juga menghitung panjang pulsa setiap kejadian/ trigger yang masuk mas. misalkan truger 1 panjang pulsa sekian dan seterusnya.?

    Mas, di mikrokan cuma ada satu pin ICP kalau masukan trugernya ada 2 yang satu diapain ya. Ada alternative gak ?

    Terima Kasih

  12. Makasih, mas buat pencerahannya……….

  13. slam kenal mas–
    punya buku dasar pemograman …maaf q masih pemula .
    emaile q: ervin.b_vian@ymail.com

  14. contoh potongan program conter Up
    //==========================//
    // counter up //
    //==========================//
    if (!PINB.0)
    {
    delay_ms(60);
    counter = counter + 1;

    muter:
    if (!PINB.0)
    {goto muter;}

    delay_ms(60);
    }

  15. mas, mau nanya nih? bisa gak atmega8535 menerima 2 input counter , saya akan membuat pin PB.0 sebagai up counter dan pin PB.1 sebagai down counter. kasih tau contohnya?

  16. keren mas brooww

  17. register compare OCR yg dirubah2..

  18. thx atas infonya…
    saya mau tanya kalo mengatur periode PWM itu nilai periodenya dimasukkan ke register apa?

    saya sedang mencoba mengatur servo dengan pwm melalui mode top to ICR tp hasilnya servo tidak bisa menuju ke posisi maksimal maupun minimal…
    kira2 ada referensinya tidak??
    thx before

Komentar ,Saran atau Pertanyaan

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

%d bloggers like this: