Anda di halaman 1dari 18

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 1

MODUL 02 TIMER, COUNTER, DAN INTERRUPT


Aji Suryo Wibowo (13211059)
Asisten: Febryanto/13210043
Tanggal Percobaan: 06 Maret 2014
EL3214 Praktikum Sistem Mikroprosesor
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

Abstrak

Pada modul ini, dilakukan percobaan untuk menggunakan
fitur dari mikroprosesor ATMega8535, yaitu timer, counter,
dan interrupt. Percobaan pertama adalah membuat delay
dengan memanfaatkan fitur timer/counter pada
ATMega8535. Percobaan selanjutnya adalah mengeset clock
dengan menggunakan sumber clock eksternal. Kemudian,
percobaan dilanjutkan dengan membuat aplikasi yang
memanfaatkan fitur interrupt dengan timer/counter.
Percobaan terakhir adalah menggunakan external interrupt.
Kata kunci: Timer/Counter, Clock, Interrupt.
1. PENDAHULUAN
ATMega merupakan sistem minimum yang sering
digunakan sebagai prosesor sebuah sistem
sederhana. Dalam hal ini, sistem minimum
ATMega, khususnya ATMega 8535 digunakan
sebagai kit praktikum, sehingga diharapkan
setelah melakukan percobaan, mahasiswa dapat:
a. memahami datasheet ATMega 8535
b. membuat aplikasi timer/counter dan
interrupt pada AVR dengan menggunakan
bahasa pemrograman C pada WinAVR
c. membuat aplikasi external interrupt pada
AVR dengan menggunakan bahasa
pemrograman C pada WinAVR
2. STUDI PUSTAKA
2.1 ATMEGA8535, [3]

Gambar 2.1 ATMega 8535, [4]
ATMega8535 merupakan salah satu mikro
kontroler 8 bit buatan Atmel untuk keluarga AVR
yang diproduksi secara massal pada tahun 2006.
Karena merupakan keluarga AVR, maka
ATMega8535 juga menggunakan arsitektur RISC.
Secara singkat, ATMega8535 memiliki beberapa
kemampuan:
a. Sistem mikrokontroler 8 bit berbasis RISC
dengan kecepatan maksimal 16 MHz.
b. Memiliki memori flash 8 KB, SRAM sebesar
512 byte dan EEPROM (Electrically Erasable
Programmable Read Only Memory) sebesar
512 byte.
c. Memiliki ADC (pengubah analog-ke-digital)
internal dengan ketelitian 10 bit sebanyak 8
saluran.
d. Memiliki PWM (Pulse Width Modulation)
internal sebanyak 4 saluran.
e. Portal komunikasi serial (USART) dengan
kecepatan maksimal 2.5 Mbps.
f. Enam pilihan mode sleep, untuk menghemat
penggunaan daya listrik.
Mikrokontroler ATMega8535 memiliki 40 pin
untuk model PDIP, dan 44 pin untuk model TQFP
dan PLCC. Nama-nama pin pada mikrokontroler
ini adalah:
a. VCC untuk tegangan pencatu daya positif.
b. GND untuk tegangan pencatu daya negatif.
c. PortA (PA0 PA7) sebagai port
Input/Output dan memiliki kemampuan lain
yaitu sebagai input untuk ADC.
d. PortB (PB0 PB7) sebagai port Input/Output
dan juga memiliki kemampuan yang lain.
e. PortC (PC0 PC7) sebagai port Input/Output
untuk ATMega8535.
f. PortD (PD0 PD7) sebagai port
Input/Output dan juga memiliki
kemampuan yang lain.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 2


g. RESET untuk melakukan reset program
dalam mikro kontroler.
h. XTAL1 dan XTAL2 untuk input pembangkit
sinyal clock.
i. AVCC untuk pin masukan tegangan pencatu
daya untuk ADC.
j. AREF untuk pin tegangan referensi ADC.
Untuk melakukan pemrograman dalam mikro
kontroler AVR, Atmel telah menyediakan
software khusus yang dapat diunduh dari website
resmi Atmel. Software tersebut adalah AVRStudio.
Software ini menggunakan bahasa assembly
sebagai bahasa perantaranya. Selain AVRStudio,
ada beberapa software pihak ketiga yang dapat
digunakan untuk membuat program pada AVR.
Software dari pihak ketiga ini menggunakan
bahasa pemrograman tingkat tinggi seperti bahasa
C, Java, atau Basic. Untuk melakukan pemindahan
dari komputer ke dalam chip, dapat digunakan
beberapa cara seperti menggunakan kabel JTAG
atau menggunakan STNK buatan Atmel.
2.2 TIMER SEBAGAI DELAY
Timer atau counter merupakan salah satu fitur
yang disediakan oleh ATMega8535 yang memiliki
fungsi sebagai pewaktu atau pencacah
berdasarkan clock yang dijadikan sebagai acuan
(internal atau eksternal).
Prinsip kerja timer/counter adalah melakukan
pembagian frekuensi (prescaler) pada clock yang
dijadikan acuan sehingga timer/counter dapat
berjalan sesuai dengan yang dikehendaki.
Ketika digunakan sebagai pemberi delay (waktu
tunda), timer akan melakukan pencacahan sampai
ke nilai tertentu yang telah ditentukan
sebelumnya oleh pengguna. Program akan di-stall
(dihentikan sementara) saat pencacahan oleh timer
dilakukan. Setelah timer mencapai nilai yang
ditentukan tadi, maka program akan dilanjutkan
kembali.
2.3 CLOCK SEBAGAI COUNTER
Clock merupakan komponen yang sangat penting
dari suatu prosesor, karena di situlah semua
proses yang dilakukan oleh prosesor berdasar.
Kecepatan (frekuensi) clock yang dimiliki suatu
prosesor merupakan salah satu indikator
kecepatan prosesor tersebut dalam mengolah data.
Pada ATMega8535, terdapat dua jenis clock
berdasarkan sumber yang digunakan, yaitu clock
internal dan clock eksternal. Clock internal adalah
clock yang memanfaatkan sumber yang berasal
dari sistem (osilator RC internal), sementara clock
eksternal merupakan clock yang memanfaatkan
sumber clock dari luar sistem, contohnya kristal.
Untuk mengeset sumber clock baik internal
maupun eksternal sebagai counter, digunakan
register CS02..CS00. Ketika register tersebut diset
dengan nilai selain 110 dan 111, maka sumber
clock yang digunakan sebagai counter adalah
sumber internal, sementara jika diset dengan nilai
yang tercantum sebelumnya, sumber clock yang
digunakan adalah sumber eksternal (110 untuk
clock pada falling edge, 111 untuk clock pada
rising edge).
2.4 INTERRUPT
Interrupt merupakan keadaan di mana ada suatu
sinyal yang memberitahukan prosesor bahwa
terdapat peristiwa yang memiliki prioritas yang
lebih tinggi dibandingkan dengan program utama.
Prinsip kerja interrupt atau interupsi adalah
sebagai berikut, setelah prosesor mendapatkan
interrupt baik dari hardware maupun software,
maka prosesor akan men-stall program utama
yang sedang berjalan, kemudian prosesor akan
menjalankan ISR atau Interrupt Service Routine,
kemudian setelah ISR selesai dijalankan, prosesor
akan kembali menjalankan program utama.
3. METODOLOGI
3.1 ALAT DAN KOMPONEN YANG DIGUNAKAN
a. Sistem Minimum ATMega 8535 (1 buah)
b. DT-51 Trainer Board (1 buah)
c. Power Supply (1 buah)
d. Komputer Terinstal WinAVR (1 buah)
3.2 LANGKAH-LANGKAH PERCOBAAN
a. Diagram 2.1 Delay dengan
Timer/Counter

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 3




b. Diagram 2.2 External Clock sebagai
Counter


c. Diagram 2.3 Aplikasi Interrupt dengan
Timer/Counter
1
Power supply diset
pada 9 V kemudian
dihubungkan pada kit
praktikum.
Kabel downloader
dihubungkan dari PC
ke sismin ATMega.
2
Dari PORTA pada
sismin, dihubungkan
kabel output ke port
output pada DT-51.
Kodingan ditulis,
kemudian didownload
ke dalam sismin.
Clock yang digunakan
adalah kristal 8 MHz.
1
Power supply diset
pada 9 V kemudian
dihubungkan pada kit
praktikum.
Kabel downloader
dihubungkan dari PC
ke sismin ATMega.
2
Dari PORTA pada sismin,
dihubungkan kabel output
ke port output pada DT-
51.
ATMega8535
dihubungkan dengan
PORTCONTROL pada DT-
51 sehingga pin T1
ATMega8535 terhubung
dengan sebuah Interrupt
Input.
Kodingan ditulis,
kemudian didownload ke
dalam sismin.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 4




d. Diagram 2.4 External Interrupt

4. HASIL DAN ANALISIS
4.1 Delay dengan Timer/Counter

Gambar 2.2 Hasil Percobaan II.A.1


Gambar 2.3 Hasil Percobaan II.A.2

1
Power supply diset
pada 9 V kemudian
dihubungkan pada kit
praktikum.
Kabel downloader
dihubungkan dari PC
ke sismin ATMega.
2
Dari PORTA pada sismin,
dihubungkan kabel output
ke port output pada DT-
51.
ATMega8535
dihubungkan dengan
PORTCONTROL pada DT-
51 sehingga pin T1
ATMega8535 terhubung
dengan sebuah Interrupt
Input.
Kodingan ditulis,
kemudian didownload ke
dalam sismin.
1
Power supply diset
pada 9 V kemudian
dihubungkan pada kit
praktikum.
Kabel downloader
dihubungkan dari PC
ke sismin ATMega.
2
Dari PORTA pada sismin,
dihubungkan kabel output
ke port output pada DT-
51.
ATMega8535
dihubungkan dengan
PORTCONTROL pada DT-
51 sehingga pin T1
ATMega8535 terhubung
dengan sebuah Interrupt
Input.
Kodingan ditulis,
kemudian didownload ke
dalam sismin.
1

s
6

s

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 5



Gambar 2.4 Flowchart Percobaan II.A.1


Gambar 2.5 Flowchart Percobaan II.A.2
Analisis:
Terlihat dari hasil yang didapat bahwa lampu
akan berkedip tiap satu detik untuk Percobaan
II.A.1, dikarenakan pada prosedur Delay() yang
digunakan, telah diset nilai awar timer counter
adalah 0 (dari baris instruksi TCNT1H, dan
TCNT1L), kemudian, diset pula nilai output
compare sebesar 0x7A12 yang diset pada register
OCR1AH dan OCR1AL. Nilai 0x7A12 diperoleh
dari delay yang ingin digunakan yang dikalikan
dengan nilai clock yang dipakai yang dibagi
dengan nilai prescaler. Pada percobaan ini,
digunakan mode operasi CTC dan nilai prescaler
256 yang dapat diketahui melalui pengesetan nilai
bit CS12:CS10 pada register TCCR1B pada 100,
sedangkan bit WGM13:WGM10 diset pada 0100
yang dapat dilihat pada register TCCR1A dan
TCCR1B sehingga,


START
PORTA is set as
OUTPUT
init_tim()
PORTA = 0x0F
Delay()
is set at 1 s
PORTA = 0xF0
Delay()
is set at 1 s
START
PORTA is set as
OUTPUT
init_tim()
PORTA = 0x0F
Delay()
is set at 6 s
PORTA = 0xF0
Delay()
is set at 6 s

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 6



Pada subprogram Delay() terlihat bahwa
digunakan perintah untuk melakukan loop
otomatis yang akan berhenti ketika nilai TCNT1
sama dengan OCR1A, maka loop akan berhenti
yang artinya waktu 1 detik terlewati.
Dapt dilihat dari baris program, bahwa perilaku
LED nantinya akan menyala seperti pada Gambar
2.2 dengan jeda waktu transisi (delay) tiap 1 detik.
Sementara itu, untuk Percobaan II.A.2, dilakukan
modifikasi pada nilai TCCR1B, karena spesifikasi
yang diminta adalah,
( )
maka nilai OCR akan,


terlihat bahwa nilai OCR yang dihasilkan melebihi
kapasitas register OCR yang digunakan yaitu 16
bit, sehingga nilai prescaler yang digunakan
diubah menjadi 1024 dengan cara mengeset nilai
bit CS12:CS10 pada TCCR1B menjadi 101,
sehingga nilai OCR akan menjadi,


Pengesetan nilai OCR ini, akan membuat perilaku
LED seperti yang ditunjukkan oleh Gambar 2.3.
4.2 External Clock sebagai Counter
IS1 is pressed 3 times
5
0
0

m
s

Gambar 2.6 Hasil Percobaan II.B.1
IS1 is pressed 6 times
6

s

Gambar 2.7 Hasil Percobaan II.B.2


Gambar 2.8 Flowchart Percobaan II.B.1

START
PORTA is set as
OUTPUT
init_tim()
PORTA = 0xAA
Is 3 times?
YES
PORTA = 0x55
500 ms delays
NO

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 7



Gambar 2.9 Flowchart Percobaan II.B.2
Analisis:
Terlihat bahwa untuk Percobaan II.B.1 hasil yang
diperoleh sudah sesuai. Pada program yang
digunakan, terlihat nilai TCNT0 diset pada nilai
123 sementara OCR0 diset pada 125.
Kemudian, dalam loop utama, terlihat bahwa
terdapat loop yang mana akan keluar jika terjadi
compare match antara TCNT0 dan OCR0. Dari hal
tersebut, dapat diketahui bahwa selama belum
terjadi penekanan IS1 sebanyak 3 kali yang
merupakan clock eksternal yang aktif pada falling
edge (yang dapat diketahui pula dari penggunaan
bit CS02:CS00 pada register TCCR0 yang diset
pada 110), maka LED akan menyala pada 0xAA.
Kemudian, terlihat bahwa saat terjadi penekanan
IS1 sebanyak 3 kali, maka flag OCF0 akan terset,
sehingga akan keluar dari loop yang disebutkan
sebelumnya untuk menuju ke perintah peresetan
flag dan penggantian nyala LED menjadi 0x55.
Penjelasan yang sama digunakan untuk Percobaan
II.B.2. Pada percobaan ini, digunakan prosedur
Delay() yang mana telah diset pada 6 detik yang
penjelasannya dapat dilihat dari Percobaan II.A.
Pada Percobaan II.B.2 ini, digunakan 3 register
Timer/Counter, yaitu TCCR1A, TCCR1B, dan
TCCR0, atau dengan kata lain, program
menggunakan 2 clock, yaitu clock internal untuk
menghitung delay dan clock eksternal (input IS1)
untuk menghitung counter input agar LED
berubah nyalanya.
4.3 Aplikasi Interrupt dengan Timer/Counter

Gambar 2.10 Hasil Percobaan II.C


Gambar 2.11 Flowchart Percobaan II.C
Analisis:
START
PORTA is set as
OUTPUT
init_tim()
PORTA = 0xAA
Is 6 times?
YES
PORTA = 0x55
Delay() is
set at 6 s
NO
START
PORTA is set as
OUTPUT
init_int()
PORTA = 0xFF
500 ms delays
PORTA = 0xAA
500 ms delays
PORTA = 0x0F
500 ms delays
PORTA = 0xF0
500 ms delays
ISR0
Is twice?
YES
RETI0
NO

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 8


Pada percobaan ini, pada dasarnya Percobaan
II.C.1 dan II.C.2 sama jika dilihat dari
flowchartnya, sehingga dapat digambarkan dalam
satu flowchart saja.
Pada Percobaan II.C.1, digunakan interrupt timer
overflow sehingga saat terjadi overflow timer,
maka sistem akan memasuki interrupt. Percobaan
II.C.1 menggunakan clock 8 MHz dan prescaler
1024 yang terlihat dari pengesetan bit CS02:CS00
pada register TCCR0 di nilai 101. Selain itu, nilai
timer awal pada register TCNT0 diset nilai 0x00
sehingga sistem akan memasuki interrupt saat
TCNT0 mencapai nilai lebih dari 0xFF dan nilai bit
TOIE0 pada register TIMSK bernilai 1. Jika nilai ini
dikonversikan dalam detik, diperoleh,

( )


Dari hal tersebut, maka perilaku program akan
menjadi:
Timer akan melakukan pensamplingan tiap 32.768
ms untuk mendeteksi adanya interrupt yang aktif
(bit TOIE0 pada register TIMSK bernilai 1) jika
interrupt tersebut tidak terdeteksi, maka LED
akan menyala 0xFF, kemudian selang waktu 500
ms nyala LED akan menjadi 0xAA, kemudian
selang waktu 500 ms, sistem akan mulai
mengaktifkan interrupt (mengeset bit TOIE0 pada
register TIMSK dengan nilai 1) sehingga pada saat
ini, jika terjadi overflow TCNT0 (nilainya lebih
dari 0xFF) maka sistem akan menjalankan ISR.
Pada ISR yang dilakukan, LED akan menyala 0x0F
kemudian selang 500 ms akan menjadi 0xF0 dan
selang 500 ms akan kembali lagi ke 0x0F. Hal
tersebut dilakukan sebanyak 2 kali pengulangan.
Setelah 2 kali pengulangan, ISR akan mereset
ulang flag interrupt kemudian sistem akan keluar
dari ISR untuk kembali ke program utama.
Kemudian, pada Percobaan II.C.2, juga digunakan
timer overflow interrupt. Karena spesifikasi yang
diinginkan adalah sistem harus masuk ke ISR tiap
6 detik, maka sampling interrupt yang dilakukan
adalah tiap 6 detik. Pengesetan nilai ini dilakukan
dengan cara mengeset nilai awal timer pada
register TCNT1 dengan nilai 0x48E5. Pada
percobaan ini, digunakan prescaler 1024 yang
ditunjukkan dengan pengesetan TCCR1B pada
0x05. Dari nilai 0x48E5 dan prescaler 1024, maka
diperoleh,
( )


Sistem akan berjalan sebagai berikut:
Timer/counter mulai menghitung dari nilai
0x48E5 sampai 0xFFFF pada frekuensi clock 8
MHz dan prescaler 1024 yang artinya 6 detik.
Waktu 6 detik tersebut adalah waktu sampling
untuk mengetahui ada tidaknya interrupt yang
aktif. Kemudian, sementara pen-samplingan
berjalan, LED akan mulai menyala dari 0xFF
kemudian selang 500 ms menjadi 0xAA dan
selang 500 ms sistem akan mengaktifkan interrupt.
Pada saat ini, jika penyamplingan mendeteksi
adanya interrupt ini (yang berarti sekitar 5 detik
kemudian setelah 1 detik pertama) maka prosedur
ISR akan dijalankan. Jalannya ISR sama seperti
pada Percobaan II.C.1, bedanya, setelah melewati
loop yang terdapat pada ISR, sistem akan mereset
ulang flag TOV1 (timer overflow) dan menreset
ulang timer/counter (TCNT1) pada nilai awal
0x48E5.
4.4 External Interrupt
INTERRUPT
5
0
0

m
s
5
0
0

m
s
B
a
c
k

t
o

m
a
i
n

p
r
o
g
r
a
m
2
5
0

m
s
2
5
0
m
s
2
5
0

m
s
2
5
0
m
s
2
5
0

m
s
2
5
0
m
s
2
5
0

m
s
2
5
0

m
s

Gambar 2.12 Hasil Percobaan II.D.1
INTERRUPT 0
5
0
0

m
s
5
0
0

m
s
B
a
c
k

t
o

m
a
in

p
r
o
g
r
a
m
5
0
0

m
s
5
0
0
m
s
INTERRUPT 1
5
0
0
m
s
B
a
c
k

t
o

m
a
in

p
r
o
g
r
a
m
5
0
0

m
s

Gambar 2.13 Hasil Percobaan II.D.2


Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 9



Gambar 2.14 Flowchart Percobaan II.D.1


Gambar 2.15 Flowchart Percobaan II.D.2
Analisis:
Pada Percobaan II.D.1, pada prosedur
Init_Ext_Int(), register MCUCR diset pada nilai
0x02 yang artinya, INT0 akan menghasilkan
interrupt pada falling edge. Kemudian, register
GICR diset pada nilai 0x40 begitupun dengan
register GIFR. Hal ini berarti bahwa interrupt di-
enable-kan pada pin INT0 dan flagnya pada
INTF0.
Program pada Percobaan II.D.1 akan berjalan
sebagai berikut:
LED akan menyala 0xAA, kemudian selang waktu
500 ms nyalanya akan berubah menjadi 0x55 dan
selang 500 ms kemudian nyalanya kembali
menjadi 0xFF begitu seterusnya. Meskipun
demikian, ketika interrupt eksternal diberikan,
dalam hal ini tombol IS1 dipencet, maka prosedur
ISR0 akan aktif dan sistem akan keluar dari
program utama untuk menjalankan prosedur ISR0
yang mana LED akan menyala dari ujung kanan
(bit 0) ke ujung kiri (bit 7) dengan selang waktu
tiap transisi bitnya 250 ms yang dapat dilihat dari
Gambar 2.12. Kemudian setelah ISR selesai
dijalankan, sistem akan kembali ke program
utama.
Pada Percobaan II.D.2, pada prosedur
Init_Ext_Int(), register MCUCR diset pada nilai
0b00001010 yang artinya, INT1 dan INT0 akan
menghasilkan interrupt pada falling edge.
Kemudian, register GICR diset pada nilai
0b11000000 begitupun dengan register GIFR. Hal
ini berarti bahwa interrupt di-enable-kan pada pin
INT1 dan INT0 dan flagnya pada INTF1 dan
INTF0.
Program pada Percobaan II.D.2 akan berjalan
sebagai berikut:
LED akan menyala 0xFF, kemudian selang waktu
500 ms nyalanya akan berubah menjadi 0x55 dan
selang 500 ms kemudian nyalanya kembali
menjadi 0x00 begitu seterusnya. Meskipun
demikian, ketika interrupt eksternal (INT0)
diberikan, dalam hal ini tombol IS1 dipencet,
maka prosedur ISR0 akan aktif dan sistem akan
keluar dari program utama untuk menjalankan
prosedur ISR0 yang mana LED akan menyala 0x99
kemudian selang waktu 500 ms akan berganti
menjadi 0x66 dan pada selang waktu 500 ms,
sistem akan kembali masuk ke program utama.
Selain itu, jika interrupt eksternal lainnya
diberikan (INT1) dalam hal ini IS2 dipencet, maka
sistem akan memasuki ISR1 yang mana LED akan
menyala 0x0A selang 500 ms kemudian akan
berganti menjadi 0x55 dan 500 ms sistem keluar
dari prosedur ISR1 untuk kembali ke program
utama. Untuk lebih jelasnya dapat dilihat pada
Gambar 2.13.
5. KESIMPULAN
Dari percobaan dapat disimpulkan bahwa:
START
PORTA is set as
OUTPUT
Init_Ext_Int()
PORTA = 0xAA
500 ms delays
PORTA = 0x55
500 ms delays
PORTA = i
250 ms delays
i = (i<<1)|(i>>7)
ISR0
Is 8 times?
YES
RETI0
NO
i = 0x01
START
PORTA is set as
OUTPUT
Init_Ext_Int()
PORTA = 0xFF
500 ms delays
PORTA = 0x00
500 ms delays
ISR0
PORTA = 0x99
500 ms delays
PORTA = 0x66
500 ms delays
RETI0
ISR1
PORTA = 0x0A
500 ms delays
PORTA = 0x55
500 ms delays
RETI1

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 1
0


a. Untuk mengetahui apa saja yang terdapat
dan disediakan oleh ATMega 8535,
digunakan datasheet dari ATMega 8535,
termasuk di dalamnya tentang PORT, PIN,
clock, interrupt, timer/counter, dan register
yang digunakan untuk mengeset hal-hal
tersebut.
b. Untuk melakukan konfigurasi
Timer/Counter dan Interrupt, digunakan
register TCCRx, TCNTx, OCRx, TIMSK, dan
TIFR.
Register TCCRx digunakan untuk melakukan
setting clock yang digunakan, baik clock
eksternal maupun clock internal, demikian
pula dengan prescaler yang digunakan.
Selain itu, pada register TCCRx juga dapat
dilakukan pengesetan mode operasi.
Register TCNTx merupakan register 8 bit (16
bit untuk TCNT1) yang digunakan sebagai
tempat menyimpan nilai timer/counter,
sementara register OCRx merupakan register
8 bit (16 bit untuk OCR1) tempat menyimpan
nilai output compare match.
Register TIMSK merupakan register yang
mengatur tipe interrupt yang terjadi (aktif).
Bit 0 pada register TIMSK merupakan bit
TOIE0 yang mana jika diset akan
mengaktifkan interrupt berdasarkan
Timer/Counter0 (TCNT0) Overflow.
Sementara bit 1 pada TIMSK merupakan bit
OCIE0 yang mana jka diset akan
mengaktifkan interrupt berdasarkan compare
match antara nilai TCNT0 dengan nilai OCR0.
Demikian pula dengan bit lainnya, yg
dicantumkan di bawah ini,

Gambar 2.16 Register TIMSK
Dapat dilihat dari gambar di atas, bahwa
penjelasan untuk bit-bit lainnya sama seperti
penjelasan pada bit 0 dan bit 1 pada
penjelasan sebelumnya. Namun dapat dilihat
pada bit 5, bahwa terdapat bit TICIE1 yang
mana ketika diset maka interrupt
Timer/Counter1 Input Capture akan aktif.
Register TIFR merupakan register yang berisi
bit flag interrupt. Bit 0 merupakan bit flag
Timer/Counter0 Overflow interrupt.
Sementara bit 1 merupakan bit flag Output
Compare0 match interrupt. Untuk bit-bit
lainnya, penjelasannya sesuai dengan
penjelasan sebelumnya kecuali untuk bit 5
yaitu bit flag untuk Input Capture1 interrupt.

Gambar 2.17 Register TIFR
c. Untuk melakukan kofigurasi External
Interrupt, maka dilakukan pengesetan pada
register MCUCR, MCUCSR, GICR, dan GIFR.
Register MCUCR digunakan jika ingin
mengeset pin INT0 (bit 1 dan bit 0) maupun
pin INT1 (bit 3 dan bit 2) sebagai pin
interrupt eksternal.
Register MCUCSR digunakan jika ingin
mengeset pin INT2 (bit 6) sebagai pin
interrupt eksternal.
Register GICR digunakan untuk
mengaktifkan interrupt eksternal dengan pin
yang berkorelasi.

Gambar 2.18 Register GICR
Register GIFR digunakan sebagai flag
interrupt eksternal yang berkorelasi.

Gambar 2.19 Register GIFR
6. DAFTAR PUSTAKA
[1] Hutabarat, Mervin T., Waskita Adijarto, dan
Harry Septanto, Praktikum Sistem Mikroprosesor,
Sekolah Teknik Elektro dan Informatika
Institut Teknologi Bandung, Bandung, 2013
[2] ATMega8535 Datasheet from www.atmel.com
[3] http://id.wikipedia.org/wiki/ATMega8535
[4] www.duniaelektronika.net


Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 11


7. LAMPIRAN


//=========================================================================================================
//Tugas 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=0x7A;
OCR1AL=0x12;

//menunggu hingga compare match, nilai TCNT1=OCR1A
loop_until_bit_is_set(TIFR,OCF1A);

//meng-nol-kan flag
TIFR|=_BV(OCF1A);

//overflow interrupt disable
TIMSK|=_BV(TOIE1);
}
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 12




//=========================================================================================================
//Tugas 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 1024
TCCR1A=0;
TCCR1B=0b00001101;

//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 6 = 23 mod 9 + 1 detik
OCR1AH=0xB7; //0xB71B = 6 * 8 000 000 / 1024 in HEX
OCR1AL=0x1B;

//menunggu hingga compare match, nilai TCNT1=OCR1A
loop_until_bit_is_set(TIFR,OCF1A);

//meng-nol-kan flag
TIFR|=_BV(OCF1A);

//overflow interrupt disable
TIMSK|=_BV(TOIE1);
}
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 13




//=========================================================================================================
//Tugas 2B1
//=========================================================================================================
#include<avr/io.h>
#define F_CPU 8000000UL //8 MHz
#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;
}
//mengenolkan 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);
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 14




//=========================================================================================================
//Tugas 2B2
//=========================================================================================================
#include<avr/io.h>
#define F_CPU 8000000UL //8 MHz
#include<util/delay.h>

void init_tim(void);
void Delay(void);

int main(void)
{
init_tim();
DDRA=0xFF;
while(1)
{
//penentuan nilai awal timer
TCNT0 = 1;
//penentuan nilai compare
OCR0 = 6;
//menanti compare match
while(bit_is_clear(TIFR,OCF0))
{
PORTA=0b10101010;
}
//mengenolkan flag
TIFR|=_BV(OCF0);
PORTA=0b01010101;
Delay();
}
return 0;
}

void init_tim(void)
{
//mode operasi CTC, sumber clock prescaller 1024
TCCR1A=0;
TCCR1B=0b00001101;

//overflow interrupt disable
TIMSK|=(0<<TOIE1);

//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 6 = 23 mod 9 + 1 detik
OCR1AH=0xB7; //0xB71B = 6 * 8 000 000 / 1024 in HEX
OCR1AL=0x1B;

//menunggu hingga compare match, nilai TCNT1=OCR1A
loop_until_bit_is_set(TIFR,OCF1A);

//meng-nol-kan flag
TIFR|=_BV(OCF1A);

//overflow interrupt disable
TIMSK|=_BV(TOIE1);
}
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 15




//=========================================================================================================
//Tugas 2C1
//=========================================================================================================
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

void init_int(void);

ISR(TIMER0_OVF_vect)
{
unsigned char i;
for (i=0;i<2;++i)
{
PORTA=0x0F;
_delay_ms(500);
PORTA=0xF0;
_delay_ms(500);
}
TIFR=(1<<TOV0);
TIMSK=0b000000;
}

int main(void)
{
init_int();
DDRA=0xFF;
while (1)
{
PORTA = 0xFF;
_delay_ms(500);
PORTA = 0b10101010;
_delay_ms(500);
TIMSK=0b000001;
}
return 0;
}

void init_int(void)
{
TIMSK=0b000000;
TCCR0=0b00000101;
TCNT0=0x00;
sei();
}
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 16




//=========================================================================================================
//Tugas 2C2
//=========================================================================================================
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

void init_int(void);

ISR(TIMER1_OVF_vect)
{
unsigned char i;
for (i=0;i<2;++i)
{
PORTA=0x0F;
_delay_ms(500);
PORTA=0xF0;
_delay_ms(500);
}
TIFR=(1<<TOV1);
TIMSK=0b000000;
TCNT1H=0x48; // (0xFFFF + 0x0001 - 0x48E5) = OCR1A
TCNT1L=0xE5;
}

int main(void)
{
init_int();
DDRA=0xFF;
while (1)
{
PORTA = 0xFF;
_delay_ms(500);
PORTA = 0b10101010;
_delay_ms(500);
TIMSK=0b000100;
}
return 0;
}

void init_int(void)
{
TIMSK=0b000000;
TCCR1A=0;
TCCR1B=0b00000101;
TCNT1H=0x48;
TCNT1L=0xE5;
sei();
}
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 17




//=========================================================================================================
//Tugas 2D1
//=========================================================================================================
#include <avr/io.h>
#define F_CPU 8000000UL
#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;
}
//=========================================================================================================

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 18



//=========================================================================================================
//Tugas 2D2
//=========================================================================================================
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

void Init_Ext_Int(void);
ISR(INT0_vect)
{
PORTA = 0x99;
_delay_ms(500);
PORTA = 0x66;
_delay_ms(500);
}

ISR(INT1_vect)
{
PORTA = 0x0A;
_delay_ms(500);
PORTA = 0x55;
_delay_ms(500);
}

int main(void)
{
Init_Ext_Int();
sei();
DDRA=0xFF;
while (1)
{
PORTA = 0xFF;
_delay_ms(500);
PORTA = 0x00;
_delay_ms(500);
}
return 0;
}

void Init_Ext_Int(void)
{
MCUCR=0b00001010;
MCUCSR=0x00;
GICR=0b11000000;
GIFR=0b11000000;
}
//=========================================================================================================