Pengetahuan Dasar penggunaan Timer Counter Mikrokontroler AVR

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 gelombang kotak.
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 no timer ,  misal  jika kita ingin menggunakan Timer 0 maka yg kita atur adalah TCCR0.
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 sebagai Timer
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.

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 .
Digunakan untuk meng hitung panjang pulsa yang mentriger pin ICP (PortD.6 pada atmega8535).  Setiap kali Pin ICP di triger akan TCNT akan ditambah 1. nilai TCNT akan direset pada triger berikutnya.  Sebelum direset nilai TCNT di simpan di register ICR.
Contoh code:
/*======================================================
Chip type           : ATmega8535
Compiler            : CodeVision
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
Author              : pccontrol.wordpress.com 
*****************************************************/

#include <mega8535.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
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;
}

void main(void)
{

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 3.906 kHz
// Mode: Normal top=FFFFh

// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: On

TCCR1A=0x00;
TCCR1B=0x45;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x20;

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

while (1)
      {

      };
}
keterangan program :
setiap ada perubahan tegangan dari  o ke 1 di pin ICP /portD.6  maka akan memicu interupt input capture.  besaran panjang pulsa antara 2 rising edge ada di register ICR1H dan ICR1L .   misal hasil di ICR1 = 1250  maka  perioda pulsa = 1/clock timer * 1250 .  Clock timer  sudah kita pilih  3,906 khz.
(1/3906) * 1250 =   0,32   detik.
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 TCCR
timer_seting
referensi :

1 komentar: