Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Senin, 04 Maret 2013

Timer dan Counter Pada Microcontroller AVR


- COUNTER/TIMER , apaan sih ? 

Adalah fasilitas di microcontroller untuk melakukan counter/perhitungan tanpa perlu menambahkan code di looping main program ( auto), sehingga nilai dari counter ( BIASANYA register TCNT) dapat di olah/manfaatkan sewaktu2


- JENIS COUNTER APA AJA ?

Secara umum Counter /Timer terdiri dari:

- Timer Biasa (8 bit & 16 bit)
- Clear Timer on Compare (CTC)
- Overflow Timer
- Output Compare 
- PWM timer ( bahasan tersendiri)

Kita bahas yang paling sering digunakan timer biasa dan timer CTC.


- Counter 8 bit & 16 Bit

Jadi ingat, 8 bit itu maximum nilai yg didapat 0 - 255, sedangkan 16 bit = 0 - 65535 , jadi berbeda di range nilai Counternya.

Semisal kita pakai IC attiny2313 dengan clock default 1MHZ, jadi jika kita dapat ambil matematika sederhana :


resolusi = 1/input clock = 1/1Mhz = 1 micro second


Jika kita inisialisasi counter dengan Full Speed , clock = input frek oscillator (1 Mhz),  dan digunakan 16 bit / counter 1 TCCR1B|=(1<<CS10), maka jika kita ingin menghidupkan suatu led di PortD dalam selang 1 detik,  kita tunggu nilai Counter(TCNT1) = 1000000;

wah....kelebihan ! Ingat..nilai TCNT1 max= 65535, jadi kita perlu membagi counter dengan variabel yg lain, semisal kita pake variable a; Jadi ketika TCTN1 = 10000; Lalu reset TCTN1=0 ; a++; (ditambah), berulang seterusnya sampe nilai a= 100; maka LED di PORTD dihidupkan/toogle. Berikut scriptnya :

Code:
#include <avr/io.h> 

int main (void) 
{ 
   DDRD |= (1 << PD0); // Set LED di portD0 

   TCCR1B |= (1 << CS10); // Set up counter dengan full speed 

int a;  variable

a=0;  //nilai awal dari variable
  
 while (1) 
   { 

   if(TCNT1 == 10000) 
      { a++;
         TCNT1=0;
      }

   if(a == 100)
     { 
     PORTD ^= (1 << PD0); // Toggle the LED 
     a=0;
     }

   } 
}


- PRESCALER 

Jika di pembahasan sebelumnya, kita menggunakan variabel sebagai pembagi counter yg berlebih, AVR memberikan suatu solusi dengan melakukan pembagian clock menjadi faktor 1/8, 1/64, 1/256, dan 1/1024

Dengan Prescaler ada pembagian resolusi  ( timer penambahan counter) yang  akan menjadi berkurang :

1(full speed) = 1 micro second
1/8 = 8 micro second
1/64 = 64 us
1/256= 256 us
1/1024=1024us

Nah...kita sekarang bisa membagi clock sesuai keinginan, dan menyederhanakan perhitungan

Semisal kita ingin mendelay LED 1 detik, dengan clock 1Mhz  maka kita coba dengan  prescale 1/8,  untuk mencari 1 detik nilai TCNT1 = 125000, masih lewat, prescale 1/64 maka nilai TCNT1 = 15625 ...nahh nilainya ga lewat dari batas 16 bit (65535) ....ketemu dehh....jadi kita sederhanakan script sebelumnya menjadi :

Code:
#define F_CPU 1000000UL //clock dari avr
#include <avr/io.h> 




int main (void) 

{ 

   DDRD |= (1 << PD0); // Set LED di portD0 
   TCCR1B |= (1 << CS11); // Set up counter dengan prescale 64
   //Baca datasheet untuk mencari konfigurasi prescaler yg laen



 while (1) 

   { 



   if(TCNT1 == 15624) 
 // nilai max 1 detik, perhitungan mulai 0 maka nilai dikurangi 1 dari 15625

   {
      PORTD ^= (1 << PD0); // Toggle the LED 
     TCNT1=0;
    }



   } 

}


- CLEAR TIME ON COMPARE + INTERUPT

selanjutnya AVR memberikan failitas CTC, yaitu kita menentukan nilai maximum dari TCNT1 dan secara otomatis akan mengclear nilai TCNT1. Nilai max dari TCNT1 diberikan melalui register OCR1A

setiap kali TCNT1 = OCR1A akan terjadi trigger interupt CTC, sehingga dapat dimanfaatkan untuk mentriger suatu output. codenya akan menjadi seperti ini


Code:
#define F_CPU 1000000UL //clock dari avr
#include <avr/io.h> 
#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect) //vector interupt compare

{ 

     PORTD ^= (1 << PD0); // Toggle the LED 

}

int main (void) 

{ 

   DDRD |= (1 << PD0); // Set LED di portD0 
   
   TCCR1B |= (1 << CS11); // Set up counter dengan prescale 64
   //Baca datasheet untuk mencari konfigurasi prescaler yg laen
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode       
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
   OCR1A = 15624; // nilai atas dari TCNT1, untuk perhitungan 1 detik

sei();   //hidupkan interupt


 while (1) 

   { 

    }

}


...mudah bukan ? atau makin pusing ?

Untuk counter dengan nilai frekuensi clock / XTAL lainnya dapat menggunakan rumus matematika sederhana untuk menetukan OCR1A 


OCR1A = [(Frekuensi AVR / Prescale) / frekuensi yg diinginkan ] - 1

atau

OCR1A = [(Frekuensi AVR / Prescale) * Periode yg di inginkan ] - 1


*) catatan : nilai prescale = 1,8,64,256,1024  bukan 1/prescale , untuk mempermudah saja


SELAMAT MENCOBA
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (25) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (17) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika