Anda di halaman 1dari 11

Percobaan II

TIMER, COUNTER, INTERRUPT

Leonardo Depantri Sembiring (14S16053)


Tanggal Percobaan : 08/03/2019
[ELS3203][Praktikum Sistem Mikroprosesor]
Laboratoriun Dasar Teknik Elektro
Institut Teknologi Del

Mikrokontroler adalah sistem mikroprosesor lengkap yang


Abstract- On practical this time, praktikan will be doing terkandung di dalam sebuahchip. Mikrokontroler berbeda
an experiment about Timers, counters, and Interrupt aims dari mikroprosesor serba guna yang digunakan dalam
to understand the datasheet ATMega 8535, capable of sebuah PC, karena sebuah mikrokontroler umumnya telah
making an application Timer/counters and Interrupt on berisi komponen pendukung sistem minimal
the AVR C programming language by using CV AVR , and mikroprosesor, yakni memori dan antarmuka I/O.
are able to make an application to the External Interrupt
on the AVR C programming language by using CV AVR. Menurut Budiharto Mikrokontroler ialah chip yang berisi
The equipment used in this lab course is a laptop already berbagai unit penting untuk melakukan pemrosesan
installed application CV AVR and AVR board. On the data (I/O, timer, memory, Arithmetic Logic Unit (ALU)
experiment this time, we are expected to understand the dan lainnya) sehingga dapat berlaku sebagai pengendali
timer/counter, and interrupt. dan komputer sederhana. Mikrokontroler merupakan
sistem komputer yang mempunyai satu atau beberapa
Keywords: interrupt, timer, counter tugas yang sangat spesifik, berbeda dengan personal
compputer (PC) yang memiliki beragam fungsi.
I. PENDAHULUAN
Pada percobaan ini praktikan akan menggunakan CV AVR Mikrokontroller memiliki kemampuan manipulasi data
dan ATMEGA8535 untuk melakukan beberapa percobaan (informasi) berdasarkan suatu urutan instruksi (program)
yang telah di tentukan pada modul praktikum. Adapun yang dibuat oleh programmer. Mikrokontroller adalah
tujuan dari praktikun ini yaitu : piranti elektronik yang dikemas dalam bentuk sebuah IC
(Integrated Circuit) tunggal, sebagai bagian utama dan
 Praktikan memahami datasheet ATMega 8535. beberapa peripheral lain yang harus ditambahkan, seperti
 Praktikan mampu membuat aplikasi Timer/ Counter kristal dan kapasitor.
dan interrupt pada AVR dengan menggunakan bahasa
pemprograman C pasa CV AVR.
 Praktikan mampu membuat aplikasi External Interrupt
pada AVR dengan menggunakan bahasa  Mikrokontroler AVR ATMega8535
pemprograman C pada CV AVR. Kata AVR dapat berasal dari singkatan Alf and Vegard
RISC sesuai dengan nama penggagas pertama. Saat ini ada
yang mengunakan singkatan dari Advance Virtual
RISC. Mikrokontroler AVR yang menggunakan
II. LANDASAN TEORI teknologi RISC (Reduced Instruction Set Computer) dan
berasitekutr Harvard ini pertama kali dikembangkan pada
Pengertian Mikrokontroler tahun 1996 oleh dua orang mahasiswa Norwegian Institute
of Technology yaitu Alf-Egil Bogen dan Veggard Wollan
yang kemudian dikembangkan lebih lanjut oleh
Perusahaan Atmel.

ATMega8535 merupakan salah satu mikrokontroler 8


bit buatan Atmel untuk keluargaAVR yang diproduksi
secara masal pada tahun 2006. Karena merupakan
keluarga AVR, maka ATMega8535 juga menggunakan
arsitektur RISC (Reduced Instruction Set
Computing). AVR atau sebuah kependekan dari Alf and
Vegard’s Risc Processormerupakan chip mikrokontroler
Gambar 1. Mikrokontroler AVR ATMega8535 yang diproduksi oleh Atmel.
Mikrokontroler ATMega 8535 merupakan
mikrokontroler 8-bit teknologi CMOS dengan konsumsi
daya rendah yang berbasis arsitektur enhanced RISC
AVR. Dengan eksekusi instruksi yang sebagian besar
hanya menggunakan satu siklus clock, ATMega8535
mencapai Throughput sekitar 1 MIPS per MHz yang
mengizinkan perancang sistem melakukan optimasi
konsumsi daya versus kecepatan pemroses.

Mikrokontroler ATMega8535 memiliki beberapa fitur


atau spesifikasi yang menjadikannya sebuah solusi
pengendali yang efektif untuk berbagai keperluan. Fitur-
fitur tersebut antara lain:

1. Port I/O sebanyak 32 bit, yang terdiri atas Port A,


B, C dan D
2. ADC (Analog to Digital Converter) 10-bit sebanyak
8 input
3. Timer/Counter sebanyak 3 buah dengan
kemampuan perbandingan
4. CPU 8 bit yang terdiri atas 32 register
5. Watchdog Timer dengan osilator internal Gambar 2. Konfigurasi Pin ATMega8535
6. SRAM sebesar 512 byte
7. Memori Flash sebesar 8Kbyte dengan Tabel 1 Deskripsi Pin AVR ATMega8535
kemampuan read while write
8. Unit Interupsi Internal maupun External
9. Port antarmuka SPI untuk men-download program No. Nama Pin Keterangan
ke flash Pin
10. EEPROM sebesar 512 byte yang dapat diprogram 10 VCC Catu Daya
saat operasi 11 GND Ground
11. Antarmuka komparator analog 40 → Port A : PA0 Port I/O dua arah
12. Port USART (Universal Shynchronous 33 – PA7 dilengkapi internal pull-up
Ashynchronous Receiver Transmitter) untuk (ADC0 – resistor.Port ini juga
komunikasi serial dengan kecepatan maksimal 2,5 ADC7 dimultipleks dengan masukan
Mbps analog ke ADC 8 kanal
13. Frekuensi clock maksimum 16 MHz\ 1→ Port B : PB0 Port I/O dua arah
7 – PB7 dilengkapi internal pull-up
Konfigurasi Pin ATMega8535 resistor. Fungsi lain dari port ini
Mikrokontroler ATMega8535 mempunyai jumlah pin masing-masing adalah :
sebanyak 40 buah, dimana 32 pin digunakan untuk PB0 : T0 (timer/counter0
keperluan port I/O yang dapat menjadi external counter input)
pin input/output sesuaikonfigurasi. Pada 32 pin tersebut PB1 : T1 (timer counter1
terbagi atas 4 bagian (port), yang masing-masingnya external counter input
terdiri atas 8 pin. Pin-pin lainnya digunakan untuk PB2 : AIN0 (analog comparator
keperluan rangkaian osilator, supplytegangan, reset, serta positive input)
tegangan referensi untuk ADC. Untuk lebih jelasnya, PB3 : AIN1 (analog comparator
konfigurasi pin ATMega8535 dapat dilihat pada gambar 2. positive input)
PB4 : SS (SPI slave select input)
PB5 : MOSI (SPI Bus Master
Input/Slave output)
PB6 : MISO (SPI Bus Master
Input/Slave Output)
PB7 : SCK (SPI Bus Serial
Clock)
22 → Port C : PC0 Port I/O dua arah
29 – PC7 dilengkapi internal pull-up
resistor. Dua pin yaitu PC6 dan
PC7 berfungsi sebagai osilator
eksternal untuk timer/counter2
14 → Port D : PD0 Port I/O dua arah
21 – PD7 dilengkapi internal pull-up
resistor. Fungsi lain dari port ini
masing-masing adalah :
PD0 : RXD (UART Input Line)
PD1 : TXD (UART Output Line)
PD2 : INT0 (External Interrupt 0
Input)
PD3 : INT1 (External interrupt 1
input)
PD4 : OC1B (Timer/Counter1
Output)
CompareB Match Output
PD5 : OC1A (Timer/Counter1
Output)
CompareA Match Output
PD6 : ICP (Timer/Counter1
Input Capture Pin)
PD7 : OC2 (Timer/Counter2
Output)
Compare Match Output
9 RESET Masukan Reset. Sebuah Reset
terjadi jika pin ini diberi Gambar 2 Skematik Sistem Minimum AVR
logika low melebihi periode ATMega8535
minimum yang diperlukan.
13 XTAL1 Masukan ke inverting oscillator Gambar sistem minimum di atas dapat juga dan sangat
amplifier dan masukan kompatibel untuk digunakan pada jenis mikrokontroler
kerangkaian internal clock lain yang setipe (jumlah kaki/pin sama dan konfigurasi
pin-nya juga sama), seperti ATmega16, dan ATmega32.
12 XTAL2 Keluaran dari inverting oscillator
amplifier
ATMega8535 mempunyai timer/counter yang berfungsi
30 AVCC Catu daya untuk Port A dan sebagai pencacah/pewaktuan. Karena ATMega8535
ADC
mampu memakai crystal berfrekuensi sampai dengan 16
31 AGND Analog Ground MHz maka mikrokontroler ini dapat mencapai 16MIPS
32 AREF Referensi masukan analog untuk (Million Instruction per Second).
ADC
Pada mikrokontroler ATMega 8535 perlu diperhatikan
pemilihan sumber clock. Hal ini berhubungan dengan
 Sistem Minimum AVR ATMega8535
frekuensi yang kita inginkan. Jika kita ingin menggunakan
frekuensi 12MHz dengan sumber clock eksternal maka
Sistem Minimum Mikrokontroler ATmega
perlu dilakukan kalibrasi fuse bit mikrokontroler dengan
8535 merupakan rangkaian minimum yang dibuat agar
downloader, jika tidak maka mikrokontroler akan
sistem ini (mikrokontroler ini) dapat bekerja dan berfungsi
menggunakan frekuensi dengan sumber clock internal
dengan semestinya. Sistem minimum ini meliputi catu
sekitar 4 MHz.
daya mikrokontroller (vcc) yang berkisar antara 2,7 V –
5,5 V, kristal oscillator (opsional) yang berfungsi sebagai
PRESCALER
referensi kecepatan akses mikrokontroller (kristal
oscillator diperlukan jika menginginkan referensi clock
Timer pada dasarnya hanya menghitung pulsa clock.
yang tinggi, tapi tanpa kristal oscillator pun
Frekuensi pulsa clock yang dihitung tersebut bisa sama
mikrokontroler masih dapat bekerja, karena sudah
dengan frekuensi crystal yang dipasang atau dapat
memiliki referensi clock internal), referensi ADC (Analog
diperlambat menggunakan prescaler dengan faktor 8, 64,
to digital konverter), tombol reset, serta port-port I/O.
256 atau 1024. Berikut penjelasannya:
Berikut adalah contoh sistem minimum yang meliputi catu
Sebuah AVR menggunakan crystal dengan frekuensi 8
daya, oscillator eksternal (menggunakan XTAL), tombol
MHz dan timer yang digunakan adalah timer 16 bit, maka
reset, dan port – port I/O expansion, dan port untuk
maksimum waktu timer yang bisa dihasilkan adalah:
downloader.
TMAX = 1/fCLK x (FFFFh+1) = 0.125uS x 65536 =
0.008192 S
Untuk menghasilkan waktu timer yang lebih lama dapat
digunakan prescaler, misalnya 1024, maka maksimum
waktu timer yang bisa dihasilkan adalah : Register TCCR2
Bit 2,1,0 (CS22; CS21, CS20): Clock Select. Ketiga bit
TMAX = 1/fCLK x (FFFFh+1) x N = 0.125uS x 65536 x ini memilih sumber clock yang akan digunakan oleh
1024 = 8.388608 S Timer/Counter.

MACAM-MACAM TIMER/COUNTER
1. Timer/Counter 0 Konfigurasi Bit Clock Select untuk Memilih Sumber
Clock
Merupakan 8 bit timer/counter, pengaturan Timer/Counter
0 diatur oleh TCCR0 (Timer/Counter control register 0) Tabel 2.3 Konfigurasi Bit Clock Select untuk Memilih
seperti berikut ini: Sumber Clock

Register TCCR0
Register TIMSK dan TIFR
Gambar 2.1 Register TCCR0
Selain register-register di atas, terdapat pula register
TIMSK (Timer/Counter Interrupt Mask Register) dan
register TIFR (Timer/Counter Interrupt Flag Register).
Bit 3 ~ 7 digunakan untuk setting PWM.

Bit 2, 1, 0 (CS02, CS01, CS00): Clock select. Ketiga bit Register TIMSK
tersebut memilih sumber clock yang akan digunakan oleh
timer/counter. OCIEx: Output Compare Match Interrupt Enable. Jika bit
tersebut diberi logika 1 dan bit I SREG juga berlogika 1,
maka bisa dilakukan enable interupsi Output Compare
Konfigrasi Bit Clock Set Match Timer/Counter x.
TOIEx: Overflow Interrupt Enable. Jika diberi logika 1
dan bit I SREG juga berlogika 1, maka bisa dilakukan
2. Timer/Counter 1 enable interupsi Overflow Timer/Counter x.
TCIE1: Timer/Counter 1, Input Capture Interrupt Enable
Merupakan 16-bit timer/counter sehingga terdapat
perbedaan cara pengaksesannya dengan 8-bit
timer/counter. 16-bit (1 word) timer/counter harus diakses Register TIFR
dengan 8 bit high dan 8 bit low. Register TIFRernilai 1 (set) jika terjadi compare match
antara Timer/Counter x dan data di OCRx (Output
Pengaturan Timer/Counter1 juga diatur oleh register Compare Register x). OCFx di-clear secara hardware
TCCR1B. ketika pengeksekusian corresponding interrupt handling
vector. Atau, jika diberi nilai 1 secara lagsung ke bit flag.
Saat bit I SREG, OCIEx, dan OCFx set (berlogika 1),
Register TCCR1B maka Timer/Counter x Compare Match Interrupt
dieksekusi.
Bit 2,1,0 (CS1 2:0): Clock Select. Ketiga bit tersebut
(CS2/CS1/CS0) mengatur sumber clock yang digunakan TOVx: Timer/Counter x Overflow Flag. Bit ini akan set
untuk Timer/Counter1. (bernilai 1) saat terjadi overflow di Timer/Counter x.
TOVx akan clear (bernilai 0) secara hardware saat
pengeksekusian corresponding interrupt handling vector.
Konfigurasi Bit Clock Select untuk Memilih Sumber Atau, diberikan logika 1 ke bit flag. Saat bit i SREG,
Clock TOIEx (Timer/Counter x Overflow Interrupt Enable), dan
TOVx set, akan terjadi pengeksekusian Timer/Counter x
Overflow Interrupt. Pada mode PWM, bit ini set ketika
Timer/Counter x mengubah arah perhitungan hingga
3. Timer/Counter 2 menuju nilai 0x00.

Timer/Counter2 adalah 8-bit Timer/Counter, pengaturan


pada Timer/Counter2 diatur oleh TCCR2 (Timer/Counter 4. Setting Timer
Control Register 2).
Sebelum kita melakukan setting timer maka kita tentukan
dahulu nilai delay yang kita inginkan lalu bisa kita
dapatkan nilai TCNTnya PENGERTIAN DEFINISI INTERRUPT adalah Proses
yang dilakukan oleh mikrokontroler Interrupt Service
Routine
Interrupt adalah suatu kejadian atau peristiwa yang
TCNT : Nilai timer (Hex) menyebabkan mikrokontroler berhenti sejenak untuk
melayani interrupt tersebut. Program yang dijalankan pada
fCLK : Frekuensi clock (crystal) yang digunakan saat melayani interrupt disebut Interrupt Service Routine.
(Hz) Analoginya adalah sebagai berikut, seseorang sedang
mengetik laporan, mendadak telephone berdering dan
T timer : Waktu timer yang diinginkan (detik) menginterrupsi orang tersebut sehingga menghentikan
pekerjaan mengetik dan mengangkat telephone. Setelah
N : Prescaler (1, 8, 64, 256, 1024) pembicaraan telephone yang dalam hal ini adalah
merupakan analogi dari Interrupt Service Routine selesai
1+FFFFh : Nilai max timer adalah FFFFh dan overflow maka orang tersebut kembali meneruskan pekerjaanya
saat FFFFh ke 0000h mengetik. Demikian pula pada sistem mikrokontroler yang
sedang menjalankan programnya, saat terjadi interrupt,
program akan berhenti sesaat, melayani interrupt tersebut
dengan menjalankan program yang berada pada alamat
5. Contoh Program yang ditunjuk oleh vektor dari interrupt yang terjadi
hingga selesai dan kembali meneruskan program yang
Skema Timer 1 dengan delay 1 detik dengan prescaler terhenti oleh interrupt tadi. Seperti yang terlihat Gambar
1024 dan fclk 11.0592MHz dibawah ini, sebuah program yang seharusnya berjalan
terus lurus, tiba-tiba terjadi interrupt dan harus melayani
Langkah yang perlu dilakukan adalah : interrupt tersebut terlebih dahulu hingga selesai sebelum ia
kembali meneruskan pekerjaannya.
• Aktifkan TOIE1 pada TIMSK

• Masukkan nilai timer ke TCNT1 misalnya : D5D0h

• Set prescaler pada 1024 ( set bit CS12 dan CS10 pada
TCCR1B)

• Aktifkan bit global interrupt pada SREG

• Tunggu. Atau lakukan hal yang lain. Semua perhitungan


dan pengecekan flag dilakukan oleh hardware.

.equ timer_value=0xD5D0;

…..

timer1d:

ldi r16,0b00000100 ; aktifkan enable interupt

out TIMSK,r16
Proses yang dilakukan oleh mikrokontroler saat
ldi r16,high(timer_value) ; masukkan nilai timer melayani interrupt adalah sebagai berikut:

out TCNT1H,r16
Instruksi terakhir yang sedang dijalankan diselesaikan
ldi r16,low(timer_value) terlebih dahulu

out TCNT1L,r16 Program Counter (alamat dari instruksi yang sedang


berjalan) disimpan ke stack

Interrupt Status disimpan secara internal


Setelah 1 detik
Interrupt dilayani sesuai peringkat dari interrupt (lihat
Interrupt Priority)

Program Counter terisi dengan alamat dari vector interrupt


(lihat Interrupt Vector) sehingga mikrokontroler langsung
menjalankan program yang terletak pada vector interrupt

Program pada vector interrupt biasanya diakhiri dengan


instruksi RETI di mana pada saat ini proses yang terjadi
pada mikrokontroler adalah sebagai berikut:

Program Counter diisi dengan alamat yang tersimpan Maksud dari kode program di atas adalah kita membuat
dalam stack pada saat interrupt terjadi sehingga delay dengan menggunakan timer 1 (code TCNT1) dengan
mikrokontroler kembali meneruskan ukuran 16 bit dan menggunakan prescaler 1024 (TCCR1B
= 0b101) . Dengan menggunakan ini besar clock pada
program di lokasi saat interrupt terjadi ATMega 8535 dapat ditampung pada timer 1 sampai
dengan 216= 65535 bit. Setelah itu kita membagikan
Interrupt Status dikembalikan ke kondisi terakhir sebelum frekuensi clock dengan prescaler sehingga 16MHz : 1024
terjadi interrupt = 15625. Angka ini mempunyai arti 1 detik. Jika ingin
lebih dari 1 detik maka angka tersebut dikalikan dengan
jumlah detik yang diinginkan. Setelah itu angka tersebut
dikurangkan dengan waktu maksimal sehingga sesuai kode
III. HASIL ANALISIS
program 65535-15625=49910 berarti bahwa output led
A. Tugas 1 : DELAY DENGAN TIMER/ COUNTER display menyala selama 1 detik dan mati selama 1 detik
Pada percobaan pertama kita akan membuat delay begitu seterusnya.
dengan menggunakan timer / counter tanpa menggunakan
fungsi delay dari library. Untuk itu diperlukan perhitungan B. Pada percobaan kali ini kita akan membuat delay
tertentu pada register agar bisa menyesuaikan pada waktu dimana output led display akan menyala selama x detik
yang diinginkan seperti berikut ini: dan mati selama x detik begitu seterusnya, dimana x =
modulus 9 dari nomor kelompok + 1 seperti berikut ini:
TCNT1 = 49910;
TCCR1B = 0b101; TCNT1 = 49910;
while((TIFR & 0b00000100)==0); TCCR1B = 0b101;
TCCR1B = 0; while((TIFR & 0b00000100)==0);
TIFR = 0b00000100; TCCR1B = 0;
PORTB = ~PORTB; TIFR = 0b00000100;
PORTB = ~PORTB;
Hasil yang didapat:

Pada sub program start kita melakukan proses


pemindahan data immediate ke register R0 dan R1.
Kemudian kita juga melakukan pemindahan data
immediate #0FFh ke port satu. Perintah ini akan membuat
seluruh bit pada port satu mendapat harga logika satu.
Pada baris selanjutnya terdapat perintah CLR yang
berfungsi membuat logika port 1.4 menjadi nol. Pada baris
selanjutnya terdapat perintah MOV yang akan
memasukkan harga data immediate ke dalam register
Setelah 1 detik TMOD. Harga yang dimasukkan ini akan berfungsi
menentukan mode timer yang digunakan. Jika kita
memasukkan nilai #01h sebagaimana dalam program,
maka kita akan membuat mode timer yang berfungsi
menjadi mode 01. Hal ini dapat dilihat dalam penjelasan
mode TMOD dan tabelnya seperti berikut Langkah
selanjutnya kami memindahkan nilai direct byte ke
register TH0 dan memindahkan immediate data ke register
TL0. Kemudian dengan perintah SETB kami
mengaktifkan bit TR0. Setelah itu kami memindahkan
nilai immediate FF ke accumulator A. Setelah itu program
akan memasuki subrutin CHECK. Pada subrutin CHECK + 1 Karena nomor grup kami adalah 9. Maka modulus-9
didapatkan instruksi JNB. Instruksi ini menyatakan bahwa nya adalah nol. Sehingga x adalah 1 detik.
program akan melompat ke subrutin CHECK jika harga
TF0 sama dengan nol. Jika harga TF0 adalah satu, maka
C.
program akan melanjutkan ke instruksi LCALL. Instruksi
LCALL (Long Subroutine Call) ini akan memanggil TUGAS II.B.1
subrutin RELOAD. Setelah memanggil subrutin #include <mega8535.h>
RELOAD, maka program akan langsung melompat ke #include <alcd.h>
subrutin PENGALI1. Pada subrutin RELOAD, pertama- #include <stdio.h>
tama nilai register TR0 akan diset menjadi nol. Kemudian char str[10];
instruksi MOV akan memindahkan nilai immediate DBh void main()
ke register TH0 dan nilai immediate EFh ke register TL0. {
Setelah melakukan ini, maka program pun akan mengeset DDRB.0 = 0;
nilai TF0 ke nilai nol dan TR0 ke nilai satu. Setelah ini PORTB.0 = 1;
program akan kembali ke instruksi LJMP untuk langsung lcd_init(16);
memasuki subrutin PENGALI1. Pada subrutin lcd_clear();
PENGALI1, program dilanjutkan dengan instruksi INC lcd_putsf(“Counter 0= ”);
yang menaikkan (increment) register R0. Setelah itu TCCR0 = 0b110;
program dilanjutkan dengan instruksi CJNE yang while(1)
menyatakan bahwa program akan melompat ke subrutin {
CHECK kembali apabila nilai R0 tidak sama dengan 32h. sprintf(str,”%i”,TCNT0);
Selama nilai register ini belum mencapai 32h, maka lcd_gotoxy(10,0);
program akan terus berputar di sini. Setelah nilai register lcd_puts(str);
sama dengan 32h, maka program akan dilanjutkan dengan }
mengeset nilai register R0 ke nilai nol kembali dan setelah }
itu program pun akan melompat ke subrutin LED. Pada
subrutin LED terdapat instruksi CJNE yang
menginstruksikan program untuk membandingkan harga
kedua data, yaitu harga accumulator dan data immediate
00h. Jika keduanya memiliki harga yang berbeda, maka
program akan melompat ke subrutin NYALA. Jika harga
pada accumulator adalah nol, maka program akan
langsung melompat ke subrutin MATI. Karena pada
awalnya nilai accumulator telah diset menjadi satu, maka
program pun akan melompat ke subrutin NYALA. Pada
subrutin NYALA, harga port output yang telah
dihubungkan dengan port satu bit keempat diberi instruksi
SETB. Dengan instruksi ini, maka port output pun akan
menyala. Setelah instruksi SETB yang mengeset port
output bit keempat, maka program dilanjutkan dengan
instruksi MOV yang memindahkan data immediate 00h ke
accumulator A.
Pada percobaan ini kami menggunakan port 1 sebagai
output. Kami juga memasang kabel penghubung antara
Setelah itu program akan memanggil subrutin CHECK
IS3 dengan T0.
(kembali ke CHECK). Kembali ke subrutin CHECK,
Yang dikerjakan dengan listing program di atas
maka program akan melalui alur yang sama dengan
pertama-tama adalah memindahkan memori aktif ke
sebelumnya. Tetapi program pun akan sampai ke subrutin
alamat 4000H yang merupakan alamat pada EEPROM.
MATI karena pada saat program ada di subrutin NYALA,
Hal ini dilakukan dengan menuliskan perintah CSEG.
nilai accumulator A telah diset ke nilai nol. Pada subrutin
Tujuannya adalah untuk menjaga apabila terjadi hal yang
MATI, port output bit keempat pun diset ke nilai nol.
tidak diinginkan maka perintah masih tersimpan pada
Sehingga pada saat ini LED pun akan padam. Setelah itu
EEPROM dan tidak hilang. Kemudian program akan
nilai accumulator pun akan diset menjadi nilai satu.
melanjutkan ke subrutin START dengan perintah LJMP.
Setelah ini program pun akan melanjutkan ke subrutin
Di subrutin START pertama-tama kita akan
CHECK dan begitu seterusnya. Untuk program
memindahkan nilai immediate 00h ke port P1. Sehingga
modifikasinya, kami membuat antara empat bit LSB
pada saat ini port 1 yang terhubung ke output akan bernilai
dengan empat bit MSB berkedip secara bergantian dengan
nol untuk semua bit. Selanjutnya kita melanjutkan ke
waktu periode kedip LED berkisar pada x detik. Dimana x
instruksi MOV yang memindahkan nilai immediate 06h ke
didefinisikan sebagai berikut X = (modulus 9 dari no grup)
register TMOD. Hal ini dilakukan untuk mengeset mode
timer yang akan digunakan. Dengan memasukkan nilai
heksadesimal sebesar 06h, maka yang diset adalah bit {
C/~T(0) dan bit M1(0). Hal ini berarti bahwa fungsi yang sprintf(str,”%i”,TCNT0);
dijalankan adalah counter, yaitu timer yang bersangkutan lcd_gotoxy(10,0);
akan di-increment setiap transisi dari 1 ke 0 pada pin TX. lcd_puts(str);
Instruksi selanjutnya menyatakan pemidahan data if(TCCR0 != 0)
immediate FBh ke TH0 dan TL0. Setelah itu program akan {
mengeset nilai TF0 menjadi nol dengan instruksi CLEAR PORTA =0xFF;
dilanjutkan pemindahan data immediate 00h ke delay_ms (1000*TCNT0);
accumulator A. Kemudian TR0 pun akan diset ke nilai PORTA =0x00;
satu. Kemudian program akan melanjutkan ke subrutin delay_ms (1000*TCNT0);
LED1. Pada subrutin LED1 ini kita memindahkan harga }
TL0 ke accumulator A. Kemudian kami mengurangi }
immediate data FBh dari accumulator. Setelah itu instruksi }
JB akan membuat program melompat ke subrutin LED2
apabila TF0 memiliki nilai satu. Kemudian nilai
accumulator dipindahkan ke port satu. Instruksi terakhir
dalam subrutin ini adalah LJMP LED1 yang
mengindikasikan bahwa program akan melompat kembali
ke subrutin LED1. Pada subrutin LED2, nilai immediate
FFh akan dipindahkan ke port satu. Kemudian program
pun akan memanggil subrutin DELAY. Setelah kembali,
maka program akan melompat kembali ke subrutin
START. Sementara di subrutin DELAY, pertama-tama
nilai immediate 04h akan dipindahkan ke register R7.
Program akan melanjutkan ke subrutin LUP1 dengan
instruksi yang memindahkan nilai FFh ke register R6 dan
pada subrutin LUP2 yang memindahkan nilai FFh ke
register R5. Setelah itu program akan melanjutkan ke E. Menampilkan “INT Ext 0” pada OUTPUT LCD
instruksi DJNZ yang akan mengurangi register R5 dan DISPLAY ketika keypad ditekan dan menampilkan “INT
akan jump ke awal selama nilai register tidak sama dengan Ext 1” ketika keypad 2 ditekan.
nol. Di bawahnya terdapat instruksi yang sama untuk
register R6 dan R7. Selama register R6 tidak nol, maka
register tersebut akan dikurangi dan program akan
TUGAS II.C.1
#include <mega8535.h>
melompat ke subrutin LUP2. Hal yang sama dilakukan
#include <alcd.h>
untuk register R7. Program akan melompat ke subrutin
void main()
LUP1 selama nilainya tidak sama dengan nol.
{
D. Modifikasi program sebelumnya sehingga LED DDRD.2 = 0;
menyala semua selama n detik dan mati semua selama n DDRD.3 = 0;
detik begitu seterusnya ketika keypad ditekan sejumlah n PORTD.2 = 1;
kali, serta OUTPUT LCD DISPLAY menampilkan jumlah PORTD.3 = 1;
counter sebanyak n kali keypad ditekan. GICR = 0b11000000;
MCUCR = 0b00000000;
#asm(“sei”)
TUGAS II.B.2 lcd_init(16);
#include <mega8535.h> lcd_clear();
#include <alcd.h> lcd_putsf(“Ext Interrupt”);
#define F_CPU 1000000UL while(1);
#include <stdio.h> }
#include <delay.h>
char str[10]; interrupt[2]void interupsi_ext0(void)
void main() {
{ lcd_gotoxy(0,1);
DDRA = 0xFF; lcd_putsf(“INTExt 0”);
PORTA = 0xFF; }
DDRB.0 = 0; interrupt[3]void interupsi_ext1(void)
PORTB.0 = 1; {
lcd_init(16); lcd_gotoxy(0,1);
lcd_clear(); lcd_putsf(“INT Ext 1”);
lcd_putsf(“Counter 0= ”); }
TCCR0 = 0b110;
while(1)
REFERENSI

 Modul Praktikum Sistem Mikroprosesor Institut


Teknologi Del
 https://syamsul123rizal.wordpress.com/2012/02/1
4/timer-counter-atmega8535/
 https://pemudaminangkabau.wordpress.com/2013
/02/28/pengertian-mikrokontroler-atmega8535/
 http://sutondoscript.blogspot.com/2012/02/penger
tian-definisi-interrupt-adalah.html

Pada percobaan kali ini kami menggunakan port 1 pada


DT-51 MinSys sebagai port output dan menghubungkan
IS1 dengan INT0. Program kali dimulai dengan
memindahkan memori aktif ke alamat 4000H yang
merupakan alamat pada EEPROM. Hal ini dilakukan
dengan menuliskan perintah CSEG. Kemudian program
akan melompat ke subrutin START. Kemudian program
melanjutkan merotasi accumulator ke kiri. Setelah itu
program akan memindahkan accumulator ke port satu dan
memindahkan data immediate 04h ke register R7. Pada
subrutin START nilai 30h akan dipindahkan ke stack
pointer dan nilai 01h akan dipakai untuk menentukan
TCON. Pada keadaan ini bit pada register TCON yang
aktif adalah bit IT(x). Jika bit ini diaktifkan maka interupsi
eksternal akan terjadi saat terjadi transisi dari nilai 1 ke
nilai 0. Mode ini disebut juga dengan falling edge trigger.

IV. KESIMPULAN
 DT-51 MinSys dapat digunakan untuk
membuat program yang memanfaatkan
control timer dan counter.
 Register yang dapat digunakan untuk
menentukan mode timer dan control timer
antara lain TMOD, TCON, TH, dan TL.
 Timer/Counter memiliki berbagai mode yang
dapat digunakan sesuai dengan kebutuhan,
diantaranya mode 0, 1, dan 2.
 Register TMOD dan TCON merupakan
register 8 bit. Register TMOD tidak dapat
diakses per bit, sedangkan TCON dapat
diakses per bit.
 Register-register yang dapat digunakan untuk
control counter antara lain IE dan IP.
LAMPIRAN

TUGAS II.A.1
#include <mega8535.h>
void main()
{
DDRB = 0xFF;
while(1)
{
TCNT1 = 49910;
TCCR1B = 0b101;
while((TIFR & 0b00000100)==0);
TCCR1B = 0;
TIFR = 0b00000100;
PORTB = ~PORTB;
}
}

TUGAS II.B.1
#include <mega8535.h>
#include <alcd.h>
#include <stdio.h>
char str[10];
void main()
{
DDRB.0 = 0;
PORTB.0 = 1;
lcd_init(16);
lcd_clear();
lcd_putsf(“Counter 0= ”);
TCCR0 = 0b110;
while(1)
TUGAS II.A.2 {
#include <mega8535.h> sprintf(str,”%i”,TCNT0);
void main() lcd_gotoxy(10,0);
{ lcd_puts(str);
DDRB = 0xFF; }
while(1) }
{
TCNT1 = 49910;
TCCR1B = 0b101;
while((TIFR & 0b00000100)==0);
TCCR1B = 0;
TIFR = 0b00000100;
PORTB = ~PORTB;
}
}
#include <mega8535.h>
#include <alcd.h>
void main()
{
DDRD.2 = 0;
DDRD.3 = 0;
PORTD.2 = 1;
PORTD.3 = 1;
GICR = 0b11000000;
MCUCR = 0b00000000;
#asm(“sei”)
lcd_init(16);
lcd_clear();
lcd_putsf(“Ext Interrupt”);
while(1);
}
TUGAS II.B.2
#include <mega8535.h> interrupt[2]void interupsi_ext0(void)
#include <alcd.h> {
#define F_CPU 1000000UL lcd_gotoxy(0,1);
#include <stdio.h> lcd_putsf(“INTExt 0”);
#include <delay.h> }
char str[10]; interrupt[3]void interupsi_ext1(void)
void main() {
{ lcd_gotoxy(0,1);
DDRA = 0xFF; lcd_putsf(“INT Ext 1”);
PORTA = 0xFF; }
DDRB.0 = 0;
PORTB.0 = 1;
lcd_init(16);
lcd_clear();
lcd_putsf(“Counter 0= ”);
TCCR0 = 0b110;
while(1)
{
sprintf(str,”%i”,TCNT0);
lcd_gotoxy(10,0);
lcd_puts(str);
if(TCCR0 != 0)
{
PORTA =0xFF;
delay_ms (1000*TCNT0);
PORTA =0x00;
delay_ms (1000*TCNT0);
}
}
}

TUGAS II.C.1

Anda mungkin juga menyukai