Anda di halaman 1dari 21

MAKALAH MIKROKONTROLER

PEMROGRAMAN TIMER/COUNTER,
FAST PWM, & PHASE CORRECT PWM

Oleh:

BIAN IRIANTI (1531110058)

PROGRAM STUDI TEKNIK ELEKTRONIKA

JURUSAN TEKNIK ELEKTRO

POLITEKNIK NEGERI MALANG

2017
BAB I

PENDAHULUAN

ATmega8535 merupakan salah satu mikrokontroler buatan Atmel yang memiliki


banyak kegunaan. Harga mikrokontroler ini tergolong murah saat ini jika dilihat dari
fasilitas yang dimilikinya. ATmega8535 memiliki empat port yang dapat digunakan
untuk banyak masukan atau keluaran, memiliki ADC, Timer dan fasilitas lainya.
Keuntungan lain mikrokontroler ini adalah cara memrogramnya juga mudah karena
tidak memerlukandownloader yang sangat merepotkan seperti mikrokontroler generasi
sebelumnya karena dapat diprogram menggunakan sistem minimalnya.

Pada ATmega8535 terdapat berbagai fitur salah satunya adalah Timer /Counter.
sesuai dengan namanya Timer yang apabila diartikan menurut bahasa adalah Waktu.
Timer itu sendiri merupakan fitur yang telah tertanam di mikrokontroler AVR yang
memiliki fungsi terhadap waktu.Timer pada mikrokontroler AVR ini sangat erat
kaitannya dengan Counter. Fungsi pewaktu yang dimaksud adalah penentuan kapan
program tersebut dijalankan, adapun fungsi timer yang lainnya adalah PWM, ADC, dan
Oscillator. Prinsip kerja timer dengan cara membagi frekuensi (prescaler) pada clock
yang terdapat pada mikrokontroler sehingga timer dapat berjalan sesuai dengan
frekuensi yang di kehendaki.Timer sendiri merupakan fungsi waktu yang sumber
clocknya berasal dari clock internal.

Salah satu contoh penggunaan fungsi timer yaitu pada jam digital yang sumber
clocknya bisa menggunakan crystal oscillator dan contoh penggunaan counter pada
penghitung barang pada konveyor yang sumber clocknya berasal dari sensor yang
mendeteksi barang tersebut.

Pada mikrokontroler ATmega8535 memiliki 3 buah timer yaitu timer 0 (8bit),


timer1 (16bit), dan timer 2 (8bit).

Pada makalah kali ini saya akan membahas tentang bagaimana cara
memprogram timer/counter pada ATmega 8535 menggunakan AVR.
BAB II
PEMBAHASAN
A. TIMER

Kita menggunakan perhitungan timer yang paling sederhana setiap


hari dan dapat ditemukan di pergelangan tangan Anda. Jam sederhana akan
mengitung
Detik, menit dan jam berlalu pada hari. AVR timer melakukan pekerjaan yang
sama, mengukur interval waktu yang diberikan.
Penghitung AVR dalam istilah yang paling sederhana adalah
register. Timer umumnya memiliki resolusi 8 atau 16 bit. Jadi a 8 bit timer
mampu menghitung nilai dalam 0-255. Register ini nilainya dapat meningkat /
menurun secara otomatis pada tingkat yang telah ditentukan (diatur oleh
Pengguna). Pengoperasian ini tidak memerlukan intervensi CPU.

Penghitung timer pada AVR sangat berguna saat mereka menjalankan


asynchronous ke program utama AVR. Timer merupakan rangkaian berbeda
yang terpisah dari AVR dan dapat dijalankan secara independent atau terpisah
dari program utama.

B. INTERRUPT
Sebelum belajar tentang timer Anda perlu mengetahui konsep interrupt
karena timer utamanya berinteraksi dengan CPU melalui interrupts. Konsep
interupsi mengacu pada mikrokontroler mirip dengan konsep interupsi sehari-
hari kita: misalkan anda membaca tutorial ini dan tiba-tiba ponsel Anda
berbunyi yang Anda lakukan adalah Anda berhenti membaca sebentar dan
menjawab panggilan telepon, dan kemudian melanjutkan membaca dari
tempat kamu meninggalkannya Ini adalah apa yang mengganggu dalam
MCU. Selagi MCU sedang menjalankan sebuah program, jika ada sesuatu
yang perlu mendapat perhatian segera, sebuah interupsi akan menyela
eksekusi program saat ini dibiarkan pada waktu itu dan program interupsi
tersebut Ditangani. Setelah itu, eksekusi program berlanjut seperti biasa dari
titik di mana itu berhenti. Timer mempunyai prinsip kerja independen dari
CPU pada frekuensi tertentu, dan berinteraksi dengan CPU dengan
mengeluarkan interrupts.

Ada dua jenis interrupts:

1. OVERFLOW INTERRUPT
Overflow interrupt dipicu setiap kali register timer overvlow,
yaitu mencapai nilai maksimum (255atau,dalam heksadesimal, FFh).

Untuk menggunakan overflow interrupt, Anda harus terlebih


dahulu menentukan frekuensi clock Anda. Kemudian periksa
Checkbox tertulis "overflow interrupt" yang muncul di tab Timer di
CodeWizard AVR (Catatan:
Bagian "timer value" dapat digunakan untuk mengatur nilai awal
timer. (Secara default, itu diatur ke 0). Sekarang Saat Anda membuat
file Anda, Anda akan menemukan bahwa sebuah fungsi muncul dalam
kode:
.
.
.
.
#include <mega16.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr (void)
{
// Tempatkan kode Anda di sini
}
// Deklarasikan variabel global Anda di sini
.
.
.
.
Sekarang Anda dapat menempatkan kode di sini yang dieksekusi
setiap kali sebuah overflow mengganggu dihasilkan.
Interupsi ini dapat digunakan untuk mengukur interval waktu
lebih besar dari 1 siklus. Misalnya, mari kita misalkan sebuah LED
dihubungkan pada pin 0 dari Port A dan Anda ingin mengedipkan
pada frekuensi 0,5 Hz menggunakan Overflow interrupt Karena
frekuensi sistem 8 Mhz, Anda dapat mengatur kecepatan clock yang
sesuai Katakanlah , F CPU / 1024 (lihat "Prescalar" di bawah) dan
kemudian lakukan sebagai berikut:

Int count = 0;
interrupt [TIM0_OVF] void timer0_ovf_isr (void)
{
// Kenaikan variabel
count ++;
Jika (count == 61 )
{
PORTA.0 = ~ PORTA.0; // Balikkan Nilai PORTA
count = 0 ;
}
}

Fungsi ini akan menambahkan variabel "count" setiap kali


overflow interrupt dipanggil dan bila waktu yang telah ditentukan
sudah sesuai, PORTA akan berubah sesuai keadaan sebelumya.

2. COMPARE MATCH INTERRUT

Compare Match Interrupt dikeluarkan/ dihasilkan oleh timer


setiap kali nilai timer menjadi sama dengan Nilai prediktif
tertentu Nilai yang telah ditentukan ini disimpan dalam register yang
dikenal sebagai Output Compare Register.
Compare Match Interrupt diperlukan pada mode CTC, Fast-
PWM, dan Phase Correct PWM pada sebuat Timer.

Agar bisa menggunakan compare match interrupt, centang checkbox


yang tertulis "compare match interrupt" Yang muncul di tab Timer di
CodeVision Wizard. Tetapkan nilai OCR di bagian Compare Value
dalam bilangan heksadesimal. Sekarang ketika Anda membuat file
Anda, Anda akan menemukan sebuah fungsi
Muncul dalam kode:
.
.
.
.
#include <mega16.h>
// Timer 0 output membandingkan rutinitas layanan interupsi
interrupt [TIM0_COMP] void timer0_comp_isr (void)
{
// Tempatkan kode Anda di sini
}
// Deklarasikan variabel global Anda di sini
.
.
.
.
Sekarang Anda dapat menempatkan kode yang dieksekusi setiap kali
terjadi penggabungan compare interrupt, seperti Ditampilkan:

C. BAGAIMANA MENGGUNAKAN TIMER?


Karena Timer bekerja secara independen dari CPU maka bisa
digunakan untuk mengukur waktu secara akurat. Timer pada kondisi tertentu
membutuhkan beberapa tindakan secara otomatis atau menginformasikan
CPU. Seperti yang kita tahu timer adalah 8 bit Register yang terus
meningkatkan nilainya, jadi salah satu kondisi dasarnya adalah situasi saat
timer register OVERFLOWS yaitu telah menghitung sampai nilai
maksimumnya (255 untuk 8 timer BIT) dan kembali ke 0. Dalam situasi ini
timer dapat mengeluarkan interupsi dan Anda harus menulis Interrupt Service
Routine (ISR) untuk menanganinya. Ada tiga timer berbeda yang tersedia di
Atmega 8535 dan semua timer bekerja dengan cara yang hampir sama
diantaranya TIMER0, TIMER1 dan TIMER2.

D. PRESCALAR
Prescalar adalah mekanisme untuk menghasilkan Clock untuk timer
dengan clock CPU. Setiap CPU memiliki Sumber clock dan frekuensi sumber
ini menentukan tingkat kecepatan di mana instruksi dieksekusi oleh prosesor.
Atmega memiliki clock beberapa frekuensi seperti 1 MHz, 8 MHz, 12 MHz,
16 MHz (max).
Prescalar digunakan untuk membagi frekuensi clock ini dan menghasilkan
sebuah clock untuk TIMER. Prescalar dapat diatur untuk menghasilkan jenis
clock berikut:

Tidak ada Jam (Timer stop)


Tidak ada prescaling (frekuensi clock = frekuensi CPU)
F CPU / 8
F CPU / 64
F CPU / 256
F CPU / 1024
Jam eksternal, bagaimanapun, jarang digunakan.

E. MODEL TIMER
Timer biasanya digunakan dalam salah satu mode berikut:
Normal
CTC
FastPWM
PhaseCorrectPWM

1. MODE NORMAL
Timer yang berjalan dalam mode normal akan menghitung naik
hingga nilainya maksimal. Saat sudah sampai nilai maksimum, timer
akan Overflow Interrupt dan mengatur ulang nilai timer ke aslinya
nilai.

Dalam kasus di atas, Anda dapat melihat bahwa jangka waktu adalah
256 kali periode waktu clock. 255 siklus clock diperlukan untuk
mencapai nilai maksimum dan satu siklus clock untuk membersihkan
nilai timer.

Jadi, f timer = f clock / 256


2. CTC MODE
Di sini kita akan melihat bagaimana menggunakan timer dalam
mode compare. Dalam mode normal, kita mengatur clock
Timer menggunakan prescalar dan membiarkan timer berjalan. Saat
mencapai overflow, kami menyiapkan interupsi menangani
overflow. Meski sederhana, mode ini memiliki keterbatasan. Kami
terbatas pada set yang sangat kecil
Dari nilai frekuensi untuk timer. Keterbatasan ini diatasi dengan mode
compare.
Compare mode menggunakan register yang dikenal sebagai
Output Compare Register yang menyimpan sebuah nilai dari pilihan
kita. Timer terus membandingkan nilai saat ini dengan nilai pada
register dan bila kedua nilai cocok, kejadian berikut dapat
dikonfigurasi untuk terjadi:

1. Output terkait Bandingkan pin yang bisa dibuat set (diletakkan


ke tinggi), bersihkan (diletakkan rendah) atau toggle
secara otomatis. Mode ini sangat ideal untuk menghasilkan
gelombang persegi dengan frekuensi yang berbeda.
2. Ini dapat digunakan untuk menghasilkan sinyal PWM yang
digunakan untuk mengimplementasikan DAC digital to analog
converter
Yang bisa digunakan untuk mengendalikan kecepatan motor DC.
3. Cukup generate dan interrupt dan call handler.

Pada compare match, timer mengatur ulang dirinya menjadi 0.


Ini disebut CTC - Clear Timer on Compare Match.

Dalam kasus ini, misalkan kita mengatur program untuk mengganti


pin output. Dalam hal ini, output pin akan
Tetap tinggi untuk jangka waktu satu timer dan akan tetap rendah
untuk jangka waktu yang lain.

Jadi, t out = 2 xt timer


Dari kasus normal, kita bisa menggambar analogi untuk mengetahui
t .timer
T timer = t clock x (OCR + 1)
Jadi, akhirnya, kita memiliki frekuensi sebagai,
F out = f clock / (2 x (OCR + 1))

F. PULSE WIDE MODULATION (PWM)


Perangkat digital seperti mikrokontroler dapat dengan mudah bekerja
dengan input dan output yang hanya memiliki dua pernyataan hidup atau
mati Jadi Anda dapat dengan mudah menggunakannya untuk mengendalikan
keadaan LED atau mematikannya. Demikian juga dapat menggunakannya
untuk menyalakan "on a" atau "off "perangkat listrik apapun dengan
menggunakan driver yang tepat (transistor, triac, relay, Dll). Tapi terkadang
Anda memerlukan lebih dari sekedar kontrol "on" & "off" atas
perangkat. Misalnya, jika Anda ingin mengontrol kecerahan lampu LED (atau
lampu) apapun, atau kecepatan motor DC, oleh karena itu digital Sinyal on /
off tidak akan cukup. Situasi ini dapat ditangani dengan teknik yang
disebut PWM (Pulse Wide Modulation). PWM adalah teknik yang
digunakan untuk menghasilkan sinyal analog dari perangkat digital seperti
MCU.

Mikrokontroler hanya bisa menghasilkan dua level pada garis


outputnya, HIGH = 5V dan LOW = 0V. Tapi apa yang terjadi jika kita ingin
menghasilkan 2.5V atau 3.1V atau tegangan antara 0-5 volt sebagai
output? Untuk ini persyaratan, daripada menghasilkan output tegangan DC
konstan kita menghasilkan gelombang persegi, yang mana Memiliki tinggi =
5V dan rendah = 0V.

Istilah yang disebut Duty Cycle didefinisikan sebagai

D = t on / t total x 100%
Jadi Anda bisa melihat bahwa duty cycle dalam kasus di atas adalah
50%. Jika frekuensi gelombang seperti itu cukup tinggi (katakanlah 500 Hz)
maka output yang Anda dapatkan adalah setengah dari 5V yaitu 2,5 V. Jadi
jika output ini adalah
Terhubung ke motor (dengan menggunakan driver yang sesuai) akan berjalan
pada kecepatan 50% dari kecepatan penuh pada 5V. ITeknik PWM ini
digunakan untuk menghasilkan tegangan antara dua keadaan ekstrem
(misalnya Antara 0-12volt). Caranya adalah dengan memvariasikan siklus
antara 0 sampai 100% dan mendapatkan persentase yang sama dari tegangan
input ke output.
Perhatikan contoh berikut ini:

Disini duty cycle adalah 75%. Jadi output tegangan analog yang setara adalah
3.75V.

Disini siklus tugasnya 12,5%. Jadi output tegangan analog adalah 0.625V.

GENERASI SIGNAL PWM MENGGUNAKAN AVR TIMERS


Dalam mikrokontroler AVR, sinyal PWM dihasilkan oleh timer. Ada
dua metode yang dapat menghasilkan PWM dari timer:
1. Fast PWM
2. Phase Correct PWM

Kita akan menggunakan timer yang paling sederhana, TIMER0 untuk


generasi PWM. Jadi kita memiliki hitungan counter 8 bit dari 0 sampai
255 dan kemudian reset ke 0 dan seterusnya. Hal ini dapat ditunjukkan
pada grafik sebagai berikut:
Periode tergantung pada pengaturan PRESCALAR. Sekarang untuk
generasi PWM dari hitungan ini
Urutan OCR0 (Output Compare Register Zero) digunakan (Zero karena
untuk TIMER0)
Kita dapat menyimpan nilai antara 0-255 di OCR0, katakanlah kita
Simpan 64 di OCR0 maka akan muncul grafik sebagai berikut (garis
merah).

Bila TIMER0 dikonfigurasi pada Fast PWM mode, maka pada saat
timer menghitung naik , berapapun
Nilai counter apabila sesuai dengan nilai dalam register OCR0, PIN
output akan berlogika rendah (0) dan ketika menghitung dimulai lagi
dari 0 PIN output akan SET lagi ( VCC). Ini ditunjukkan di Gambar 3.
PIN ini diberi nama OC0 dan Anda bisa menemukannya di konfigurasi
PIN ATmega32.
Anda dapat mengatur OCR0 ke nilai apapun dan mendapatkan PWM
duty cycle (OCR0 / 256). Bila Anda mengaturnya ke 0 Anda
mendapatkan 0% duty cycle saat menyetelnya ke 255 akan memberi
Anda output duty cycle 100%. Jadi dengan berbagai duty cycle Anda
bisa mendapatkan output tegangan analog dari PIN OC0.

Dalam inverting moode nilai pin OC0 hanya kebalikan dari gambar di
atas. jadi setiap nilai TIMER0 kurang dari nilai OCR0 maka pin OC0
adalah LOW selain itu akan berlogika tinggi. Anda dapat memilih
mode pembalik atau non-pembalik di bidang "Output" di CodeWizard
AVR. Mode pembalik dan non-pembalik akan memiliki siklus tugas
yang berbeda yang terkait

D inv + d non-inv = 100%


Jadi
T out = t timer = 256 xt clock
Karenanya,
F out = f clock / 256

FASE CORRECT PWM MODE


Mode ini sangat mirip dengan mode Fast PWM kecuali bila setiap kali
timer
Mencapai nilai maksimalnya, maka alih-alih membersihkan nilai timer
yang baru mulai dihitung turun.
Nilai pin matikan hanya bila nilai OCR0 cocok dengan penghitung
TIMER0.
Jadi :
T out = t timer = 2 xt clock x OCR
Karenanya,
F out = f jam / (2 x OCR)

Table perbandingan timer

Desain pembangkit sinyal frekuensi 100 Hz dengan Timer/Counter.


Gambar diatas merupakan sinyal PWM dengan amplitudo 5 volt. Dari
gambar diatas dapat diketahui pengertian dari 1 periode gelombang,
yaitu lamanya interval waktu dalam 1 panjang gelombang, gambar
diatas mempunyai periode 10 ms. sedangkan duty cycle, yaitu lamanya
pulsa high (on) selama 1 periode, terlihat bahwa lamanya duty cycle 7
ms. Biasanya duty cycle ditulis dalam satuan persentase (%). Jika dari
gambar diatas ingin mengubah duty cycle kedalam persen yaitu:
Duty cycle = (interval pulsa high dalam 1 periode/periode
gelombang)*100%
Sehingga gambar diatas mempunyai duty cycle sebesar 70%.
Jika periode suatu gelombang diketahui, maka dapat dihitung berapa
frekuensinya, menggunakan:
F=1/T
F = Frekuensi (Hz)
T = Periode (detik)
Maka frekuensi dari gambar diatasa adalah F = 1/10 ms= 100 Hz.
Untuk menghasilkan sinyal PWM pada AVR digunakan fitur timer.
AVR Atmega 8535 mempunyai 3 buah timer, tetapi disini saya akan
membahas Timer0 dan Timer1 saja yang digunakan untuk
membangkitkan sinyal PWM. Pada dasarnya Timer0 dan Timer1
mempunyai 4 buah mode untuk membangkitkan sinyal PWM. Untuk
lebih jelasnya teman-teman baca datasheet saja.
Disini saya akan membangkitkan sinyal PWM menggunakan Timer0
dan timer1 dengan menggunakan 2 buah mode saja, yaitu Phase
Correct PWM dan Fast PWM. Untuk pengertian dan penjelasan
masing-masing mode dapat dilihat didatasheet.
Output pin PWM pada Atmega8535 terdapat pada 2 buah pin yaitu
PD4 (OC1B) dan PD5 (OC1A).
Timer0
Mode Phase Correct PWM
Foc0 = Fosc/(N*512)
D = (OCR0/255)*100%
Mode Fast PWM
Foc0 = Fosc/(N*256)
D = (OCR0/255)*100%
Dimana:
Foc0 = Frekuensi output OC0
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc= Frekuensi clock kristal yang digunakan
Timer1
Mode Phase Correct PWM
Foc1a = Fosc/(2*N*(1+TOP))
Foc1b = Fosc/(2*N*(1+TOP))
D = (OCR1X/TOP)*100%
Mode Fast PWM
Foc1a = Fosc/(N*(1+TOP))
Foc1b = Fosc/(N*(1+TOP))
D = (OCR1X/TOP)*100%
Dimana:
Foc1a = Frekuensi output OC1A
Foc1b = Frekuensi output OC1B
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc = Frekuensi clock kristal yang digunakan
TOP = nilai maksimum counter (TCNT1), TOP mempunyai 3 buah
nilai untuk kedua mode tersebut yaitu 8 bit (FF), 9 bit (1FF) dan 10 bit
(3FF)
4. Nilai OCR yang harus diisi jika diinginkan sinyal tersebut
(soal no 3) mempunyai z duty cycle 75%
Sekarang saya akan membuat aplikasi membangkitkan sinyal PWM
dengan periode 20 ms dengan duty cycle 75%, menggunakan Timer1
10 Bit Mode Fast PWM.
Dengan menggunakan kristal 12 Mhz, N = 256 dan TOP = 10 bit = 3FF
= 1023
Maka akan didapat frekuensi output (Foc1x) sebesar 45,77 Hz atau jika
diubah kedalam peroide 21,8 ms 20 ms
Untuk Duty cycle:
D = (OCR1X/TOP)*100%
75% = (OCR1X/1023)*100%
OCR1X = 767 = 2FF (dalam hexa)
Untuk membangkitkan periode yang benar-benar presisi pada sinyal
PWM sangat sulit sekali karena kita hanya mampu memanipulasinya
lewat 3 parameter saja yaitu, frekuensi kristal yang kita gunakan
(tidak semua nilai frekuensi kristal ada dipasaran), skala clock atau
N (hanya mempunyai nilai 1, 8, 64, 256, 1024) dan TOP(untuk kedua
mode diatas mempunyai 3 buah nilai 8, 9 dan 10 bit). Dengan
kombinasi ketiga variabel diatas kita harus benar-benar dapat
menentukan periode output yang kita inginkan, menurut saya itu sangat
sulit sekali.
Untuk aplikasi diatas berikut adalah setting untuk CodeVision
CodeWizard AVR. Clock Value bernilai 46.875 berasal dari Fosc/N
atau 12 MHz/256.
Penjelasan diatas adalah untuk membangkitkan sinyal PWM sesuai
dengan output yang kita inginkan, sedikit sulit memang. Tetapi pada
dasarnya banyak sekali aplikasi yang menggunakan PWM tanpa harus
memperdulikan kepresisian periode output, contohnya pengaturan
motor DC. Untuk aplikasi pengaturan motor DC sangat simple sekali
programnya.
Baiklah sekarang saya akan mengimplementasikan aplikasi pengaturan
kecepatan motor DC menggunakan input yang berasal dari
potensiometer. Cara kerjanya kecepatan motor DC diatur oleh potensio
yang nilainya didapat dari pembacaan ADC. Untuk PWM nya saya
gunakan hasil dari yang diatas (Timer1 10 bit mode Fast PWM).
Berikut adalah setting untuk CodeWizard AVR dan schematicnya:
Berikut adalah listing program lengkapnya (sangat simple):
#include <mega16.h>
#include <delay.h>
int potensio;
#define ADC_VREF_TYPE 000
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=040;
// Wait for the AD conversion to complete
while ((ADCSRA & 010)==0);
ADCSRA|=010;
return ADCW;
}
void main(void)
{
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Fun
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=000;
DDRD=030;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 46.875 kHz
// Mode: Ph. correct PWM top=03FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA3;
TCCR1B=004;
TCNT1H=000;
TCNT1L=000;
ICR1H=000;
ICR1L=000;
OCR1AH=002;
OCR1AL=0xFF;
OCR1BH=000;
OCR1BL=000;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=080;
SFIOR=000;
// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=084;
while (1)
{
potensio=read_adc(0);//membaca nilai ADC potensio
OCR1A=potensio;//nilai potensio diumpan ke register PWM untuk ngatur ke
};
}

G. CONTOH PROGRAM APLIKASI TIMER


Untuk TIMER dapat kita peroleh untuk delay waktu 1 detik dengan
Timer 1 (16 bit) yaitu 65535. Mempermudah kita untuk memprogram
maka dapat diperoleh rumus sebagai berikut:

TCNT = (1 + FFh) (Ttimer x fCLK)/N


= (1 + 65535) - (1 x 4.000.000)/256
= 65535 4.000.000/256
= 65535 15625 = 49910 dengan nilai Hex = C2F6
Program
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0x0C;
TCNT1L=0xD5;
// Place your code here
if (PINC==0)
{PORTC=0xFF;}
else
{PORTC=0x00;}
}
COUNTER Untuk menentukan nilai dari counter yaitu kita harus
mengganti nilai dari TCNT0. Perhitungannya yaitu nilai maksimal dari
counter yaitu FF, sehingga misalkan kita menginginkan nilai dari
counter kita 4 yaitu dengan mengurangi nilai maksimal dengan nilai
counter yang kita inginkan:
FF 4 = FB
Jadi nilai yang harus kita masukkan pada TCNT0 adalah FB.

// Timer 0 overflow interrupt service routine


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xFB;
// Place your code here
if (PINC==0)
{PORTC=0xFF;}
else
{PORTC=0x00;}
}

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 <mega8535.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*/
}
}

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

/*===================================================

Chiptype:ATmega8535

Author:Pccontrol.wordpress.com
Clockfrequency:4.000000MHz
Memorymodel:Small
ExternalSRAMsize:0
DataStacksize:128
*****************************************************/

#include<mega8535.h>
#include<stdio.h>
//AlphanumericLCDModulefunctions
#asm
.equ__lcd_port=0x15;PORTC
#endasm
#include<lcd.h>

unsignedinthitunganMSB;
unsignedinthitunganLSB;
unsignedcharbufferCounter[15];
unsignedlonginthitungan;
//Timer0overflowinterruptserviceroutine
interrupt[TIM0_OVF]voidtimer0_ovf_isr(void)
{
//hitunganlebihdari255

hitunganMSB=hitunganMSB+1;

//Declareyourglobalvariableshere

voidmain(void)
{
//Declareyourlocalvariableshere

//Timer/Counter0initialization
//Clocksource:T0pinFallingEdge
//Mode:Normaltop=FFh
//OC0output:Disconnected
TCCR0=0x06;
TCNT0=0x00;

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

//LCDmoduleinitialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("counter:");
//Globalenableinterrupts
#asm("sei")

while(1)
{
//Placeyourcodehere
hitunganLSB=TCNT0;
hitungan=hitunganMSB+hitunganLSB;

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

http://kl301.ilearning.me/2015/05/20/timer-2/

http://dom2ngelmu.blogspot.co.id/2012/03/timer-counter-pada-
atmega8535.html#!/tcmbck

https://pccontrol.wordpress.com/2011/08/14/pengetahuan-dasar-
penggunaan-timer-counter-microcontroller-avr/

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

http://daufwidiatmoko.blogspot.co.id/2014/04/fitur-timercounter-dalam-
mikrokontroler.html

www.atmel.com/images/doc2502.pdf

embedded-old-2.pdf