RSS

TIMER DAN COUNTER AVR

22 Apr

Mungkin teman-teman semua sudah tau pengertian timer, jadi saya tidak akan menjelaskan panjang lebar mengenai pengertian timer. Sedangkan untuk counter  (pencacah/penghitung) berbeda dengan timer, perbedaan yang mendasar adalah pada sumber clocknya. Jika timer, sumber clocknya berasal dari internal mikrokontroler dalam hal ini berasal dari kristal. Sedangkan untuk counter sumber clocknya berasal dari luar mikrokontroler (eksternal). Sebagai contoh counter, jika kita ingin menghitung banyaknya barang yang lewat pada konveyor, maka sumber clocknya berasal dari sensor yang mendeteksi barang saat melewatinya. Mungkin sampai disini Teman-teman sudah mengerti perbedaan yang mendasar antara timer dan counter.

>>>TIMER<<<

Pada ATmega8535 terdapat 3 buah timer, yaitu Timer0 (8 bit), Timer1 (16 bit) dan Timer2 (8 bit). Untuk perbedaan dan cara kerja masing-masing timer, teman-teman dapat membacanya pada datasheet. Disini saya akan coba membahas Timer0 dan Timer1 saja.

Perhitungan untuk Timero dan Timer1 adalah sebagai berikut:

Ttimer0 = Tosc*(256-TCNT0)*N   → (8 bit = 256)

Ttimer1 = Tosc*(65536-TCNT1)*N   → (16 bit = 65536)

Tosc = 1/Fosc   → pada aplikasi ini saya menggunakan kristal 12 MHz, sehingga:

Tosc = 1/12Mhz = 0,0000000833 detik

Dimana:
Ttimer0 = lamanya periode Timer0
Ttimer1 = lamanya periode Timer1
TCNT0 = Register Timer0
TCNT1 = Register Timer1
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
Tosc = periode  clock
Fosc = frekuensi clock kristal

Sekarang saya akan membuat aplikasi timer yang ditampilkan pada LCD, cara kerjanya pada LCD akan menampilkan nilai awal yaitu 0 kemudian setelah 1 detik (menggunakan timer) nilai tersebut akan naik menjadi 1, kemudian 2 dan seterusnya, jika sudah sampai 100 maka akan diset kembali menjadi 0. Berikut adalah shematicnya:

Menggunakan Timer1:

Ttimer1 = Tosc*(65536-TCNT1)*N

Pada aplikasi diatas diinginkan lamanya timer adalah 1 detik  (Ttimer1 = 1 detik) dan jika saya menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat:

1 = 0,0000000833*(65536-TCNT1)*1024
TCNT1= 53818 = D23A (dalam hexa)

Dari perhitungan diatas didapat nilai 53818 atau dalam hexa D23A, nilai tersebut harus diisikan pada register TCNT1 agar Timer 1 bernilai 1 detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya:

unsigned char temp[6];
int data;

#include <mega16.h>
#include <stdlib.h>

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xD23A >> 8;
TCNT1L=0xD23A & 0xff;
data++; //setelah 1 detik increament data
}

void main(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm(“sei”)

while (1)
      {  
      if (data==100)
      {
        lcd_clear();
        data=0;
      }    

      lcd_gotoxy(0,0);
      lcd_putsf(“ElectrO-cOntrOl”);
      itoa(data,temp); //menampilkan di LCD
      lcd_gotoxy(0,1);
      lcd_puts(temp);
      };
}

Menggunakan Timer0:

Ttimer0 = Tosc*(256-TCNT0)*N

Dengan menggunakan Timer0, untuk aplikasi yang sama seperti diatas, sebenarnya timer0 ini tidak dapat menghasilkan periode timer selama 1 detik dikarenakan keterbatasan jumlah bit yaitu hanya 8 bit (256) saja. Tetapi kita masih dapat memanupulasi program agar dapat menghasilkan timer selama 1 detik, caranya dengan membuat timer selama 10 ms kemudian dilakukan pengulangan sebanyak 100 kali, maka akan dihasilkan timer selama 1 detik.

10 ms * 100= 1 detik

Pada aplikasi ini diinginkan lamanya timer adalah 10 ms  (Ttimer0=10 ms=0.01 s) dan jika saya menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat:

0.01 = 0,0000000833*(256-TCNT0)*1024
TCNT0= 138 = 8A (dalam hexa)

Dari perhitungan diatas didapat nilai 138 atau dalam hexa 8A, nilai tersebut harus diisikan pada register TCNT0 agar Timer 0 bernilai 10 mili detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya:

unsigned char temp[6], loop=0;
int data;

#include <mega16.h>
#include <stdlib.h>

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x8A;
loop++;
if (loop>=100)
    {
    data++;
    loop=0;
    }
}

void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x8A;
OCR0=0x00;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm(“sei”)

while (1)
      {
      if (data==100)
        {
        lcd_clear();
        data=0;
        }    

      lcd_gotoxy(0,0);
      lcd_putsf(“ElectrO-cOntrOl”);
      itoa(data,temp); //menampilkan di LCD
      lcd_gotoxy(0,1);
      lcd_puts(temp);
      };
}

>>>COUNTER<<<

Untuk aplikasi counter lebih mudah dibandingkan dengan timer, karena kita tidak harus lagi menghitung untuk mendapatkan nilai dari register TCNT, tetapi secara otomatis register TCNT yang akan mencacah jika ada input yang masuk.

Berikut adalah aplikasi counter untuk menghitung dan ditampilkan pada LCD, input yang digunakan berasal dari pushbutton. Berikut adalah schematicnya:

Counter0

Input untuk counter0 berasal dari pin T0 atau PB0. Counter 0 hanya mampu mencacah sampai dengan nilai 256 dikarenakan counter 8 bit. Berikut adalah setting pada CodeVision CodeWizard AVR:


Berikut adalah listing program lengkap:

unsigned char temp[6];
int data;

#include <mega16.h>
#include <stdlib.h>

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

while (1)
      {
      data=TCNT0;//hasil  counter (TCNT0) dipindah ke data      
      if (data>=256)
        {
        lcd_clear();
        }           

      lcd_gotoxy(0,0);
      lcd_putsf(“ElectrO-cOntrOl”);
      itoa(data,temp); //menampilkan di LCD
      lcd_gotoxy(0,1);
      lcd_puts(temp);
      };
}

Counter1

Counter1 tidak jauh berbeda dengan counter0, hanya saja maksimum pencacahan counter1 sampai 65536 dikarenakan counter 16 bit, dan input untuk counter1 berasal dari pin T1 atau PB1. Untuk settingan dan program pada CodeVision AVR hampir sama dengan counter0, jadi tidak akan saya jelaskan lagi disini.

 
9 Comments

Posted by on April 22, 2011 in Tutorial AVR

 

Tags: , , , , , ,

9 responses to “TIMER DAN COUNTER AVR

  1. aeronight

    April 27, 2011 at 10:49

    maksih gan bwt infonya…terbantu bgt pokoknya…

     
    • ElectrO-cOntrOl

      April 27, 2011 at 12:44

      ok sama-sama. Semoga budaya saling berbagi ilmu dgn gratis semakin berkembang.

       
  2. aeronight

    April 27, 2011 at 10:51

    maksih gan bwt infonya…lo da info baru bisa di email langsung gan…terima kasih…

     
  3. fuad

    May 12, 2011 at 23:12

    mas mau tanya….gmna cara menampilkan angka lbh dari 100.000 pada LCD menggunakan ATMEGA8535 dengan code vision avr

    terima kasih sebelumnya…

     
    • ElectrO-cOntrOl

      May 20, 2011 at 15:22

      jika anda mau menghitung lebih dari 16bit lebih baikanda menggunakan intrupsi eksternal saja, karena klo pake counter nilai maksimumnya 65535 (16 bit)

      untuk menampilkan di lcd,caranya sama dengan menggunakan instruksi ftoa (float to array):
      int temp[16];/mendeklarasikan variabel RAM lcd
      float nilai=100000; //(misalkan)

      ftoa(nilai,0,temp); //angka 0, banyaknya digit dibelakang koma yg ditampilkan
      lcd_gotoxy(0,1);
      lcd_puts(temp);

       
  4. Septianto Hadi Wibowo

    June 2, 2011 at 01:24

    mangstab bgt…
    keep posting…
    gw dpt bnyak bhan bwt skripsi dr ente…
    thanx a lot…

     
    • ElectrO-cOntrOl Team

      June 2, 2011 at 01:39

      jika ada waktu dan ide baru… insya allah saya posting…
      selalu kunjungi blog gw ya…

       
  5. yuda

    June 17, 2011 at 22:53

    mas, bisa nggak ATmega 8535 dibuat untuk membaca lebar pulsa high dan lebar pulsa low nya , trus di tampilin ke LCD gtu , nah mau ta pake buat baca sinyal PWM dari AFG …………. minta tolong dong listing nya , oiya yg dipake timer 1 klo bs mas , mkasiiih

     
    • ElectrO-cOntrOl Team

      June 18, 2011 at 06:19

      bisa saja, tapi saya blm pernah mencobanya, jd tidak punya listing programnya…

       

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 )

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: