Anda di halaman 1dari 15

MODUL 2 Timer, Counter, Interupt

Samuel Andrian (13213100)


Asisten: Aditya Rachman (13212143)
Tanggal Percobaan: 30/03/2015
EL3214-Praktikum Sistem Mikroprosesor

Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika


ITB
Abstrak
Empat buah tugas sederhana akan
dilakukan pada percobaan ini. Tugas
pertama
bagaimana
Mengimplementasikan
delay
dengan
timer/counter. Tuga kedua yaitu membuat
external clock sebagai counter. Tugas
ketiga yaitu membuat membuat aplikasi
interupt dengan timer/counter. Tugas
terakhir
yaitu
tugas
ke
empat
mengimplementasikan
eksternal
interupt . Bagaimanakah melakukan keempat tugas ini dan bagaimanakah keempat tugas ini di implementasikan,
semua aka di bahas pada laporan
praktikum kali ini.

Kata kunci: Timer, counter, interrupt.


1.

Pendahuluan

Gambar dan table berikut ini dikutipkan


dari datasheet ATMega 8535.

Deskripsi register Timer/Counter


(Timer/Counter 0) (Hal. 83)

Pengaturan perilaku pin OCO (untuk mode


non PWM) (hal 84)

dalam modul praktikum ini adalah sebagai


berikut:
Praktikan dapat memahami datasheet
ATMega8535.

Praktikan mampu membuat aplikasi


Timer/Counter dan Interrupt pada AVR
dengan
menggunakan
Bahasa
pemogramanan C pada Win AVR.

Praktikan mampu membuat aplikasi


External Interrupt pada AVR dengan
menggunakan bahasa pemograman C
pada WinAVR.

2. Studi Pustaka
2.1Konfigurasi timer/counter dan
interrupt

bit

Konfigurasi Mode operasi (hal 83)

Adapun beberapa tujuan yang hendak


dicapai

Pengaturan sumber clock (hal 85)

Register-register penting (hal 85)

Aplikasi WINAVR

Board Modul praktikum

Kabel downloader

Kabel port to port

Catu daya teregulasi (2 buah)


3.2Langkah kerja

3.2.1 Tugas 2A1


2.2

Konfigurasi External Input

Register-register untuk keperluan external


interrupt diuraikan pada hal. 68-70 di
datasheet ATMega8535. Di sini diberikan
kutipan-kutipannya.

1. Buat program untuk tugas 1A1


2. Download ke ATMega 8535
3. Lihat keluaran
3.2.2 Tugas 2A2
1. Modiikasi program pada tugas 1A1
2. Download ke ATMega
3. Lihat keluarannya
3.2.3 Tugas 2B1
1

Buat program untuk tugas 2B1

Download ke ATMega 8535

Lihat keluaran

3.2.4 Tugas 2B2


1. Modifikasi program untuk tugas 2B2
2. Download ke ATMega 8535
3. Lihat keluaran
Bit 7 INT1: External Interrupt Request 1
Enable
Bit 6 INT0: External Interrupt Request 0
Enable
Bit 5 INT2: External Interrupt Request 2
Enable

3.2.5 Tugas 2C1


1

Buat program untuk tugas 2C1

Download ke ATMega 8535

Lihat keluaran

3.2.6 Tugas 2C2


Bit 7 INTF1: External Interrupt Flag 1

1. Modifikasi program 2C1 untuk tugas


2C2

Bit 6 INTF0: External Interrupt Flag 0

2. Download ke ATMega 8535

Bit 5 INTF2: External Interrupt Flag 2

3. Lihat keluaran

3.

Metodologi
3.1Alat dan komponen

3.2.7 Tugas 2D1


1

Buat program untuk tugas 2D1

Download ke ATMega 8535

Lihat keluaran

sehingga OCR didapat sebesar 28800


dalam hexadecimal 0x7080.
4.2

3.2.4 Tugas 2D2


1. Modifikasi program 2D1 untuk tugas
2D2
2. Download ke ATMega 8535
3. Lihat keluaran

Tugas 2A1

Gambar 4-2a : hasil untuk tugas 2A2

start
4

Hasil dan analisis

Berikut adalah data dari setiap percobaan


dan analisisnya.

TCR 1A =0
TCR1B = 0b00001100

4.1Tugas 1A

TIMSK = (0<<TOIE1)

End

Gambar 4-1a : Hasil untuk tugas 1A1

start
Gambar 4-2b : flow-chart program utama
dan penggalan program tugas 2A1

TCR 1A =0
TCR1B = 0b00001100
TIMSK = (0<<TOIE1)

Analisis :
Hasil yang didapat hampir sama dengan
percobaan 1A1 hanya delaynya yang
dirubah
menjadi
dua
detik.
Untuk
membuat delay sebesar 2 detik maka nilai
OCR diubah dengan menggunakan rumus

End

OCR=Tyan

Gambar 4-1b : flow-chart dan penggalan


program tugas 2A1
Analisis :
Delay yang didapat sebesar 1 detik karena
sesuai rumus

OCR=Tyan

g diinginkanFCPU
prescaler

Dengan T yang di inginkan = 1 detik dan


FCPU sebesar 7372800 dan prescaler 256

g diinginkanFCPU
prescaler

Dengan T yang di inginkan = 2 detik dan


FCPU sebesar 7372800 dan prescaler 256
sehingga OCR didapat sebesar 57600
dalam hexadecimal 0xE100.
4.3Tugas 2B1

Gambar 4-3a :
1B1

Interrupt

hasil untuk percobaan

Program utama

start
End

Program utama

Interrupt

Program utama

End

flow-chart dan penggalan


program tugas 2b1
Gambar 4-3b :
Analisis :

Gambar 4-4b : flow-chart dan penggalan


program tugas 2b2
Analisis :

Hasilnya LED akan flip-flop seperti pada


gambar 4-3a dengan delay 0.5 detik.
Delay menggunakan delay eksternal
sebesar 500ms seperti gambar 4-3b.

Hasil dapat dilihat pada gambar 4.4


dengan delay yang diinginkan sebesar 3
detik maka untuk membuat delay sebesar
3 detik untuk TCNT = 123 maka OCR0 =
125.

4.4

4.5

Tugas 2B2

Tugas 2C1

Gambar 4-4a :
2B2

hasil untuk percobaan

start
Program utama

Gambar 4-5a : untuk setiap 0.1 detik


maka LED akan flipflop seperti ini

Gambar 4-5b : untuk setiap 1 detik maka


lampu akan menyala semua seperti
gambar ini

Sehingga TCNT yang didapatkan0xE3DF.

start

4.6

Tugas 2C2

Program utama

Interrupt

Program utama

Gambar 4-6a : untuk setiap 0.1 detik


maka LED akan flipflop seperti ini

Gambar 4-6b : untuk setiap 2 detik maka


lampu akan menyala semua seperti
gambar ini

End

Gambar 4-5c : flow-chart dan penggalan


program tugas 2C1

start

Analisis :
Untuk delay sebesar 0.1 detik digunakan
delay
eksternal
sebesar
100
ms.
Sedangkan untuk delay interrupt sebesar
1 detik didapatkan dengan menggunakan
rumus

Program utama

Interrupt

g
FCPU
OCR=Tyan diinginkan
prescaler

Program utama
dengan T yang diingingkan sebesar 1
detik dan prescaler 1024 dan FCPU
sebesar 727280 maka didapatkan OCR
dalam heksadesimal 0x1C20
dan TCNT didapat didapatkan dengan
rumus

TCNT =1+ FFFF OCR

End
Gambar 4-6c : flow-chart dan penggalan
program tugas 2C2

Untuk delay sebesar 0.1 detik digunakan


delay
eksternal
sebesar
100
ms.
Sedangkan untuk delay interrupt sebesar
1 detik didapatkan dengan menggunakan
rumus

Gambar 4-7b : jika IS1 ditekan LED akan


running lalu kembali lagi ke keadaan awal

start

g
FCPU
OCR=Tyan diinginkan
prescaler

Program utama

dengan T yang diingingkan sebesar 1


detik dan prescaler 1024 dan FCPU
sebesar 727280 maka didapatkan OCR
dalam heksadesimal 0x3840

Interrupt

dan TCNT didapat didapatkan dengan


rumus

Program utama

TCNT =1+ FFFF OCR


Sehingga TCNT yang didapatkan0xC7C0.
4.7

Tugas 2D1

End

Gambar 4-7a : untuk setiap 0.5 detik


maka LED akan flipflop seperti ini

Gambar 4-7c : flow-chart dan penggalan


program tugas 2D2
Analisis :
7

Delay LED sebelum ada interrupt adalah


500 ms. Interupt terjadi saat IS1 ditekan
dan delanya 250 ms dapt dilihat codenya
pada gambar 4-7c.

4.8

Tugas 2D2

Gambar 4-8a : untuk setiap 0.5 detik


maka LED akan flipflop seperti ini

Gambar 4-8b : saat ada interrupt oleh


IS1 dengan delay flipflop 0.5 detik
7

Gambar 4-8c : saat ada interrupt oleh


IS2 selama 1 detik

start
Gambar 4-8d : flow-chart dan penggalan
program tugas 2D2

Program utama

Pada percobaan ini jika tidak ada interrupt


maka LED akan flip-flop seperti gambar 48a, jika ada interrupt dari IS1maka LED
akan seperti gambar 4-8b, jika interrupt
dari IS2 maka LED akan seperti gambar 48c.

Interrupt 1/ interrupt 2

Program utama
5

End

Kesimpulan
Dari praktikum
bahwa:

ini

dapat

disimpulkan

Penjelasan
deskripsi
register
Timer/Counter 8 bit, konfigurasi mode
operasi, pengaturan perilaku pin OCO,
pengaturan sumber clock, dan registerregister untuk keperluan external
interrupt,
yang
dipakai
dalam
percobaan
ini,
terdapat
dalam
datasheet ATMega 8535.

Aplikasi timer/counter dan interrupt


dapat dilakukan pada AVR ATMega
8535 dengan mengatur nilai register
TCNT dan OCR,.

Aplikasi
external
interrupt
dapat
dilakukan pada AVR Atmega 8535

dengan
mengatur
nilai
MCUCR, GICR, dan GIFR.

register

DAFTAR PUSTAKA
[1] Mervin T. Hutabarat, Praktikum
system mikroprosesor, Laboratorium
Dasar Teknik Elektro, ITB, 2015.

Source code
------------------------2A1--------------------#include <avr/io.h>
void init_tim(void);
void Delay(void);
int main(void)
{
DDRA=0xFF;
PORTA = 0x00;
init_tim();
while(1)
{
PORTA = 0x0F;
Delay();
PORTA = 0xF0;
Delay();
}
return 0;
}
void init_tim(void)
{
//mode operasi CTC, sumber clock prescaller 256
TCCR1A = 0;
TCCR1B = 0b00001100;
//overflow interrupt disable
TIMSK = (0<<TOIE1);
}
void Delay(void)
{
//overflow interrupt enable
TIMSK|=_BV(TOIE1);//(1<<TOIE1);
//penentuan nilai awal timer
TCNT1H = 0;
TCNT1L = 0;
//penentuan nilai compare untuk delay 1 detik
OCR1AH = 0x70;
OCR1AL = 0x80;
//menunggu hingga compare match, (nilai TCNT1 = OCF1A)
loop_until_bit_is_set(TIFR,OCF1A);
//meng-nol-kan flag
TIFR|=_BV(OCF1A);

//overflow interrupt disable


TIMSK|=_BV(TOIE1);
}
--------------------------2A2-------------------------------#include <avr/io.h>
void init_tim(void);
void Delay(void);
int main(void)
{
DDRA=0xFF;
PORTA = 0x00;
init_tim();
while(1)
{
PORTA = 0x0F;
Delay();
PORTA = 0xF0;
Delay();
}
return 0;
}
void init_tim(void)
{
//mode operasi CTC, sumber clock prescaller 256
TCCR1A = 0;
TCCR1B = 0b00001100;
//overflow interrupt disable
TIMSK = (0<<TOIE1);
}
void Delay(void)
{
//overflow interrupt enable
TIMSK|=_BV(TOIE1);//(1<<TOIE1);
//penentuan nilai awal timer
TCNT1H = 0;
TCNT1L = 0;
//penentuan nilai compare untuk delay 2 detik
OCR1AH = 0xE1;
OCR1AL = 0x00;
//menunggu hingga compare match, (nilai TCNT1 = OCF1A)
loop_until_bit_is_set(TIFR,OCF1A);
//meng-nol-kan flag

TIFR|=_BV(OCF1A);
//overflow interrupt disable
TIMSK|=_BV(TOIE1);
}
-----------------------2B1---------------------------#include <avr/io.h>
#include <avr/io.h>
#define F_CPU 7372800UL // 8MHz
#include <util/delay.h>
void init_tim(void);
int main(void)
{
init_tim();
DDRA=0xFF;
while (1)
{
//penentuan nilai awal timer
TCNT0 = 123;
//penentuan nilai compare
OCR0 = 124;
//menanti compare match
while(bit_is_clear(TIFR,OCF0))
{
PORTA = 0b10101010;
}
//meng-nol-kan flag
TIFR|=_BV(OCF0);
PORTA = 0b01010101;
_delay_ms(500);
}
return 0;
}
void init_tim(void)
{
//mode operasi dan sumber clock
TCCR0=0b00000110;
//overflow interrupt disable
TIMSK=(0<<OCIE0);
}
------------------------2B2--------------------------#include <avr/io.h>
#include <avr/io.h>
#define F_CPU 7372800UL // 8MHz
#include <util/delay.h>
void init_tim(void);

int main(void)
{
init_tim();
DDRA=0xFF;
while (1)
{
//penentuan nilai awal timer
TCNT0 = 123;
//penentuan nilai compare
OCR0 = 125;
//menanti compare match
while(bit_is_clear(TIFR,OCF0))
{
PORTA = 0b10101010;
}
//meng-nol-kan flag
TIFR|=_BV(OCF0);
PORTA = 0b11111111;
Delay();
}
return 0;
}
void init_tim(void)
{
//mode operasi dan sumber clock
TCCR0=0b00000110;
//overflow interrupt disable
TIMSK=(0<<OCIE0);
}
void Delay(void)
{
//overflow interrupt enable
TIMSK|=_BV(TOIE1);//(1<<TOIE1);
//penentuan nilai awal timer
TCNT1H = 0;
TCNT1L = 0;
//penentuan nilai compare untuk delay 1 detik
OCR1AH = 0xE1;
OCR1AL = 0x00;
//menunggu hingga compare match, (nilai TCNT1 = OCF1A)
loop_until_bit_is_set(TIFR,OCF1A);
//meng-nol-kan flag
TIFR|=_BV(OCF1A);
//overflow interrupt disable
TIMSK|=_BV(TOIE1);
}

----------------------------2C1-------------------------------#include <avr/io.h>
#define F_CPU 7372800UL
#include <util/delay.h>
#include <avr/interrupt.h>
void init_int(void);
ISR(TIMER0_OVF_vect)
{
unsigned char i;
PORTA=0xFF;
_delay_ms(200);
TIFR=(1<<TOV1);
TCNT1H=0xE3;
TCNT1L=0xDF;
}
int main(void)
{
init_int();
DDRA=0xFF;
while (1)
{
PORTA = 0b01010101;
_delay_ms(100);
PORTA = 0b10101010;
_delay_ms(100);
TIMSK=0b000100;
}
return 0;
}
void init_int(void)
{
TIMSK=0b000000;
TCCR1B=0b00000101; //prescaler 1024
TCNT1H=0xE3;
TCNT1L=0xDF;
sei();
}
---------------------------2C2---------------------------#include <avr/io.h>
#define F_CPU 7372800UL
#include <util/delay.h>
#include <avr/interrupt.h>
void init_int(void);
ISR(TIMER0_OVF_vect)
{
unsigned char i;
PORTA=0xFF;
_delay_ms(200);

TIFR=(1<<TOV1);
TCNT1H=0xE3;
TCNT1L=0xDF;
}
int main(void)
{
init_int();
DDRA=0xFF;
while (1)
{
PORTA = 0b01010101;
_delay_ms(100);
PORTA = 0b10101010;
_delay_ms(100);
TIMSK=0b000100;
}
return 0;
}
void init_int(void)
{
TIMSK=0b000000;
TCCR1B=0b00000101; //prescaler 1024
TCNT1H=0xC7;
TCNT1L=0xC0;
sei();
}
---------------------------2D1----------------------------#include <avr/io.h>
#define F_CPU 7372800UL
#include <util/delay.h>
#include <avr/interrupt.h>
void Init_Ext_Int(void);
ISR(INT0_vect)
{
unsigned char i=0x01,n;
for(n=0;n<8;++n)
{
PORTA = i;
_delay_ms(250);
i=(i<<1)|(i>>7);
}
}
int main(void)
{
Init_Ext_Int();
sei();
DDRA=0xFF;
while (1)
{
PORTA = 0b10101010;

_delay_ms(500);
PORTA = 0b01010101;
_delay_ms(500);
}
return 0;
}
void Init_Ext_Int(void)
{
MCUCR=0x02;
MCUCSR=0x00;
GICR=0x40;
GIFR=0x40;
}
-------------------------2D2------------------------------#include <avr/io.h>
#define F_CPU 7372800UL
#include <util/delay.h>
#include <avr/interrupt.h>
void Init_Ext_Int(void);
ISR(INT0_vect)
{
unsigned char i=0x01,n;
for(n=0;n<8;++n)
{
PORTA = i;
_delay_ms(250);
i=(i<<1)|(i>>7);
}
}
int main(void)
{
Init_Ext_Int();
sei();
DDRA=0xFF;
while (1)
{
PORTA = 0b11111111;
_delay_ms(500);
PORTA = 0b00000000;
_delay_ms(500);
}
return 0;
}
void Init_Ext_Int(void)
{
MCUCR=0x02;
MCUCSR=0x00;
GICR=0x40;
GIFR=0x40;
}