Anda di halaman 1dari 10

Nama : kiki anwar

Nim : 216202015
Kelas : TK 5C
Job 2. Timer dan Counter (2)

Tujuan :
1. Mahasiswa memahami kerja AVR timer pada mode CTC.
2. Mahasiswa dapat mengkonfigurasi AVR timer pada mode CTC dengan Interupt atau dengan
Polling software.
3. Mahasiswa dapat membangkitkan berbagai tundaan dengan AVR timer pada mode CTC.

Dasar teori :
Mode Operasi CTC

Pada mode CTC (Clear Timer on Compare Match), untuk Timer/Counter 0 (TC0) bit WGM02:0 = 2.
Register OCR0A digunakan untuk memanipulasi resolusi register pencacah. Pada mode ini register
pencacah akan kembali ke ‘0’ saat nilainya telah mencapai nilai OCR0A. atau dengan kata lain regiter
OCR0A digunakan untuk menentukan batas maximum (TOP) pencacahan, inilah yang dimaksud resolusi
timer. Pada mode ini sangat baik untuk mengendalikan frekuensi output signal.

Gambar 2.1 CTC Mode, Timing Diagram

Dari timing diagram pada gambar 2.1 dapat dilihat bahwa nilai pencacah (TCNTn) akan terus bertambah
hingga nilai antara pencacah dengan OCRnA sama, maka pencacah akan kembali menjadi ‘0’.

Interrupt dapat dibangkitkan setiap pencacah mencapai nilai maximum dengan menggunakan OCF0A flag.
Jika interrupt diaktifkan, program interrupt handler dapat digunakan untuk mengupdate nilai TOP. Namun
perlu diingat, mengapdate TOP menjadi nilai yang mendekati ‘0’ (BOTTOM) saat counter berjalandengan
tidak ada atau nilai prescaler rendah harus dilakukan dengan hati-hati karena mode CTC tidak memiliki
fitur double buffering. Jika nilai update lebih kecil dari nilai pencacah saat itu, maka timer dalam kondisi
kesalahan pembandingan. Dalam kondisi ini pencacah akan melanjutkan cacahannya hingga
mencapai nilai maximum sesuai dengan lebar data pencacah dan kembali ke ‘0’ kemudian pencacahan
dimulai kembali hingga nilainya sama dengan OCR0A yang baru.

Untuk menghasilkan gelombang output pada CTC mode, dapat digunakan output OC0A dengan terlebih
dahulu mengaktifkan bit logika level yaitu pada bit Compare Output Mode (COM0A1:0 = 1). Perlu diingat
gelombang ini tidak akan terlihat selama PORT yang terkoneksi dengan pin OC0A tidak dikonfigurasi
ƒ
sebagai Output. Gelombang hasil dari mode ini memiliki frekuensi maximum, yaitu : ƒ0𝐶0 = 𝑐𝑙k_𝐼0/2 selama
OCR0A bernilai ‘0’. Untuk nilai frekuensi yang lain dapat didefinisikan dengan persamaan berikut ini :

ƒ𝑐𝑙k_𝐼/0
ƒ0𝐶𝑛𝑥 =
2. 𝑁. (1 + 𝑂𝐶𝑅𝑛𝑥)

Dimana N adalah refresentasi dari factor prescaler (1,8,64,256 atau 1024).

Bahan dan Alat:


1. PC/Labtop dengan software ATMEL Studio dan proteus.

Langkah praktikum:
A. CTC Mode Timer
1. Buat rangkaian mikrokontroller seperti sebagai berikut lakukan pengaturan pada ‘CKSEL
Fuse’ dengan nilai ‘1110’ dan ‘Clock Frequency’ dengan nilai 16MHz :
2. Buat project pada applikasi ATMEL STUDIO dengan nama job2a, dan tambahkan seperti
program berikut, download program ke mikrokontroller, dan amati hasilnya. Layar osiloskop
#include <avr/io.h>

#define LEDONBOARD_PORT PORTB


#define LEDONBOARD_PIN
#define LEDONBOARD_DIR DDRB

int main(void)

// I/O
LEDONBOARD_DIR |= (1<<LEDONBOARD_PIN);
// Timer 0
TCCR0A |= (1<<WGM01); // Mode CTC
TCCR0B |= (1<<CS01); // Prescaling Factor
OCR0A = 0x10; // TOP Value
while (1)

if(TIFR0 & (1<<OCF0A)){


TIFR0 |= (1<<OCF0A);
LEDONBOARD_PORT ^= (1<<LEDONBOARD_PIN);

3. Amati signal yang terbentuk pada PORTB.7,


4. Amati kembali signal yang terbentuk dengan menggunakan variasi nilai pada Register
OCR0A (8-bit)
5. Gunakan fasilitas debugging pada Atmel Studio untuk memahami proses kerja, dan amati
perubahan pada register – register nya
6. Capture signal pada PORTB.7 untuk semua percobaan sebagai data untuk pelaporan.

B. CTC mode dengan Interupt


1. Dengan menggunakan rangkaian yang sama dengan langkah A.
2. Buat project pada applikasi ATMEL STUDIO dengan nama job2b, dan tambahkan seperti
program berikut, download program ke mikrokontroller, dan amati hasilnya. Layar osiloskop
#include <avr/io.h>
#include <avr/interrupt.h>

#define LEDONBOARD_PORT PORTB


#define LEDONBOARD_PIN
#define LEDONBOARD_DIR DDRB

ISR(TIMER0_COMPA_vect)

LEDONBOARD_PORT ^= (1<<LEDONBOARD_PIN);

int main(void)

// I/O
LEDONBOARD_DIR |= (1<<LEDONBOARD_PIN);
// Timer 0
TCCR0A |= (1<<WGM01);
TCCR0B |= (1<<CS01);
TIMSK0 |= (1<<OCIE0A);
OCR0A = 0x10;
sei();

while (1)

3. Amati signal yang terbentuk pada PORTB.7,


4. Amati kembali signal yang terbentuk dengan menggunakan variasi nilai pada Register
OCR0A (8-bit)
5. Gunakan fasilitas debugging pada Atmel Studio untuk memahami proses kerja, dan amati
perubahan pada register – register nya. Tambahkan perintah ‘PORTD = ~PORTD;’ pada
looping while(1) untuk mempermudah pengamatan.
6. Capture signal pada PORTB.7 untuk semua percobaan sebagai data untuk pelaporan.

C. Waveform Generator CTC mode


1. Dengan menggunakan rangkaian yang sama dengan langkah A.
2. Buat project pada applikasi ATMEL STUDIO dengan nama job2c, dan tambahkan seperti
program berikut, download program ke mikrokontroller, dan amati hasilnya. Layar osiloskop
#include <avr/io.h>
#include <avr/interrupt.h>

#define LEDONBOARD_PORT PORTB


#define LEDONBOARD_PIN
#define LEDONBOARD_DIR DDRB

int main(void)

// I/O
LEDONBOARD_DIR |= (1<<LEDONBOARD_PIN);
// Timer 0
TCCR0A |= (1<<COM0A0)|(1<<WGM01);
TCCR0B |= (1<<CS01);
OCR0A = 0xF0;

while (1)

3. Amati signal yang terbentuk pada PORTB.7,


4. Amati kembali signal yang terbentuk dengan menggunakan variasi nilai pada Register
OCR0A (8-bit)
5. Gunakan fasilitas debugging pada Atmel Studio untuk memahami proses kerja, dan amati
perubahan pada register – register nya. Tambahkan perintah ‘PORTD = ~PORTD;’ pada
looping while(1) untuk mempermudah pengamatan.
6. Capture signal pada PORTB.7 untuk semua percobaan sebagai data untuk pelaporan.

Pertanyaan dan tugas


1. Jelaskan jelaskan hasil pengamatan anda dari hasil percobaan A.
2. Jelaskan hasil pengamatan anda dari hasil percobaan B.
3. Pada percobaan A, apa yang terjadi jika intruksi ‘ TIFR0 |= (1<<OCF0A);’ dihapus? Dan
mengapa intruksi ini diperlukan.
4. Mengapa pada percobaan B, digunakan fungsi interrupt ‘ ISR(TIMER0_COMPA_vect)’.
5. Jelaskan pengaruh perubahan register OCR0A, terhadap waktu yang dibangkitkan.
6. Pada percobaan C, bagaimanakah proses terbentuknya waveform output.
7. Pada percobaan C, buatlah program untuk membangkitkan waveform dengan frekuensi sebesar
2KHz, dan jelaskan bagaimana hal tersebut dapat terjadi.
JAWABAN :

1.
 Pengaturan CKSEL Fuse: CKSEL fuse dengan nilai '1110' menunjukkan bahwa mikrokontroller
akan menggunakan sumber clock internal dengan frekuensi sekitar 16MHz. Ini berarti
mikrokontroller akan mengoperasikan programnya dengan clock internal 16MHz.
 Program ATMEL STUDIO: Ini adalah kode program dalam bahasa pemrograman C yang
dikembangkan di ATMEL STUDIO. Program ini mengatur pin PORTB.7 sebagai output dan
menggunakan timer 0 dengan mode CTC (Clear Timer on Compare Match) untuk mengatur waktu
blink LED.
 Pemantauan Signal pada PORTB.7: Pada PORTB.7, Anda akan melihat sinyal keluaran yang
berkedip sesuai dengan konfigurasi timer dan kode program yang ditunjukkan di atas.
 Variasi Nilai pada Register OCR0A: Nilai dalam register OCR0A adalah nilai ambang atas (TOP)
untuk timer 0 dalam mode CTC. Dengan variasi nilai pada register OCR0A (8-bit), Anda dapat
mengatur periode berkedipnya LED yang dihubungkan ke PORTB.7.
 Fasilitas Debugging di Atmel Studio: Anda dapat menggunakan fasilitas debugging di Atmel
Studio untuk memahami proses kerja program, melihat perubahan pada registermikrokontroller,
dan menganalisis eksekusi program langkah demi langkah. Ini membantu dalam pemecahan
masalah dan pemahaman yang lebih baik tentang bagaimana program bekerja.
 Capture Signal pada PORTB.7: Anda disarankan untuk menangkap sinyal pada PORTB.7 untuk
semua percobaan sebagai data untuk pelaporan. Anda dapat menggunakan osiloskop atau alat
pengukuran lainnya untuk merekam sinyal keluaran dan menganalisisnya dalam pelaporan Anda.

2.
 Pengaturan Program: Program yang Anda sebutkan dalam ATMEL STUDIO mengubah
mode operasi menjadi mode pengaturan pembanding (CTC) menggunakan Timer 0. Timer
0 akan menghasilkan interupsi saat mencapai nilai yang disetel dalam register OCR0A,
yang kemudian akan mengubah status pin LEDONBOARD_PORT (PORTB.7) dengan
menggantikan nilainya.

 Sinyal di PORTB.7: Dengan program ini, Anda akan melihat sinyal pada PORTB.7 yang
berkedip sesuai dengan konfigurasi timer dan kode program. Sinyal ini akan berubah
sesuai dengan periode yang ditetapkan oleh nilai OCR0A dan mengikuti pola toggle on-
off pada setiap perbandingan.

 Variasi Nilai pada Register OCR0A (8-bit): Anda dapat mengganti nilai pada register
OCR0A untuk mengubah periode berkedip LED. Nilai OCR0A yang lebih kecil akan
menghasilkan berkedip yang lebih cepat, sedangkan nilai yang lebih besar akan
menghasilkan berkedip yang lebih lambat.

 Fasilitas Debugging di Atmel Studio: Anda dapat menggunakan fasilitas debugging di


Atmel Studio untuk memahami proses kerja program, melihat perubahan pada register
mikrokontroller, dan menganalisis eksekusi program langkah demi langkah.
Menambahkan perintah 'PORTD = ~PORTD;' pada looping while(1) akan membuat
perubahan yang dapat diamati pada PORTD yang juga dapat membantu memahami aliran
eksekusi program.

 Capture Signal pada PORTB.7: Anda disarankan untuk menangkap sinyal pada PORTB.7
untuk semua percobaan sebagai data untuk pelaporan. Dengan merekam sinyal, Anda
dapat melakukan analisis lebih lanjut di luar percobaan dan dokumentasikan hasil
pengamatan dengan baik.

3.
 Ketika Timer 0 mencapai nilai yang ditentukan dalam register OCR0A (pada mode operasi
CTC), bit OCF0A akan tetap ter-set (1) tanpa diatur ulang, bahkan setelah interupsi yang
sesuai telah dihandle. Ini berarti bahwa interupsi akan tetap terpicu berulang kali, bahkan
jika Anda tidak mengatur ulang bit OCF0A secara manual.

 Hal ini akan menyebabkan fungsi ISR(TIMER0_COMPA_vect) yang ada pada program
Anda terus-menerus dieksekusi tanpa henti, dan LEDONBOARD_PORT (PORTB.7)
akan terus berubah antara on dan off tanpa kendali yang jelas.

Instruksi 'TIFR0 |= (1<<OCF0A);' digunakan untuk mengatur ulang bit OCF0A sehingga
setelah interupsi Timer 0 terpicu (ketika mencapai nilai OCR0A), bit OCF0A akan diatur
ulang (dijadikan 0) untuk mengindikasikan bahwa interupsi telah ditangani. Dengan
menghapus instruksi ini, program Anda akan menjadi tidak terkendali karena interupsi
Timer 0 akan tetap terpicu berulang kali tanpa perubahan keadaan bit OCF0A.

4. 'ISR(TIMER0_COMPA_vect)' karena tujuan utama dari penggunaan interrupt adalah


untuk merespons peristiwa tertentu secara asinkronus tanpa harus secara terus-menerus
memeriksa keadaan perangkat keras. Fungsi interrupt dalam konteks ini digunakan untuk
merespons perbandingan yang terjadi pada Timer 0 ketika mencapai nilai yang ditentukan
dalam register OCR0A.
Dengan menggunakan fungsi interrupt 'ISR(TIMER0_COMPA_vect)', Anda
memungkinkan program Anda untuk merespons perbandingan timer secara efisien, akurat,
dan dalam waktu nyata tanpa membebani CPU secara berlebihan.

5. Perubahan nilai register OCR0A (Output Compare Register 0A) akan mempengaruhi waktu
yang dibangkitkan oleh Timer 0 dalam mode CTC (Clear Timer on Compare Match).
Register OCR0A digunakan untuk menentukan nilai ambang atas (TOP) di mana Timer 0
akan menghasilkan perbandingan.
Dengan kata lain, perubahan nilai dalam register OCR0A akan mengontrol periode
berkedip LED pada pin PORTB.7. Nilai OCR0A yang lebih rendah akan menghasilkan
berkedip yang lebih cepat, sementara nilai OCR0A yang lebih tinggi akan menghasilkan
berkedip yang lebih lambat. Ini memungkinkan Anda untuk mengatur frekuensi atau
periode berkedip LED sesuai dengan kebutuhan aplikasi Anda.

6.
 Pengaturan Awal:
Anda menggunakan rangkaian yang sama dengan langkah pertama.
Program yang telah Anda berikan telah mengatur beberapa register dalam
mikrokontroler ATMega, termasuk konfigurasi Timer 0 untuk menghasilkan sinyal
output pada PORTB.7.
 Pengaturan Timer 0:
Timer 0 dikonfigurasi untuk menghasilkan gelombang PWM (Pulse Width
Modulation) dengan mode operasi yang sesuai.
Anda mengatur prescaler dengan TCCR0B |= (1 << CS01), sehingga timer akan bekerja
dengan faktor pembagi 8 dari clock dasar.
Anda mengatur register OCR0A = 0xF0 untuk menentukan nilai ambang atas (TOP)
yang digunakan dalam mode Fast PWM. Nilai OCR0A ini akan mempengaruhi lebar
pulsa dan periode gelombang yang dihasilkan.
 Amati Signal pada PORTB.7:
Dalam kondisi ini, Anda akan melihat sinyal PWM yang dihasilkan pada pin PORTB.7.
Gelombang PWM memiliki tingkat on-off yang sesuai dengan pengaturan register
OCR0A dan prescaler.
Nilai OCR0A = 0xF0 akan mempengaruhi lebar pulsa dan periode gelombang, dan
dengan prescaler 8, akan menghasilkan gelombang PWM dengan periode dan lebar
pulsa tertentu.
 Variasi Nilai pada Register OCR0A (8-bit):
Mengubah nilai OCR0A akan mempengaruhi periode dan lebar pulsa gelombang
PWM.
Nilai OCR0A yang lebih rendah akan menghasilkan periode yang lebih pendek dan
lebar pulsa yang lebih sempit.
Nilai OCR0A yang lebih tinggi akan menghasilkan periode yang lebih panjang dan
lebar pulsa yang lebih lebar.
 Fasilitas Debugging di Atmel Studio:
Anda dapat menggunakan fasilitas debugging di Atmel Studio untuk melihat
bagaimana perubahan nilai register dan konfigurasi mempengaruhi gelombang PWM
yang dihasilkan.
Menambahkan perintah 'PORTD = ~PORTD;' pada loop while(1) akan memungkinkan
Anda memantau perubahan PORTD secara visual untuk memahami bagaimana kode
program berinteraksi dengan gelombang PWM.
 Capture Signal pada PORTB.7:
Anda disarankan untuk menangkap sinyal pada PORTB.7 untuk semua percobaan
sebagai data untuk pelaporan, sehingga Anda dapat menganalisis karakteristik
gelombang PWM yang dihasilkan pada berbagai nilai OCR0A.
7. Anda perlu mengatur Timer 0 dengan prescaler yang sesuai dan nilai OCR0A yang sesuai.
Untuk mencapai frekuensi 2 KHz, langkah-langkah berikut dapat diikuti:

 Pastikan bahwa Anda telah mengatur CKSEL Fuse dan 'clock frequency' pada
mikrokontroler dengan nilai yang benar. Dalam contoh ini, kita akan menggunakan
clock internal 16MHz yang setara dengan 16.000.000 Hz.

 Hitung nilai yang diperlukan untuk periode gelombang 2 KHz. Frekuensi adalah
kebalikan dari periode, jadi:
Frekuensi = 2 KHz = 2000 Hz
Periode = 1 / Frekuensi = 1 / 2000 = 0.0005 detik = 500 μs
 Karena Timer 0 beroperasi dengan prescaler 8, kita perlu menghitung nilai OCR0A
yang diperlukan untuk mencapai periode gelombang 500 μs. Prescaler 8 berarti bahwa
setiap 'tick' dari timer akan membutuhkan 8 siklus clock.
Nilai OCR0A = (Periode / Prescaler) - 1
Nilai OCR0A = (500 μs / (1/16MHz)) / 8 - 1
Nilai OCR0A = (0.0005 / (1/16000000)) / 8 - 1
Nilai OCR0A = (0.0005 / 125000) - 1
Nilai OCR0A = 4000 - 1
Nilai OCR0A = 3999
 Selanjutnya, Anda perlu mengatur Timer 0 dengan nilai OCR0A yang telah dihitung
sebelumnya:
#include <avr/io.h>

#define LEDONBOARD_PORT PORTB


#define LEDONBOARD_PIN 7
#define LEDONBOARD_DIR DDRB

int main(void)
{
// I/O
LEDONBOARD_DIR |= (1 << LEDONBOARD_PIN);

// Timer 0
TCCR0A |= (1 << COM0A0) | (1 << WGM01); // Fast PWM mode
TCCR0B |= (1 << CS01); // Prescaler 8
OCR0A = 3999; // Set OCR0A to achieve 2 KHz frequency

while (1)
{

}
}
Dengan program ini, Anda akan menghasilkan gelombang PWM dengan frekuensi
sebesar 2 KHz pada pin PORTB.7. Nilai OCR0A yang telah diatur sesuai dengan
perhitungan yang dilakukan untuk mencapai frekuensi yang diinginkan.

Anda mungkin juga menyukai