Anda di halaman 1dari 62

MODUL 6

ANTARMUKA KEYPAD

TUJUAN

 Praktikan memahami pemrograman aplikasi keypad sebagai input pada


ATmega8535.
 Praktikan mampu membuat program aplikasi keypad sebagai input pada
ATmega8535.

PERALATAN YANG DIGUNAKAN

 Sebuah Personal Komputer


 Program Aplikasi Studio4
 Downloader ATmega8535
 Kit Sistem Minimum ATmega8535

TEORI

Pada bagian ini akan dibahas tentang penggunaan tombol keypad sebagai input
bagi mikrokontroler dan cara mengaplikasikannya dalam sistem minimum
ATmega8535.

KONFIGURASI KEYPAD 4X4

Pada Gambar 6.1 ditunjukkan ilustrasi susunan/konfigurasi keypad 4x4 yang


lazim. Keypad 4x4 biasa juga disebut keypad heksadesimal karena terdapat 16 tombol
yang dapat mewakili semua karakter heksadesimal dari 0 – 9 dan A – F. Untuk
keperluan tersebut, maka kita tinggal mengganti fungsi tombol ’*’ dan tombol ’#’
dengan karakter/huruf ’E’ dan ’F’ yang ada pada Gambar 6.1.

79
Gambar 6.1. Susunan/konfigurasi keypad 4x4 yang lazim

MENGAKSES KEYPAD 4X4

Pada Gambar 6.2 ditunjukkan cara menghubungkan keypad 4x4 dengan


ATmega8535. Pada contoh ini keypad 4x4 dihubungkan ke portC mikrokontroler
ATmega8535. Di samping itu ada juga LED 7-segmen yang dihubungkan dengan portB.

Gambar 6.2. Hubungan keypad 4x4 dengan mikrokontroler ATmega8535.

Untuk mendeteksi penekanan tombol yang terdapat pada keypad 4x4 tersebut,
maka harus dilakukan penyapuan (scanning). Langkah-langkah scanning dijelaskan
sebagai berikut:

Langkah 1:

80
Gambar 6.3. Inisialisasi Keypad untuk Scanning Kolom-1 dengan kode 11101111 di
PortC

- Set kondisi portC = 11101111


- Kemudian baca kondisi portC :
 Jika PC3 = 0 berarti tombol 1 tertekan
 Jika PC2 = 0 berarti tombol 4 tertekan
 Jika PC1 = 0 berarti tombol 7 tertekan
 Jika PC0 = 0 berarti tombol * tertekan
 Jika PC3 = PC2 = PC1 = PC0 = 1 berarti tidak satu pun tombol tertekan

Langkah 2:

Gambar 6.4. Inisialisasi Keypad untuk Scanning Kolom-2 dengan kode 11011111 di
PortC

- Set kondisi portC = 11011111


- Kemudian baca kondisi portC :
 Jika PC3 = 0 berarti tombol 2 tertekan
 Jika PC2 = 0 berarti tombol 5 tertekan
 Jika PC1 = 0 berarti tombol 8 tertekan

81
 Jika PC0 = 0 berarti tombol 0 tertekan
 Jika PC3 = PC2 = PC1 = PC0 = 1 berarti tidak satu pun tombol tertekan

Langkah 3 dan 4 : (dilanjutkan oleh praktikan sebagai praktikum mandiri)

Latihan Praktikum 6.1

Program berikut ini merupakan latihan praktikum untuk pengaksesan keypad 4x4 di
mana keypad dihubungkan ke port C dengan cara scanning kolom dan 7-segmen pada
port B (Gambar 13.2)

KODE INSTRUKSI KETERANGAN


;// Cprog 13.1/
;f kristal=11.0592MHz
.include "m8535def.inc"
.def temp =r22
.def dly =r23
.def dly1 =r24
.def Key =r25
.equ kol1 =0b01111111 ;inisialisasi kolom 1
.equ kol2 =0b10111111 ;inisialisasi kolom 2
.equ kol3 =0b11011111 ;inisialisasi kolom 3
.equ kol4 =0b11101111 ;inisialisasi kolom 4
.org 0x0000
rjmp utama
utama:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0xff
out ddra,r16 ;PortA = output
ldi temp,0x00 ;PortA sebagai power ke 7-segmen
out PORTA,temp
ldi r16,0xff
out ddrb,r16 ;PortB = output
ldi r16,0xc0 ;tampilkan angka nol pertama kali
out portb,r16
ldi r16,0xf0 ;PC[7:4] = output PC[3:0] = input
out ddrc,r16
loopx: rcall check_keys
rjmp loopx
; subrutin shift keypad
check_keys:
ldi temp,kol1 ;enable kolom 1
out PORTC,temp
rcall delay
sbic PINC,PC3 ;tombol "1" tertekan?
rjmp key4 ;jika tidak, cek tombol berikutnya
ldi key,0xf9 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘1’
ret
key4:
sbic PINC,PC2 ;tombol "4" tertekan?
rjmp key7 ;jika tidak, cek tombol berikutnya
ldi key,0x99 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘4’
ret
key7:
sbic PINC,PC1 ;tombol "7" tertekan?
rjmp keyF ;jika tidak, cek tombol berikutnya
ldi key,0xf8 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘7’
ret
keyF:
sbic PINC,PC0 ;tombol "*" tertekan?

82
rjmp key2 ;jika tidak, cek tombol berikutnya
ldi key,0x8e ;jika ya...
out PORTB,key ;maka kirim kode huruf ‘F’
ret
key2:
ldi temp,kol2 ;Disable kolom pertama ...
out PORTC,temp ;dan enable kolom kedua
rcall delay
sbic PINC,PC3 ;tombol "2" tertekan?
rjmp key5 ;jika tidak, cek tombol berikutnya
ldi key,0xa4 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘2’
ret
key5:
sbic PINC,PC2 ;tombol "5" tertekan?
rjmp key8 ;jika tidak, cek tombol berikutnya
ldi key,0x92 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘5’
ret
key8:
sbic PINC,PC1 ;tombol "8" tertekan?
rjmp key0 ;jika tidak, cek tombol berikutnya
ldi key,0x80 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘5’
ret
key0:
sbic PINC,PC0 ;tombol "0" tertekan?
rjmp key3 ;jika tidak, cek tombol berikutnya
ldi key,0xc0 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘0’
ret
key3:
ldi temp,kol3 ;Disable kolom kedua ...
out PORTC,temp ;dan enable kolom ketiga
rcall delay
sbic PINC,PC3 ;tombol "3" tertekan?
rjmp key6 ;jika tidak, cek tombol berikutnya
ldi key,0xb0 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘3’
ret
key6:
sbic PINC,PC2 ;tombol "6" tertekan?
rjmp key9 ;jika tidak, cek tombol berikutnya
ldi key,0x82 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘6’
ret
key9:
sbic PINC,PC1 ;tombol "9" tertekan?
rjmp keyE ;jika tidak, cek tombol berikutnya
ldi key,0x90 ;jika ya...
out PORTB,key ;maka kirim kode angka ‘9’
ret
keyE:
sbic PINC,PC0 ;tombol "#" tertekan?
rjmp keyA ;jika tidak, cek tombol berikutnya
ldi key,0x86 ;jika ya...
out PORTB,key ;maka kirim kode huruf ‘E’
ret
keyA:
ldi temp,kol4 ;Disable kolom ketiga ...
out PORTC,temp ;dan enable kolom keempat
rcall delay
sbic PINC,PC3 ;tombol "A" tertekan?
rjmp keyB ;jika tidak, cek tombol berikutnya
ldi key,0x88 ;jika ya...
out PORTB,key ;maka kirim kode huruf ‘A’
ret
keyB:
sbic PINC,PC2 ;tombol "B" tertekan?
rjmp keyC ;jika tidak, cek tombol berikutnya
ldi key,0x83 ;jika ya...
out PORTB,key ;maka kirim kode huruf ‘B’
ret
keyC:
sbic PINC,PC1 ;tombol "C" tertekan?

83
rjmp keyD ;jika tidak, cek tombol berikutnya
ldi key,0xc6 ;jika ya...
out PORTB,key ;maka kirim kode huruf ‘C’
ret
keyD:
sbic PINC,PC0 ; tombol "D" tertekan?
rjmp check_keys ;jika tidak, cek tombol berikutnya
ldi key,0xa1 ;jika ya...
out PORTB,key ;maka kirim kode huruf ‘D’
ret
; Subrutin Delay
delay: ldi dly,0x10
dl1: ldi dly1,0xff
dl2: dec dly1
cpi dly1,0x00
brne dl2
dec dly
cpi dly,0x00
brne dl1
ret

TUGAS PENDAHULUAN

Buatlah program untuk melakukan scanning baris keypad 4x4 untuk baris 1 dan baris 2
saja, dan tampilkan ke LED 7-segmen setiap tombol angka yang ditekan yang mewakili
masing-masing nomor tombol.

PRAKTIKUM MANDIRI

1. Buatlah program untuk melakukan scanning kolom keypad 4x4 untuk kolom ke-2
dan kolom ke-3, dan tampilkan ke LED 7-segmen setiap tombol angka yang ditekan
yang mewakili masing-masing nomor tombol.
2. Buatlah program untuk melakukan scanning baris keypad 4x4 untuk baris ke-3 dan
baris ke-4, dan tampilkan ke LED 7-segmen setiap tombol angka yang ditekan yang
mewakili masing-masing nomor tombol.

84
LEMBAR LAPORAN/JURNAL PRAKTIKUM – MODUL 6
Praktikum Mandiri:
1.

Algoritma/flowchart dan Coding

85
2.

Algoritma/flowchart dan Coding

86
PERTANYAAN KESIMPULAN

A. Jelaskan perbedaan mendasar scanning baris dan scannig kolom pada praktikum
keypad 4x4
B. Jelaskan fungsi/manfaat dari program praktikum mandiri yang anda buat di atas.

87
MODUL 7
TIMER / COUNTER

TUJUAN

 Praktikan memahami pengoperasian timer/counter


 Praktikan mampu menerapkan timer/counter

PERALATAN YANG DIGUNAKAN

 Sebuah Personal Komputer


 Program Aplikasi Studio4

TEORI

Timer/Counter1

Timer/Counter1 merupakan timer/counter yang memiliki lebar 16-bit yang


dapat memberikan program pewaktuan yang lebih besar. Register Timer1 dibagi
menjadi 2 buah register masing-masing 8-bit yaitu TCNT1L (Timer1 byte bawah) dan
TCNT1H (Timer1 byte atas). Dan juga terdapat dua register kontrol yaitu TCCR1A dan
TCCR1B (lihat Gambar 7.1). Ada dua register OCR dalam Timer1 yaitu OCR1A dan
OCR1B (keduanya 16-bit). Ada dua buah flag pada OCR yang masing-masing bekerja
terpisah satu sama lain. Ketika TCNT1 sama dengan OCR1A, maka pada siklus clock
berikutnya flag OCF1A akan set. Ketika TCNT1 sama dengan OCR1B,maka pada siklus
clock berikutnya flag OCF1B akan set. Register 16-bit OCR1A terbagi dua buah register
8-bit yaitu register OCR1AH (OCR1A byte atas) dan OCR1AL (OCR1A byte bawah)
Fitur-fitur Timer/Counter1 sebagai berikut:
 Desain 16-bit (juga bisa untuk PWM 16-bit)
 Dua unit pembanding (compare unit)
 Dua register pembanding (comparator)
 Satu input capture unit
 Timer di-reset ketika match compare (auto reload)
 Dapat menghasilkan gelombang PWM dengan glitch-free
 Perioda PWM yang dapat diubah-ubah
 Pembangkitan frekuensi
 Empat sumber interupsi (TOV1, OCF1A, OCF1B dan ICF1)

88
Gambar 7.1 Diagram blok Timer1 AVR ATmega8535

Seperti yang dijelaskan sebelumnya, fitur input capture digunakan untuk meng-
capture karakteristik/perilaku dari suatu sinyal input, termasuk perioda, frekuensi,
duty cycle atau panjang pulsa. Hal ini diselesaikan oleh monitoring untuk user-specified
edge pada pin ICP1 mikrokontroler. Bila tebing clock (edge) yang dikehendaki terjadi
maka nilai register Timer/Counter1 (TCNT1) di-capture dan disimpan pada Input
Capture Register1 (ICR1).

REGISTER TIMER1

Register-register yang terdapat pada Timer1 ditunjukkan dalam Gambar 7.2.


Setiap register akan dijelaskan berikut.

1. Register TCCR1A dan TCCR1B. Register TCCR1 digunakan untuk:

 Memilih mode operasional Timer1menggunakan bit-bit Waveform Mode


Generation (WGM1[3:0])
 Menentukan operasi timer dalam mode khusus dengan bit-bit Compare Match
Output Mode (Kanal A, COM1A[1:0]; dan Kanal B, COM1B[1:0]), dan
 Memilih sumber clock Timer1 menggunakan bit-bit CS1[2:0]

Setting bit untuk register TCCR1A dan TCCR1B dapat dilihat pada ringkasan Gambar
7.2.

89
Gambar 7.2 Register TCCR1A dan TCCR1B

Mikrokontroler AVR ATmega8535 mempunyai timer/counter1 yang dapat


dijelaskan seperti pada Gambar 7.2.

2. Register Kontrol TCCR1A

Gambar 7.3 Register timer TCCR1A

90
Pengaturan Timer/Counter1 melalui register kontrol TCCR1A sebagai berikut:

 Bit 7, 6 – COM1A1, COM1A0: Compare Output Mode for Channel A

 Bit 5, 4 – COM1B1, COM1B0: Compare Output Mode for Channel B


Bit-bit COM1A1, COM1A0 dan COM1B1, COM1B0 mengontrol tingkahlaku pin-pin
Out Compare (berturut-turut OC1A dan OC1B). Jika satu atau kedua bit COM1A1,
COM1A0 ditulisi satu, maka output OC1A mengesampingkan fungsional port
normal dari pin I/O yang dikoneksikan padanya. Jika satu atau kedua bit COM1B1,
COM1B0 ditulisi satu, maka output OC1B mengesampingkan fungsional port
normal dari pin I/O yang dikoneksikan padanya. Namun demikian, catatan bahwa
bit DDR (data direction register) bersesuaian dengan pin OC1A atau OC1B harus di-
set untuk meng-enable output driver.
Bila OC1A atau OC1B dikoneksikan ke pin, fungsi bit COM1x1, COM1x0
bergantung dari setting bit WGM13 s/d WGM10. Tabel 7.1 menunjukkan
fungsional bit COM1x1, COM1x0 bila bit-bit WGM13, WGM10 di-set ke mode
normal atau mode CTC (non-PWM).

Tabel 7.1. Compare Output Mode, non-PWM

Pada Tabel 7.2 ditunjukkan fungsional bit COM1x1, COM1x0 ketika bit-bit WGM13
s/d WGM10 di-set ke fast PWM mode.

Tabel 7.2. Compare Output Mode, Fast PWM(1)

Catatan : 1. Suatu keadaan khusus terjadi jika OCR1A/OCR1B sama dengan TOP dan COM1A1/COM1B1 set.
Pada keadaan ini, Compare Match diabaikan, tetapi set atau clear dikerjakan pada TOP.

Pada Tabel 7.3 ditunjukkan fungsional bit COM1x1, COM1x0 ketika bit-bit WGM13 s/d
WGM10 di-set ke phase correct atau ke phase and frequency correct, PWM mode.

91
Tabel 7.3. Compare Output Mode, Phase Correct and Phase and Frequency Correct
PWM(1)

Catatan : 1. Suatu keadaan khusus terjadi jika OCR1A/OCR1B sama dengan TOP dan COM1A1/COM1B1 set.

 Bit 3 – FOC1A: Force Output Compare for Channel A

 Bit 2 – FOC1B: Force Output Compare for Channel B


Bit-bit FOC1A/FOC1B hanya aktif bila bit-bit WGM13 s/d WGM10 menetapkan
sebuah mode non-PWM. Namun demikian, untuk menjamin kompatibilitas dengan
divais yang akan datang, bit-bit ini harus di-set ke nol bila TCCR1A ditulisi ketika
beroperasi pada mode PWM. Bila penulisan logika satu ke bit FOC1A/FOC1B, maka
sebuah immediate Compare Match didorong pada unit pembangkitan
bentukgelombang. Output OC1A/OC1B diubah sesuai dengan setting bit-bit
COM1x1, COM1x0. Catatan bahwa bit-bit FOC1A/FOC1B diimplementasikan
sebagai strobe. Karena itu nilai berada pada bit-bit COM1x1, COM1x0 yang
menentukan pengaruh forced compare.
Sebuah strobe FOC1A/FOC1B tidak akan membangkitkan interupsi apapun atau
tidak akan meng-clear timer pada Clear Timer on Compare Match (CTC) mode
menggunakan OCR1A sebagai TOP.
Bit-bit FOC1A/FOC1B selalu dibaca sebagai nol.

 Bit 1, 0 – WGM11, WGM10: Waveform Generation Mode


Dikombinasikan dengan bit-bit WGM13, WGM12 diperoleh pada register TCCR1B,
bit-bit ini mengontrol urutan pencacahan counter, sumber untuk nilai counter
(TOP) maksimum, dan jenis pembangkit gelombang yang digunakan dapat dilihat
pada Tabel 7.4. Mode-mode operasi yang didukung oleh unit Timer/Counter
adalah: Normal mode (counter), Clear Timer on Compare Match (CTC) mode, dan
tiga jenis mode PWM.

Tabel 7.4. Penjelasan bit mode pembangkitan bentukgelombang(1)

92
Catatan : 1. Nama-nama defenisi bit CTC1 dan PWM11, PWM10 sudang tidak digunakan (usang). Digunakan
defenisi WGM12, WGM10. Namun demikian, fungsional dan lokasi bit-bit ini compatible dengan versi timer
sebelumnya.

3. Register Kontrol TCCR1B

Gambar 7.4 Register timer TCCR1B

 Bit 7 – ICNC1: Input Capture Noise Canceler


 Bit 6 – ICES1: Input Capture Edge Select
 Bit 5 – Reserved Bit
 Bit 4:3 – WGM13:2: Waveform Generation Mode
 Bit 2, 1, 0 – CS12, CS11, CS10: Clock Select.Ketiga bit Clock Select ini memilih
sumber clock yang akan digunakan untuk Timer/Counter. Setting ini dapat dilihat
pada Tabel 7.5 berikut:

Tabel 7.5. Penjelasan bit untuk Clock Select

93
4. Register TCNT1

TCNT1 Timer/Counter1 Register digunakan untuk menyimpan nilai timer yang


diinginkan. TCNT1 dibagi menjadi 2 register 8 bit yaitu TCNT1H dan TCNT1L.

Gambar 7.5 Register timer TCNT1 (16-bit)

5. Register TIMSK

Timer Interrupt Mask Register (TIMSK) dan Timer Interrupt Flag (TIFR) Register
digunakan untuk mengendalikan interrupt mana yang diaktifkan dengan cara
melakukan setting pada TIMSK dan untuk mengetahui interrupt mana yang sedang
terjadi.

Gambar 7.6 Register timer TIMSK

Bit Simbol Fungsi


7 OCIE2 Timer/Counter2 Output Compare Match Interrupt Enable
6 TOIE2 Timer/Counter2 Overflow Interrupt Enable
5 TICIE1 Timer1 Input Capture Interrupt Enable
4 OCIE1A Timer/Counter1A Output Compare Match Interrupt
Enable
3 OCIE1B Timer/Counter1B Output Compare Match Interrupt
Enable
2 TOIE1 Timer/Counter1 Overflow Interrupt Enable.
1 OCIE0 Timer/Counter0 Output Compare Match Interrupt Enable
0 TOIE0 Timer/Counter0 Overflow Interrupt Enable

94
 Bit 5 – TICIE1: Timer/Counter1, Input Capture Interrupt Enable
Bila bit ini ditulisi satu dan I-flag dalam Status Register di-set (interupsi global
di-enable), maka Timer/Counter1 Input Capture interrupt di-enable.

 Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable


Bila bit ini ditulisi satu dan I-flag dalam Status Register di-set (interupsi global
di-enable), maka Timer/Counter1 Output Compare A Match Interrupt di-enable.

 Bit 3 – OCIE1B: Timer/Counter1, Output Compare B Match Interrupt Enable


Bila bit ini ditulisi satu dan I-flag dalam Status Register di-set (interupsi global
di-enable), maka Timer/Counter1 Output Compare B Match Interrupt di-enable.

 Bit 2 – TOIE1: Timer/Counter1, Overflow Interrupt Enable


Bila bit ini ditulisi satu dan I-flag dalam Status Register di-set (interupsi global
di-enable), maka Timer/Counter1 Overflow Interrupt di-enable.

6. Register TIFR

TimerInterrupt Mask Register (TIMSK) dan TimerInterrupt Flag (TIFR) Register


digunakan untuk mengendalikan interrupt mana yang diaktifkan dengan cara
melakukan setting pada TIMSK dan untuk mengetahui interrupt mana yang sedang
terjadi.

Gambar 7.7 Register timer TIFR

Bit Simbol Fungsi


7 OCF2 Output Compare Flag2.
6 TOV2 Timer/Counter2 Overflow Flag
5 ICF1 Timer1 Input Capture Interrupt
Flag
4 OCF1A Output Compare Flag1A
3 OCF1B Output Compare Flag1B
2 TOV1 Timer/Counter1 Overflow Flag
1 OCF0 Output Compare Flag0
0 TOV0 Timer/Counter0 Overflow Flag

 Bit 5 – ICF1: Timer/Counter1, Input Capture Flag


Flag ini set jika terjadi sebuah capture event pada pin ICP1. Jika Input Capture
Register (ICR1) di-set oleh WGM13 s/d WGM10 yang akan digunakan sebagai

95
nilai TOP, maka ICF1 Flag di-set jika counter mencapai nilai TOP. ICF1 secara
otomatis di-clear jika Input Capture Interrupt Vector dieksekusi.
Alternatifnya, ICF1 dapat di-clear dengan penulisan logika ke lokasi bit nya.

 Bit 4 – OCF1A: Timer/Counter1, Output Compare A Match Flag


Flag ini di-set dalam siklus clock timer setelah nilai counter (TCNT1) sesuai
dengan Output Compare Register A (OCR1A). Catatan bahwa dengan memaksa
strobe pada Output Compare (FOC1A) tidak akan men-set OCF1A Flag. OCF1A
secara otomatis di-clear jika vektor interupsi Output Compare Match A
dieksekusi.
Alternatifnya, OCF1A dapat di-clear dengan menuliskan logika satu ke lokasi bit
nya.

 Bit 3 – OCF1B: Timer/Counter1, Output Compare B Match Flag


Flag ini di-set dalam siklus clock timer setelah nilai counter (TCNT1) sesuai
dengan Output Compare Register B (OCR1B). Catatan bahwa dengan memaksa
strobe pada Output Compare (FOC1B) tidak akan men-set OCF1B Flag. OCF1B
secara otomatis di-clear jika vektor interupsi Output Compare Match B
dieksekusi.
Alternatifnya, OCF1B dapat di-clear dengan menuliskan logika satu ke lokasi bit
nya.

 Bit 2 – TOV1: Timer/Counter1, Overflow Flag


Setting flag ini tergantung pada setting bit-bit WGM13 s/d WGM10. Pada mode
normal dan mode CTC, TOV1 Flag di-set jika timer overflow. TOV1 secara
otomatis di-clear jika vektor interupsi Timer/Counter1 Overflow dieksekusi.
Alternatifnya, TOV1 dapat di-clear dengan menulis logika ke lokasi bit nya.

MODE OPERASI TIMER1

Bit-bit WGM13, WGM12, WGM11, WGM10 (atau dituliskan WGM13:10)


digunakan untuk menetapkan Mode Timer1 (lihat Tabel 7.9). Pada Tabel 7.9
ditunjukkan ada 16 macam mode Timer1 yang bisa dipilih sesuai kebutuhan
pemrogram. Salah satu dari mode-mode tersebut adalah mode 13 merupakan mode
yang tidak dapat diimplementasikan karena mode 13 adalah cadangan. Pada bab ini
kita hanya akan membahas dua mode saja yaitu Mode Normal (mode 0) dan Mode CTC
(mode 4).

1. Timer1 Mode Normal

Pada mode normal, TCNT1 akan menghitung naik dan membangkitkan


interrupt Timer/Counter1 ketika nilainya berubah dari $FFFF ke $0000. Pada saat
terjadi roll over dari FFFFh ke 0000h maka flag TOV1 menjadi set (lihat Gambar
7.8). Seringkali kita menganggap untuk menggunakan timer cukup dengan
memasukkan nilai yang diinginkan ke TCNT1 dan menunggu sampai terjadi
interrupt. Ini menjadi benar pada timer yang menghitung mundur, tetapi untuk
96
timer yang menghitung maju, maka kita harus memasukkan nilai 65536 sebagai
nilai ke dalam TCNT1.

Gambar 7.8 Timer/Counter1 Mode Normal

LANGKAH-LANGKAH PEMROGRAMAN TIMER1 MODE NOMAL

Untuk membangkitkan waktu tunda dengan Timer1 mode normal, ikuti diagram alir
langkah-langkah pengaktifan pada Gambar 7.9.

97
Gambar 7.9 Diagram Alir Langkah-langkah Penggunaan Timer1 Mode Normal

Untuk menghitung waktu tunda yang dibangkitkan oleh Timer1 mode normal
tanpa prescaler digunakan persamaan berikut:

Waktu Tunda = N x (65536 – D) x 1/fclock ………..……………. (7.1)

di mana :
D : Nilai yang akan dimasukkan ke register TCNT1
Fclock : Frekuensi clock (kristal) yang digunakan (Hz)
N : Prescaler (1, 8, 64, 256, 1024)
1+65535 : Nilai maksimum timer adalah 65535 dan overflow saat 65535 ke 0000h

Pada Tabel 7.6 diberikan rangkuman beberapa waktu tunda Timer1 mode normal.

98
Tabel 7.6 Beberapa Waktu Tunda Timer1 Mode Normal
Frekuensi Persamaan Waktu Tunda (WT) Waktu Tunda
PRESCALE osilator/ TCNT0 = D Maksimum
R Kristal (D = 0)
1 MHz WT = (65536 – D) x 1 µs 65,536ms
4 MHz WT = (65536 – D) x 0,25 µs 16,384ms
Tanpa 8 MHz WT = (65536 – D)x 0,125 µs 8,192ms
prescaler 10 MHz WT = (65536 – D)x 0,1 µs 6,5536ms
16 MHz WT = (65536 – D)x 0,0625 µs 4,096ms
1 MHz WT = 8 x (65536 – D)x 1 µs 524,288 ms
4 MHz WT = 8 x (65536 – D)x 0,25 µs 131,072 ms
8 8 MHz WT = 8 x (65536 – D)x 0,125 µs 65,536ms
10 MHz WT = 8 x (65536 – D)x 0,1 µs 52,4288 ms
16 MHz WT = 8 x(65536 – D) x 0,0625 32,768 ms
µs
1 MHz WT = 64 x (65536 – D)x 1 µs 4194,304 ms
4 MHz WT = 64 x (65536 – D)x 0,25 µs 1048,576 ms
64 8 MHz WT = 64 x (65536 – D)x 0,125 524,288 ms
µs
10 MHz WT = 64 x (65536 – D)x 0,1 µs 419,4304 ms
16 MHz WT = 64 x (256 – D) x 0,0625 µs 262,144 ms
1 MHz WT = 256 x (65536 – D)x 1 µs 16777,216 ms
4 MHz WT = 256 x (65536 – D)x 0,25 4194,304 ms
256 µs
8 MHz WT = 256 x (65536 – D)x 0,125 2097,152 ms
µs
10 MHz WT = 256 x (65536 – D)x 0,1 µs 1677,7216 ms
16 MHz WT = 256 x (65536 – D)x 0,0625 1048,576 ms
µs
1 MHz WT = 1024 x (65536 – D)x 1 µs 67108,864 ms
4 MHz WT = 1024 x (65536 – D)x 0,25 16777,216 ms
1024 µs
8 MHz WT = 1024 x (65536 – D)x 0,125 8388,608 ms
µs
10 MHz WT = 1024 x (65536 – D)x 0,1 6710,8864 ms
µs
16 MHz WT = 1024 x (65536 – D)x 4194,304 ms
0,0625 µs

LATIHAN PRAKTIKUM 7.1


Buat program Timer1 mode normal menggunakan frekuensi osilator 8 MHz
untuk membangkitkan gelombang kotak (duty cycle 50%) dengan frekuensi 0,5
Hz. Sinyal ini keluar melalui PORTB.3 (PB3). Abaikan overhead waktu tunda
yang ditimbulkan instruksi.
SOLUSI:

99
 Perioda sinyal yang keluar pada PB3 = T = 1/0,5Hz = 2 detik

 Sinyal gelombang kotak mempunyai duty cycle 50%, jadi TH =0,50xT=0,5 x 2 s=1 s, TL
= T − TH = 2 s – 1 s = 1 s

 Dari Tabel 7.6: Untuk membangkitkan waktu tunda 1 detik pada kristal 8 MHz maka
diperlukan prescaler 256, jadi WT = 256 x (65536 – D) x 0,125 µs; 1 s = 256 x
(65536 – D) x 0,125 µs;D = 34286; Jadi TCNT1 = 0x85EE

 TCCR1A = 0b00000000 (WGM11 = 0 WGM10 = 0)


TCCR1B = 0b00000100 (WGM13 = 0, WGM12 = 0, CS12 = 1, CS11 = 0,
CS10 = 0) sumber clock osilator, dengan prescaler 256.

 Program listing sebagai berikut:


KODE INSTRUKSI KETERANGAN
;f kristal = 8 MHz
.include "m32def.inc"
.org 0
LDI r16,low(RAMEND)
OUT SPL,r16
LDI r16,high(RAMEND)
OUT SPH,r16
SBI DDRB,3 ;inisialisasi PORTB.3 (PB3) sebagai output
ULANG:
CBI PortB,3 ;clear bit PORTB.3 (PB3 = 0)
RCALL TUNDA ;eksekusi waktu tunda
SBI PortB,3 ;set bit PORTB.3 (PB3 = 1)
RCALL TUNDA ;eksekusi waktu tunda
RJMP ULANG ;loop seterusnya
;----------------
; Subrutin TUNDA
;----------------
TUNDA:
LDI R16,0xEE
OUT TCNT1L,R16 ;load nilai TCNT1L (byte bawah)
LDI R16,0x85
OUT TCNT1H,R16 ;load nilai TCNT1HL (byte atas)
LDI R16,0x00
OUT TCCR1A,R16 ;WGM11:10 = 00

100
LDI R16,0B00000100
OUT TCCR1B,R16 ;WGM13:12 = 00, CS10 = 1:mode normal, prescaler 256
TUNGGU:
IN R16,TIFR ;baca register TIFR
SBRS R16,TOV1 ;skip ke instruksi berikutnya jika TOV1 set
RJMP TUNGGU
LDI R16,0X00
OUT TCCR1A,R16
OUT TCCR1B,R16 ;matikan timer1
LDI R16,0b00000100 ;atau LDI R16,(1<<TOV1)
OUT TIFR,R16 ;flag TOV1 dinolkan dengan memberi logika 1
RET

TUGAS PENDAHULUAN

Buat program untuk menyalakan dan mematikan LED dengan selang waktu 0,75 detik.
Gunakan Timer1 mode normal dengan frekuensi osilator 12 MHz.

LATIHAN PRAKTIKUM 7.1


Buat program Timer1 mode normal menggunakan frekuensi osilator 8 MHz
untuk membangkitkan gelombang kotak (duty cycle 50%) dengan frekuensi 0,5
Hz. Sinyal ini keluar melalui PORTB.3 (PB3). Abaikan overhead waktu tunda
yang ditimbulkan instruksi.
SOLUSI:
 Perioda sinyal yang keluar pada PB3 = T = 1/0,5Hz = 2 detik

 Sinyal gelombang kotak mempunyai duty cycle 50%, jadi TH =0,50xT=0,5 x 2 s=1 s, TL
= T − TH = 2 s – 1 s = 1 s

 Dari Tabel 7.6: Untuk membangkitkan waktu tunda 1 detik pada kristal 8 MHz maka
diperlukan prescaler 256, jadi WT = 256 x (65536 – D) x 0,125 µs; 1 s = 256 x
(65536 – D) x 0,125 µs;D = 34286; Jadi TCNT1 = 0x85EE

 TCCR1A = 0b00000000 (WGM11 = 0 WGM10 = 0)


TCCR1B = 0b00000100 (WGM13 = 0, WGM12 = 0, CS12 = 1, CS11 = 0,
CS10 = 0) sumber clock osilator, dengan prescaler 256.

101
 Program listing sebagai berikut:
KODE INSTRUKSI KETERANGAN
;f kristal = 8 MHz
.include "m32def.inc"
.org 0
LDI r16,low(RAMEND)
OUT SPL,r16
LDI r16,high(RAMEND)
OUT SPH,r16
SBI DDRB,3 ;inisialisasi PORTB.3 (PB3) sebagai output
ULANG:
CBI PortB,3 ;clear bit PORTB.3 (PB3 = 0)
RCALL TUNDA ;eksekusi waktu tunda
SBI PortB,3 ;set bit PORTB.3 (PB3 = 1)
RCALL TUNDA ;eksekusi waktu tunda
RJMP ULANG ;loop seterusnya
;----------------
; Subrutin TUNDA
;----------------
TUNDA:
LDI R16,0xEE
OUT TCNT1L,R16 ;load nilai TCNT1L (byte bawah)
LDI R16,0x85
OUT TCNT1H,R16 ;load nilai TCNT1HL (byte atas)
LDI R16,0x00
OUT TCCR1A,R16 ;WGM11:10 = 00
LDI R16,0B00000100
OUT TCCR1B,R16 ;WGM13:12 = 00, CS10 = 1:mode normal, prescaler 256
TUNGGU:
IN R16,TIFR ;baca register TIFR
SBRS R16,TOV1 ;skip ke instruksi berikutnya jika TOV1 set
RJMP TUNGGU
LDI R16,0X00
OUT TCCR1A,R16
OUT TCCR1B,R16 ;matikan timer1
LDI R16,0b00000100 ;atau LDI R16,(1<<TOV1)
OUT TIFR,R16 ;flag TOV1 dinolkan dengan memberi logika 1
RET

. PRAKTIKUM MANDIRI

Buat program untuk menyalakan dan mematikan LED dengan selang waktu 0,5 detik.
Gunakan Timer1 mode normal dengan frekuensi Kristal osilator sesuai perangkat keras
sistem minimum yang digunakan dalam laboratorium.

102
LEMBAR LAPORAN/JURNAL PRAKTIKUM – MODUL 6
Praktikum Mandiri:
1.

Algoritma/flowchart dan Coding

103
PERTANYAAN KESIMPULAN

A. Jelaskan perbedaan mendasar dari latihan praktikum 7.1 dengan praktikum mandiri
B. Jelaskan fungsi/manfaat dari pemrograman timer.

104
MODUL 8
PWM

TUJUAN

 Praktikan memahami pengoperasian PWM


 Praktikan mampu menerapkan PWM

PERALATAN YANG DIGUNAKAN

 Sebuah Personal Komputer


 Program Aplikasi Studio4

TEORI

Salah satu fitur yang dimiliki AVR ATMega8535 adalah adanya PWM (pulse
width modulation) yang berfungsi untuk menghasilkan pulsa-pulsa yang dapat diatur
lebarnya berdasarkan penggunaan timer/counter yang sudah ada. Pulsa PWM
merupakan salah satu cara yang baik dan mudah dalam mengemudikan atau mengatur
kecepatan motor DC, mengatur pemicuan dan penyalaan lampu strobo atau LED
misalnya.
Salah satu aplikasi sinyal PWM adalah pengontrolan torsi dan kecepatan motor
DC yang berbeda dengan teknik lainnya. Daya disuplai ke motor dalam bentuk sinyal
gelombang persegi yang amplitudanya konstan tetapi lebar pulsanya atau duty cycle
berubah-ubah. Duty cycle adalah persentasi waktu pulsa high terhadap perioda pulsa.
Gambar 8.1 menunjukkan bentukgelombang untuk empat kecepatan berbeda. Untuk
kecepatan yang paling rendah (lambat), daya disuplai pada seperempat waktu siklus
(duty cycle 25%). Untuk duty cycle 50% (daya pada separuh waktu), motor akan
berputar pada kecepatan setengah dan seterusnya. Pada praktisnya, faktor nonlinear
menyebabkan motor berputar lebih lambat dari proporsi yang seharusnya.

Gambar 8.1 Bentukgelombang PWM

105
Dalam mendesain pembangkit sinyal PWM dasarnya adalah timer/counter yang
telah dibahas sebelumnya. Pemilihan timer mode PWM diatur melalui bit WGM01 dan
bit WGM00 pada register TCCR0 (Tabel 8.1).

Tabel 8.1 Konfigurasi Mode bit Pembangkitan Gelombang

Keluaran sinyal PWM pada Timer/Counter0 diambil dari pin OC0. Ketika nilai
TCNT0 sama dengan nilai OCR0, maka keluaran pin OC0 akan berlogika 0 atau 1
tergantung pada pemilihan mode PWM. Pemilihan mode ini dapat dilakukan apakah
mode normal atau mode inverted PWM. Pemilihan mode ini diatur melalui bit COM01
dan bit COM00 pada register TCCR0 yang dapat dilihat pada Tabel 8.2.

Tabel 8.2. Konfigurasi bit COM01 dan COM00 Compare Output Mode, Phase Correct
PWM

Fast PWM Timer/Counter0

Pada Fast PWM, counter melakukan pencacahan serupa yang dilakukan pada
mode normal. Setelah timer mulai diaktifkan maka akan mulai terjadi pencacahan.
Pencacahan menaik hingga mencapai batas 0xFF. Ketika terjadi roll over dari 0xFF ke
0x00 maka TOV0 flag akan diset HIGH.

106
Gambar 8.2 Pulsa pada Fast PWM Timer/Counter0

Fast PWM dalam Timer/Counter0 digunakan untuk mengendalikan waktu t on dan off
melalui isi register pembanding OCR0 yang akan berakibat kepada nilai duty cycle yang
dihasilkan. Port atau kanal keluaran yang digunakan untuk PWM timer/counter0
adalah pin PB3 (OC0). Dalam mode Fast PWM, karakteristik cacahan register pencacah
TCNT0 mencacah dari BOTTOM (0x00) hingga mencacah naik mencapai MAX (0xff)
kemudian mulai dari BOTTOM lagi dan demikian seterusnya. Cacahan ini dinamakan
single slope yang mencacah satu arah saja.
Pada mode PWM non-inverting, output pada pin OC0 (PB3) di-clear pada saat
compare match (TCNT0=OCR0) dan di-set pada saat BOTTOM (TCNT0=0x00).
Pada mode PWM inverting, output pada pin OC0 (PB3) di-set pada saat
compare match (TCNT0==OCR0) dan di-clear pada saat BOTTOM (TCNT0=0x00).
Perbedaan Fast PWM non-inverting dan inverting yang dapat dilihat adalah
bentuk pulsanya, dimana PWM non-inverting yang dikendalikan adalah lama t on nya
melalui isi register OCR0 sedangkan PWM inverting yang dikendalikan adalah lama t off
nya melalui isi register OCR0.
Besarnya frekuensi yang muncul pada pin OC0 (PB3) untuk Fast PWM dihitung
menggunakan persamaan 8.1 berikut:

fOCnPWM = fclk_I/O / (N x 256) ............. (8.1)

di mana fclk_I/O adalah frekuensi clock chip yang digunakan, N adalah prescaler sumber
clock yang digunakan (1, 8, 64, 256, 1024).
Ketika Timer/Counter0 sedang beroperasi, kita dapat mengubah isi register
OCR0 namun efeknya satu siklus pulsa PWM akan tidak simetris.
Untuk menghitung duty cycle Fast PWM0 dengan mode non-inverting
digunakan persamaan 8.2 berikut:

DC(F_PWM0)non-inv = [(1+OCR0)/256] x 100% ............. (8.2)

107
Dengan cara yang serupa maka duty cycle Fast PWM0 dengan mode inverting
digunakan persamaan 8.3 berikut:

DC(F_PWM0)inv = [(255 - OCR0)/256] x 100% ............. (8.3)

Gambar 8.3 Register TCCR0 dan Mode Fast PWM

Pada Gambar 8.3 kita dapat melihat reaksi pembangkit gelombang jika terjadi
compare match ketika timer dalam mode Fast PWM.

Contoh 8.1
Hitunglah nilai OCR0 untuk membangkitkan gelombang dengan duty cycle 75%
SOLUSI:
DC(F_PWM0)non-inv = [(1+OCR0)/256] x 100%
75% = [(1 + OCR0)/256] x 100%  1 + OCR0 = 192  OCR0 = 191 (0xBF)

Contoh 8.2
Tentukanlah nilai TCCR0 untuk menginisialisasi Timer0 mode Fast PWM,

108
pembangkit gelombang PWM non-inverting, dan tanpa prescaler.
SOLUSI:
Dengan merujuk pada Error! Reference source not found., maka diperoleh sbb:
WGM01:00 = 11 = mode Fast PWM CS02:00 = 001 = tanpa prescaler
COM01:00 = 10 = PWM non-inverting

Jadi nilai register TCCR0 = 0x69

LATIHAN PRAKTIKUM 8.1


Buatlah sebuah program Fast PWM Timer0 yang membangkitkan gelombang
dengan frekuensi 31,25 kHz. dan duty cycle 75% non-inverting. Gunakan kristal
8 MHz.
SOLUSI:
fOC0PWM = fclk_I/O / (N x 256)
31250Hz = 8000000Hz/(N x 256)  N = 1.
Karena diperoleh N=1, berarti tanpa prescaler

KODE INSTRUKSI KETERANGAN


;f kristal = 8 MHz
.include ”m32def.inc”
.org 0
LDI r16,low(RAMEND)
OUT SPL,r16
LDI r16,high(RAMEND)
OUT SPH,r16

109
sbi DDRB,3 ;inisialisasi PB3 sebagai output
ldi r16,191 ;nilai 191 berasal dari contoh 8.1 (duty cycle 75%)
out OCR0,r16
ldi r16,0x69 ;nilai 0x69 berasal dari contoh 8.2
OUT TCCR0,R16 ;mode Fast PWM, tanpa prescaler dan non-inverting
LOOP: rjmp LOOP

. TUGAS PENDAHULUAN

Buatlah sebuah program Fast PWM Timer0 yang membangkitkan gelombang dengan
frekuensi 4 kHz. dan duty cycle 25% non-inverting. Gunakan kristal 12 MHz (atau
sesuai arahan dosen/asisten)

. PRAKTIKUM MANDIRI

Buatlah sebuah program Fast PWM Timer0 yang membangkitkan gelombang dengan
frekuensi 6 kHz. dan duty cycle 75% non-inverting. Gunakan kristal 12 MHz (atau
sesuai arahan dosen/asisten).

110
LEMBAR LAPORAN/JURNAL PRAKTIKUM – MODUL 8
Praktikum Mandiri:
1.

Algoritma/flowchart dan Coding

111
PERTANYAAN KESIMPULAN

A. Jelaskan perbedaan mendasar dari latihan praktikum 8.1 dengan praktikum mandiri
nomor 1.
B. Jelaskan fungsi/manfaat dari pemrograman timer.

112
MODUL 9
ANTARMUKA LCD KARAKTER

TUJUAN

 Praktikan memahami rangkaian interface mikrokontroler dengan LCD karakter 2x16


 Praktikan memahami program assembly data ke LCD karakter 2x16
 Praktikan dapat mencetak karakter pada posisi baris dan kolom tertentu

PERALATAN YANG DIGUNAKAN

 Sebuah Personal Komputer


 Program Aplikasi Studio4
 Program Downloader ATMEGA8535
 Perangkat Downloader ATMEGA8535
 Sistem minimum ATMEGA8535
 Modul LCD

TEORI

LCD (liquid crystal display) yang akan kita gunakan adalah LCD yang hanya
dapat menampilkan karakter. LCD tersebut yang mempunyai tampilan dengan lebar 16
kolom dan 2 baris atau biasa disebut sebagai LCD karakter 16x2, dengan 16 pin
konektor, yang didefinisikan seperti pada Tabel 9.1.

Tabel 9.1. Fungsi dan konfigurasi pin-pin LCD 16x2


Pin Nama Fungsi
1 VSS Ground
2 VCC +5V
3 VEE Tegangan kontras
4 RS Register Select
0 = Register instruksi 1 = Register data
5 R/W Read/ Write, untuk memilih mode tulis atau
baca ; 0 = mode tulis 1 = mode baca
6 E Enable
0 = enable (mulai menahan data ke LCD)
1= disable
7 DB0 Data bit 0, LSB
8 DB1 Data bit 1
9 DB2 Data bit 2
10 DB3 Data bit 3
11 DB4 Data bit 4
12 DB5 Data bit 5
13 DB6 Data bit 6
14 DB7 Data bit 7, MSB
15 BPL Back Plane Light
113
16 GND Ground

Gambar 9.1. Skematik LCD karakter 16x2

Modul LCD 16x2 sudah dilengkapi dengan sebuah kontroler yang memiliki dua
register 8 bit yaitu register instruksi (IR) dan register data (DR). IR menyimpan kode
instruksi, seperti display clear, cursor shift dan informasi address untuk display data
RAM (DDRAM) dan character generator (CGRAM).

Tabel 9.2. Operasi baca/tulis LCD 16x2


RS R/W Operasi
0 0 Menulis instruksi ke IR, seperti display clear, cursor shift
0 1 Membaca busy flag (DB7) dan address counter (DB0 s/d
DB7)
1 0 Menulis data ke DDRAM atau CGRAM
1 1 Membaca data dari DDRAM atau CGRAM

 Busy Flag (BF)

Busy flag = 1 saat kontroler sedang mengerjakan instruksi, selama instruksi


tersebut belum selesai dikerjakan, kontroler tidak akan menerima instruksi apapun.
Ketika RS=0 dan R/W=1, busy flag mengeluarkan logika 1 pada DB7. Instruksi
berikutnya akan siap diterima ketika busy flag = 0.
Address Counter (AC) berisi alamat DDRAM dan CGRAM. Display Data RAM
(DDRAM) menyimpan data tampilan dalam bentuk kode karakter 8 bit. Kapasitasnya
adalah 80 karakter.
Tampilan karakter pada LCD diatur oleh pin E, RS dan RW. Pin E adalah
kontrol Enable. Pin ini digunakan untuk mengindikasikan bahwa LCD sedang
mengirimkan sebuah data. Untuk mengirimkan data ke LCD, maka pin E harus dibuat
logika low “0” dan set pada dua jalur kontrol yang lain RS dan RW. Ketika dua jalur
yang lain telah siap, set E dengan logika high “1” dan tunggu sejumlah waktu tertentu
(sesuai dengan datasheet dari LCD tersebut) dan berikutnya set E ke logika low “0”
lagi. Pin RS adalah kontrol Register Select. Ketika RS berlogika low “0”, data akan
dianggap sebagi sebuah perintah atau instruksi khusus (seperti clear screen, posisi
kursor dll). Ketika RS berlogika high “1”, data yang dikirim adalah data teks yang akan
ditampilkan pada LCD. Sebagai contoh, untuk menampilkan huruf “U” pada layar LCD

114
maka RS harus diset logika high “1”. Pin RW adalah kontrol Read/Write. Ketika RW
berlogika low “0”, maka informasi pada bus data akan dituliskan pada layar LCD.
Ketika RW berlogika high ”1”, maka program akan melakukan pembacaan memori dari
LCD. Sedangkan pada aplikasi umum pin RW selalu diberi logika low ”0”.
Bus data dapat dipilih apakah menggunakan 4 jalur atau 8 jalur (bergantung
pada mode operasi yang dipilih oleh user). Pada kasus bus data 8 bit, jalur yang
digunakan DB0 ─ DB7 sedangkan untuk bus data 4 bit digunakan DB0 ─ DB3.
Beberapa perintah dasar yang harus dipahami adalah inisialisasi LCD.

 Function Set

Function set mengatur antarmuka lebar data, jumlah baris dan ukuran font

Tabel 9.3. Konfigurasi function set


RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 DL N F X X

Catatan:
X : Don’t care (0 atau 1)
DL: Mengatur lebar data
DL=1, Lebar data 8 bit ( DB7 s/d DB0)
DL=0, Lebar data 4 bit ( DB7 s/d DB4)
Ketika menggunakan lebar data 4 bit, data harus dikirimkan dua kali
N: Pengaktivan baris
N=0, satu baris
N=1, dua baris
F: Penentuan ukuran font karakter
F=0, 5x7
F=1, 5x8

 Entry Mode Set

Entry mode set mengatur increment/ decrement dan mode geser

Tabel 9.4. Konfigurasi entry mode set


RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 I/D S

Catatan:
I/D: Increment/ decrement alamat DDRAM dengan 1 ketika kode karakter
dituliskan ke DDRAM.
I/D = “0”, decrement
I/D= “1”, increment
S: Geser keseluruhan tampilan ke kanan/ke kiri
S=1, geser ke kiri atau ke kanan bergantung pada I/D
S=0, tampilan tidak bergeser

115
 Tampilan Kursor On/ Off

Mengatur status tampilan ON atau OFF, cursor ON/ OFF dan fungsi Cursor Blink

Tabel 9.5. Konfigurasi kursor ON/OFF


RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 1 D C B

D : Mengatur tampilan
D = 1, tampilan ON
D = 0, tampilan OFF
Pada kasus ini data tampilan masih tetap berada di DDRAM, dan dapat ditampilkan
kembali secara langsung dengan mengatur D=1.
C : Tampilan Kursor
C = 1, kursor ditampilkan
C = 0, kursor tidak ditampilkan
B : Karakter ditunjukkan dengan kursor yang berkedip
B=1, kursor kedip
B=0, kursor tidak kedip

 Bersihkan Layar

Perintah ini untuk membersihkan/menghapus layar

Tabel 9.6. Konfigurasi clear tampilan


RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1

 Geser Kursor dan Tampilan

Geser posisi kursor atau tampilan ke kanan atau ke kiri tanpa menulis atau membaca
data tampilan. Fungsi ini digunakan untuk koreksi atau pencarian tampilan.

Tabel 9.7(a). Konfigurasi geser kursor dan tampilan


RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 1 S/C R/L X X

Catatan : X = Dont care (0 atau 1)

Tabel 9.7(b). Konfigurasi geser kursor dan tampilan


S/C R/L Keterangan
0 0 Geser posisi kursor ke kiri
0 1 Geser posisi kursor ke kanan
1 0 Geser seluruh tampilan ke ke kiri
1 1 Geser seluruh tampilan ke ke kiri

 Posisi Kursor

116
Modul LCD mempunyai sejumlah memori yang digunakan untuk tampilan. Semua
teks yang kita tuliskan ke modul LCD adalah disimpan di dalam memori ini, dan
modul LCD secara berurut membaca memori ini untuk menampilkan teks ke modul
LCD.

Gambar 9.2. Peta memori tampilan LCD

Perhatikan peta memori Gambar 9.2 di atas. Pada peta memori tersebut, daerah
00h─0Fh dan 40h─4Fh adalah tampilan yang tampak. Angka pada setiap kotak
adalah alamat memori yang bersesuaian dengan posisi di layar. Karakter pertama di
sudut kiri atas menempati alamah 00h. Posisi karakter berikutnya adalah alamat 01h
dan seterusnya. Akan tetapi, karakter pertama dari baris 2 sebagaimana yang
ditunjukkan pada peta memori adalah pada alamat 40h.
Untuk mengatur posisi kursor pada baris dan kolom tertentu maka harus
dikirimkan sebuah perintah ke LCD. Instruksi Set Posisi Kursor adalah 80h. Untuk
itu kita perlu menambahkan alamat lokasi di mana posisi kursor yang diinginkan.
Misalnya, kita ingin menampilkan kata ”Teknik” pada baris ke dua pada posisi
kolom ke sepuluh. Maka sesuai peta memori, posisi karakter pada kolom 11 dari
baris kedua, mempunyai alamat 4Ah, sehingga sebelum kita tulis kata ”Teknik”
pada LCD, kita harus mengirim instruksi set posisi kursor, dan perintah untuk
instruksi ini adalah 80h ditambah dengan alamat (80h+4Ah =0CAh). Sehingga
dengan mengirim perintah 0CAh ke LCD, akan menempatkan kursor pada baris
kedua dan kolom ke 11 dari DDRAM.

 Set Alamat Memori DDRAM

Tabel 9.8. Konfigurasi set alamat DDRAM


RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 A A A A A A A

Catatan:
A : Alamat RAM yang akan dipilih
Sehingga alamat RAM LCD adalah 000 0000 S/D 111 1111 b atau 00 s/d 7Fh

117
INISIALISASI LCD 8 BIT MULAI

Tunggu = 15 ms (hingga VCC naik 4,5V)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Function Set (antarmuka 8 bit) 0 0 0 0 1 1 X X X X

Tunggu = 4.1 ms

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Function Set (antarmuka 8 bit) 0 0 0 0 1 1 X X X X

Tunggu = 100 ms

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Function Set (antarmuka 8 bit) 0 0 0 0 1 1 X X X X

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Function Set (antarmuka 8 bit) 0 0 0 0 0 0 N F X X

Tampilan OFF 0 0 0 0 0 0 1 0 0 0

Tampilan CLEAR 0 0 0 0 0 0 0 0 0 1

Entry Mode Set 0 0 0 0 0 0 0 1 I/ D S

INISIALISASI LCD 8 BIT SELESAI

Gambar 9.3. Diagram alir inisialisasi LCD 16x2 mode antarmuka 8-bit

118
INISIALISASI LCD 4 BIT MULAI

Tunggu = 15 ms (hingga VCC naik 4,5V)

RS R/W DB7 DB6 DB5 DB4

Function Set (antarmuka 8 bit) 0 0 0 0 1 1

Tunggu = 4.1 ms

RS R/W DB7 DB6 DB5 DB4

Function Set (antarmuka 8 bit) 0 0 0 0 1 1

Tunggu = 100 ms

RS R/W DB7 DB6 DB5 DB4

Function Set (antarmuka 8 bit) 0 0 0 0 1 1

RS R/W DB7 DB6 DB5 DB4


Function Set (antarmuka 4 bit) 0 0 0 0 1 0
0 0 0 0 1 0
Function Set (antarmuka 4 bit) 0 0 N F X X
0 0 0 0 0 0
Tampilan OFF 0 0 1 0 0 0
0 0 0 0 0 0
Tampilan CLEAR 0 0 0 0 0 1
0 0 0 0 0 0
Entry Mode Set 0 0 0 0 I/D S

INISIALISASI LCD 4 BIT SELESAI

Gambar 9.4. Diagram alir inisialisasi LCD 16x2 mode antarmuka 4-bit

 INISIALISASI

Tampilan LCD harus diinisialisasi dan dikonfigurasikan terlebih dulu sebelum


digunakan yaitu dengan mengirimkan sejumlah instruksi ke LCD antara lain:
pengaturan lebar data 8 bit ataukah 4 bit, pemilihan ukuran font karakter 5x8 atau 5x7
dan lain-lain. Langkah-langkah inisialisasi untuk bus data dengan jalur 8 bit ditunjukkan
pada Gambar 9.3 dan untuk bus data dengan jalur 4 bit ditunjukkan pada Gambar 9.4

119
LATIHAN PRAKTIKUM 9.1

Berikut adalah contoh program yang menampilkan karakter dalam dua baris.
Baris pertama ditampilkan kata ’Teknik Komputer’ dan pada baris kedua dengan kata
‘HARDWARESOFTWARE’.
; // Latihan Praktikum 9.1 //

KODE INSTRUKSI KETERANGAN


; // Lat Prak 9.1 //
;f kristal=11.0592MHz
;Program ini menampilkan kata 'Teknik Komputer' dan ‘HARDWARESOFTWARE’
;dalam dua baris LCD 16 x 2
.include "8535def.inc"
.equ timer = 0xffca
.equ timer100 = 0xfbaf
.cseg
.org 0x0000
rjmp utama
utama:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ser r16
out ddra,r16 ; portA sebagai output
rcall InitLCD ; inisialisasi LCD
Start: ldi r17,0x01 ;clear tampilan
rcall TulisInst
Loopx:
ldi ZL,low(text<<1)
ldi ZH,high(text<<1)
rcall WM1LCD
ldi ZL,low(text2<<1)
ldi ZH,high(text2<<1)
rcall WM2LCD
end: rjmp Loopx
;-------------------
; tulis pesan ke LCD
WM1LCD:
ldi r17,0x80 ; Lokasi Display RAM, row=1 col=1
rcall TulisInst
rjmp Wr1
WM2LCD: ldi r17,0xC0 ; Lokasi Display RAM row=2 col=1
rcall TulisInst
Wr1: clr r1
LoopWr1: lpm ; Load program memory
mov r19,r0
cpi r19,0
brne NextCHR
ret
NextCHR: rcall Wchar ; panggil subrutin kirim/tulis karakter
adiw ZL,1 ; ambil karakter berikutnya
rjmp LoopWr1
;-----------------
; Inisialisasi LCD
InitLCD:
rcall tunda5mS ; tunda selama 5ms
rcall tunda5mS ; tunda selama 5ms
rcall tunda5mS ; tunda selama 5ms
ldi r17,0x28 ; Function set: operasi 4 bit;2 baris
rcall TulisInst
ldi r17,0x08 ; Turn Off LCD
rcall TulisInst
ldi r17,0x0C ; Turn On LCD
rcall TulisInst

ldi r17,0x01 ; Clear Display


rcall TulisInst
ldi r17,0x06 ; Entry mode set

120
rcall TulisInst
ret
;---------------------
;Rutin tulis instruksi
TulisInst: mov r18,r17
swap r18 ; ambil nibble atas
out PortA,r18
rcall enable
mov r18,r17 ;ambil nibble bawah
out PortA,r18
rcall enable
rcall tunda100uS
ret
;--------------------
;Rutin tulis data/kar
Wchar: mov r18,r19
swap r18 ;ambil nibble atas
out PortA,r18
sbi PortA,4 ;RS=1
rcall enable
mov r18,r19 ;ambil nibble bawah
out PortA,r18
sbi PortA,4 ;RS=1
rcall enable
rcall tunda100uS
ret
;---------------------
; Rutin enable (strobe)
enable:
sbi PortA,5 ; E=1
cbi PortA,5 ; E=0
ret
;-----------------
; Rutin tunda 5ms
tunda5ms:
ldi r16,0b00000100
out TIMSK,r16
ldi r16,high(timer)
out TCNT1H,r16
ldi r16,low(timer)
out TCNT1L,r16
ldi r16,0b00000101
out TCCR1B,r16
loop: in r21,TIFR
sbrs r21,TOV1
rjmp loop
ldi r16,0b00000100
out TIFR,r16
ret
;-------------------
; Rutin tunda 100uS
tunda100us:
ldi r16,0b00000100
out TIMSK,r16
ldi r16,high(timer100)
out TCNT1H,r16
ldi r16,low(timer100)
out TCNT1L,r16
ldi r16,0b00000001
out TCCR1B,r16
loop1: in r21,TIFR
sbrs r21,TOV1
rjmp loop1
ldi r16,0b00000100
out TIFR,r16
ret
text: .db "Teknik Komputer",0
text2: .db "HARDWARESOFTWARE",0

121
PRAKTIKUM MANDIRI

1. Buatlah program untuk menampilkan kata “TEKNIK KOMPUTER” pada LCD baris
kedua dengan berjalan (running text) ke kiri hingga kata tersebut hilang. Demikian
berulang seterusnya (atau sesuai arahan dosen/asisten).
2. Buatlah program untuk menampilkan kata “KOMPUTER” pada LCD di tengah layar
baris pertama sambil berkedip (blinking) setiap 0,5 detik (atau sesuai arahan
dosen/asisten).

122
LEMBAR LAPORAN/JURNAL PRAKTIKUM – MODUL 9
Praktikum Mandiri:
1.

Algoritma/flowchart dan Coding

123
2.

Algoritma/flowchart dan Coding

124
PERTANYAAN KESIMPULAN

A. Jelaskan perbedaan mendasar dari suatu program LCD yang hanya menampilkan
karakter satu baris saja dengan program LCD yang menampilkan karakter dua
baris.
B. Jelaskan fungsi/manfaat dari praktikum yang anda lakukan.

125
MODUL 10
ANALOG TO DIGITAL CONVERTER - ADC

TUJUAN

 Praktikan memahami cara kerja ADC internal yang terdapat dalam ATmega8535
 Praktikan mampu memprogram ADC internal ATmega8535

PERALATAN YANG DIGUNAKAN

 Sebuah Personal Komputer


 Program Aplikasi Studio4
 Program Downloader ATMEGA8535
 Perangkat Downloader ATMEGA8535
 Sistem minimum ATMEGA8535

TEORI

Mikrokontroler AVR ATmega8535 merupakan salah satu turunan


mikrokontroler yang dibekali dengan ADC internal. ADC yang dimiliki ATmega8535
mempunyai 8 buah saluran masukan analog yang termultipleks, serta mempunyai
resolusi hingga 10 bit. Artinya bahwa tegangan analog antara 0 dan 5 V akan
dikodekan menjadi salah satu dari 1024 representasi biner antara 000H dan 3FFH. Ini
memberikan ATmega8535 tegangan dengan resolusi sekitar 4,88 mV
Dalam mode operasinya ADC ATmega8535 dapat dioperasikan sebagai
masukan tunggal (single ended input) ataupun sebagai masukan jamak (differential
input) yang dimultipleks. Selain itu, ADC ATmega8535 memiliki konfigurasi pewaktuan,
tegangan referensi, mode operasi, dan kemampuan menyaring noise (gangguan) yang
cukup fleksibel sehingga dapat dengan mudah disesuaikan dengan kebutuhan.

FITUR ADC ATmega8535

Subsistem pengubah sinyal analog ke digital ADC ATmega8535 dilengkapi


dengan fitur-fitur berikut:
 Resolusi 10 bit
 Akurasi absolut  2 LSB
 Waktu konversi ADC 13 siklus clock (65 – 260 s)
 8 kanal input sebagai single ended yang termultipleks (dipakai bergantian)
 2 Kanal masukan diferensial dengan gain yang dapat dipilih 10x dan 200x(*)
 Rentang masukan tegangan ADC adalah 0 sampai VCC
 Disediakan 2.56V tegangan referensi internal ADC

126
 Mode konversi kontinyu (free running) atau mode konversi tunggal (single
conversion)
 Sleep mode noise canceler
Catatan: (*). Kanal masukan diferensial tidak diuji pada device kemasan PDIP dan PLCC.
Fitur ini hanya dijamin bekerja pada device kemasan TQFP dan QFN/MLF.

Device ini juga mendukung 16 kombinasi masukan tegangan diferensial. Dua


masukan diferensial (ADC1, ADC0 dan ADC3, ADC2) dilenngkapi dengan sebuah tingkat
penguat yang dapat diprogram (programmable gain), menyediakan penguatan 0 dB
(1x), 20 dB (10x), atau 46 dB (200x) pada tegangan masukan diferensial sebelum
konversi A/D. Tujuh kanal masukan analog diferensial di-share pada sebuah terminal
negatif bersama (ADC1), sedangkan masukan ADC lainnya dapat dipilih sebagai
terminal masukan positip. Jika digunakan gain 1x atau gain 10x, dapat diperoleh
resolusi 8-bit. Jika digunakan gain 200x, dapat diperoleh resolusi 7-bit. Pada Gambar
10.1 ditunjukkan diagram blok ADC ATmega8535.

Resolusi didefenisikan sebagai:

Resolusi = (VRH – VRL) / 2b

VRH adalah tegangan referensi high ADC dan VRL adalah tegangan referensi low
ADC, b adalah jumlah bit yang tersedia untuk dikonversi. Untuk ATmega8535 dengan
tegangan referensi 5 VDC, 0 VDC, dan tersedia resolusi 10 bit untuk konversi, maka
resolusinya adalah 4,88 mV. Akurasi absolut ditetapkan  2 LSB pada resolusi ini adalah
9,66 mV.
Waktu konversi yang diperlukan oleh ADC adalah 13 siklus clock (13 x T clock).
Sistem ADC dapat dijalankan dengan kecepatan yang lebih rendah dari sumber
frekuensi utama mikrokontroler. Clock mikrokontroler utama dibagi menggunakan bit-
bit Prescaler Select (ADPS[2:0]) di dalam register ADCSRA (ADC Control and Status
Register A).
ADC dilengkapi dengan pengubah tunggal successive approximation. Hanya
pada satu kanal tunggal ADC yang dapat dikonversi pada satu waktu. Masukan ADC
dilengkapi dengan sebuah multiplekser analog delapan-masukan. Masukan analog
yang akan dikonversi dipilih menggunakan bit-bit MUX[4:0] di dalam ADMUX (ADC
Multiplexer Selection Register), karena pengubah ADC dalam chip hanya satu buah
sedangkan saluran masukannya ada delapan maka dibutuhkan multiplexer untuk
memilih masukan pin ADC secara bergantian.
ADC memiliki sirkuit untuk mengambil sampel dan menahan (hold) tegangan
masukan ADC sehingga selama proses konversi keadaannya konstan. ADC mempunyai
catu daya yang terpisah yaitu pin AVCC-AGND, di mana AVCC tidak boleh berbeda 
0.3V dari VCC.
Konversi ADC memerlukan tegangan referensi Vref dan clock ADC (register
ADCSRA). Tegangan referensi eksternal dapat di-decouple pada pin Aref dengan
kapasitor untuk mengurangi noise. Atau dapat menggunakan tegangan referensi
internal sebesar 2.56V (pin AREF diberik kapasitor secara eksternal untuk menstabilkan
tegangan referensi internal). ADC mengkonversi tegangan masukan analog menjadi
bilangan digital 10 bit. GND (0 volt) adalah nilai minimum yang mewakili ADC dan nilai

127
maksimum ADC diwakili oleh tegangan pada pin AREF minus 1 LSB. Hasil konversi ADC
disimpan dalam pasangan register ADCH:ADCL.
Sinyal masukan analog ADC tidak boleh melebihi tegangan referensi. Nilai
digital sinyal masukan ADC untuk resolusi 10 bit adalah:

Kode digital = (Vin / Vref) x 1024

Nilai digital sinyal masukan ADC untuk resolusi 8 bit adalah:

Kode digital = (Vin / Vref) x 256

Misalnya jika digunakan resolusi dan tegangan referensi internal Vref sebesar 2.56V,
maka dengan sinyal masukan analog 2,5V akan memberikan sinyal digital:

Kode digital = (2,5V / 2,56V) x 256 = 250 = FAH

Karena akurasi ADC mencapai  2 LSB, maka kemungkinan kode digital yang dihasilkan
bisa menjadi F8H, F9H, FBH atau FCH

KONVERSI KONTINYU DAN KONVERSI TUNGGAL

Mode operasi ADC Atmega8535 disebutkan sebelumnya terdiri dari dua macam
yaitu konversi kontinyu (free running) dan konversi tunggal (single conversion). Berikut
dijelaskan kedua mode tersebut:

 Mode Konversi Kontinyu

Pada mode free running, konversi dilakukan secara terus menerus (kontinyu) di
mana ADC membaca sampel tegangan masukan analog lalu dikonversi dan hasilnya
dimasukkan ke register ADCH:ADCL terus menerus. Bila kita membaca ADC ketika ADC
sedang mengkonversi tegangan masukan analog, maka yang terbaca adalah hasil ADC
yang terakhir yang dibaca oleh ADC.
Cara pemilihan ADC mode free running adalah dengan men-set bit ADFR dalam
register ADCSRA. Konversi pertama dalam mode ini dimulai dengan men-set bit ADSC.
Dalam mode ini ADC bekerja secara independen (tidak bergantung) dari flag interupsi
ADC (apakah ADIF set atau clear sama saja)

 Mode Konversi Tunggal

Pada mode Konversi Tunggal dilakukan sekali pembacaan sampel tegangan


masukan analog. Bila ingin membaca lagi, maka harus disampel lagi sehingga kita
dapat mengkonversi tegangan masukan analog untuk saat-saat yang kita butuhkan
saja. Mode konversi tunggal dipilih dengan meng-clear bit ADFR dalam register
ADCSRA.
Pada mode Konversi Tunggal, konversi dimulai ketika bit ADSC di-set, dan bit
tersebut tetap set sampai satu kali konversi selesai (complete). Kemudian secara

128
otomatis CPU meng-clear kembali bit ADSC. Ketika konversi sedang berlangsung dan
kita mengubah kanal masukan analog ADC, maka hal tersebut tidak akan diubah oleh
CPU hingga konversi ADC kanal sebelumnya selesai.

INISIALISASI ADC ATmega8535

Untuk menjalankan fitur pengubah sinyal analog ke digital, maka diperlukan


inisialisasi yang melibatkan proses penentuan clock, tegangan referensi, format
keluaran data serta mode pembacaan. Register yang terkait dengan penetapan
inisialisasi tersebut adalah register ADMUX (ADC Multiplexer Selection Register),
ADCSRA (ADC Control and Status Register A), dan SFIOR (Special Function IO Register)

Register ADMUX. Register ADMUX adalah register 8 bit yang berfungsi menetapkan
tegangan referensi ADC, format data keluaran, dan saluran ADC yang akan digunakan.
Konfigurasi register ADMUX dapat dilihat pada Gambar 10.2

Gambar 10.2. Register ADMUX

 Bit 7, bit 6 – REFS1, REF0: Reference Selection Bit.


Bit-bit ini memilih tegangan referensi untuk ADC seperti yang ditunjukkan pada
Tabel 10.1. Jika bit-bit ini diubah ketika sedang mengkonversi, perubahannya tidak
akan berpengaruh sampai konversi tersebut selesai (ADIF set di dalam ADCSRA).
Pilihan-pilihan referensi tegangan internal tidak dapat digunakan jika tegangan
referensi eksternal sedang terhubung ke pin AREF.

Tabel 10.1. Pilihan tegangan referensi


REFS1 REFS0 Pilihan Tegangan Referensi
0 0 AREF, Vref internal dimatikan
0 1 AVCC dengan kapasitor eksternal pada pin AREF
1 0 Tidak digunakan
1 1 Referensi tegangan internal 2.56V dengan
kapasitor eksternal pada pin AREF

 Bit 5 – ADLAR: ADC Left Adjust Result


Bit ADLAR mempengaruhi presentasi hasil konversi ADC di dalam register data ADC
(ADCH:ADCL). Tuliskan satu ke ADLAR untuk mengatur hasil ke kiri. Sebaliknya,
hasilnya diatur ke kanan. Perubahan bit ADLAR akan mempengaruhi register data
ADC dengan segera mengabaikan konversi yang sedang berlangsung.

 Bit 4:0 – MUX4:0: Kanal Analog dan bit-bit Pemilihan Gain

129
Nilai bit-bit ini memilih kombinasi masukan analog yang dihubungkan ke ADC. Bit-
bit ini juga memilih gain untuk differential channel. Untuk rinciannya dapat dilihat
pada Tabel 10.2 Jika bit-bit ini diubah ketika sedang mengkonversi, maka tidak
akan ada perubahan sampai konversi tersebut selesai (ADIF di-set di dalam
ADCSRA)

Tabel 10.2. Kanal Masukan dan Pemilihan Gain


MUX4 ..0 Single ended Pos differential Neg differential Gain
input channel channel
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3 N/A
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 ADC0 ADC0 10x
01001 ADC1 ADC0 10x
01010 ADC0 ADC0 200x
01011 ADC1 ADC0 200x
01100 ADC2 ADC2 10x
01101 ADC3 ADC2 10x
01110 ADC2 ADC2 200x
01111 ADC3 ADC2 200x
10000 ADC0 ADC1 1x
10001 ADC1 ADC1 1x
10010 ADC2 ADC1 1x
N/A
10011 ADC3 ADC1 1x
10100 ADC4 ADC1 1x
10101 ADC5 ADC1 1x
10110 ADC6 ADC1 1x
10111 ADC7 ADC1 1x
11000 ADC0 ADC2 1x
11001 ADC1 ADC2 1x
11010 ADC2 ADC2 1x
11011 ADC3 ADC2 1x
11100 ADC4 ADC2 1x
11101 ADC5 ADC2 1x
11110 1.22V (VBG) N/A
11111 0V (GND)

ADC Control and Status Register A – ADCSRA. Register ADCSRA adalah register 8 bit
yang berfungsi melakukan manajemen sinyal kontrol dan status dari ADC. Susunannya
ditunjukkan pada Gambar 10.3

Gambar 10.3. Register ADCSRA

130
 Bit 7 – ADEN: ADC Enable
ADEN adalah bit untuk pengatur aktivasi ADC. Nilai awal bit ini adalah low. Dengan
memberikan high maka ADC aktif, dengan memberikan low ADC tidak aktif.

 Bit 6 – ADSC: ADC Start Conversion


Pada mode Konversi Tunggal, dengan menuliskan bit ini high maka akan memulai
setiap konversi. Pada mode free running, dengan menuliskan bit ini high akan
memulai konversi pertama. Konversi pertama sesudah ADSC ditulisi setelah ADC di-
enable, atau jika ADC ditulisi pada waktu yang sama dengan ADC di-enable, akan
menghabiskan 25 siklus clock ADC sebagai pengganti dari normal 13. Konversi
pertama melakukan inisialisasi ADC.
ADSC akan membaca sebagai satu selama dalam konversi. Bila konversi selesai, dia
kembali ke nol. Penulisan nol ke bit ini tidak mempunyai pengaruh.

 Bit 5 – ADATE: ADC Auto Trigger Enable


Bila bit ini ditulisi satu, maka pemicuan auto ADC di-enable. ADC akan memulai
konversi pada tebing positif sinyal pemicu yang dipilih. Sumber pemicu dipilih
dengan melakukan setting bit-bit ADC Trigger Select, ADTS dalam SFIOR.

 Bit 4 – ADIF: ADC Interrupt Flag


Bila bit ini set maka sebuah konversi ADC selesai dan register-register data di-
update. ADC Conversion Complete Interrupt dieksekusi jika bit ADIE dan bit-I dalam
register SREG di-set. ADIF di-clear oleh hardware bila mengeksekusi interrupt
handling vector yang sesuai. Selain dari itu, ADIF di-clear oleh penulisan logika satu
ke flag. Harus disadari bahwa jika melakukan sebuah Read-Modify-Write pada
ADCSRA, interupsi tunda dapat di-disable. Hal ini juga diterapkan jika digunakan
instruksi SBI dan CBI.

 Bit 3 – ADIF: ADC Interrupt Enable


Bila bit ini ditulisi satu dan dan bit-I dalam register SREG di-set, maka ADC
Conversion Complete Interrupt diaktifkan.

 Bit 2, bit 1, bit 0 – ADPS2, ADPS1, ADPS0: ADC Prescaler Select Bit
Bit-bit ini menentukan faktor pembagian antara frekuensi XTAL dan clock masukan
ke ADC (lihat Gambar 10.4)
Waktu konversi ADC mikrokontroler AVR dapat diatur melalui bit ADPS2:0 di dalam
register ADCSRA. Untuk memilih waktu konversi, kita dapat memilih salah satu
dari: fosc/2, fosc/4, fosc/8, fosc/16, fosc/32, fosc/64, fosc/128 untuk clock ADC, di
mana fosc adalah frekuensi kristal yang digunakan pada AVR. Ingat mikrokontroler
AVR hanya dapat merespon frekuensi tidak lebih dari 200 kHz (untuk jelasnya lihat
contoh 10.3).

131
Gambar 10.4 Pemilihan Clock ADC Melalui Prescaler

Contoh 10.3
Sebuah mikrokontroler AVR menggunakan kristal dengan frekuensi 8 MHz.
Hitung frekuensi ADC untuk: (a) ADPS2:0 = 001 (b) ADPS2:0 = 100 (ic)
ADPS2:0 = 111
SOLUSI:
(a) Karena dari tabel di atas ADPS2:0 = 001 memberikan CLKI/O /2 maka clock ADC
yang diaktifkan adalah sebesar 8 MHz/2 = 4 MHz. Bilangan 4 MHz tidak valid
karena lebih besar dari 200 kHz. Maka prescaler ini tidak dapat digunakan.

(b) Karena dari tabel di atas ADPS2:0 = 100 memberikan CLKI/O /16 maka clock
ADC yang diaktifkan adalah sebesar 8 MHz/16 = 500 kHz. Bilangan 500 kHz
juga tidak valid karena lebih besar dari 200 kHz. Maka prescaler ini juga tidak
dapat digunakan.

(c) Karena dari tabel di atas ADPS2:0 = 111 memberikan CLKI/O /128 maka clock
ADC yang diaktifkan adalah sebesar 8 MHz/128 = 62,5 kHz. Bilangan 62,5 kHz
valid karena lebih kecil/kurang dari 200 kHz. Maka prescaler ini dapat
digunakan.

Register Data ADC– ADCL dan ADCH. Register data ADC adalah register 10 bit yang
digunakan untuk menyimpan hasil konversi ADC.

132
Gambar 10.4. Register Data ADC

Ketika konversi ADC selesai, hasil konversi disimpan pada kedua register ini
(ADCH:ADCL). Jika digunakan differential channel, hasil konversi dinyatakan dalam
bentuk komplemen-2.
Ketika ADCL dibaca, register data ADC tidak di-update hingga ADCH dibaca.
Konsekuensinya, jika hasil diatur kiri dan tidak diperlukan lagi presisi 8-bit, maka cukup
membaca ADCH. Sebaliknya, ADCL harus dibaca pertama, kemudian ADCH.
Bit ADLAR dalam ADMUX, dan bit-bit MUXn dalam ADMUX mempengaruhi cara hasil
dibaca dari register. Jika ADLAR di-set, hasil konversi diatur kiri. Jika ADLAR di-clear
(default), maka hasil konversi diatur kanan.

Special Function I/O Register – SFIOR. Register SFIOR adalah register 8 bit yang
berfungsi sebagai pengatur pemicu konversi ADC, apakah dari pemicu eksternal
ataukah pemicu internal. Susunannya dapat dilihat pada Gambar 105.

Gambar 10.5. Register I/O fungsi khusus

Bit 7..5 – ADTS[2..0] adalah bit pengatur pemicu eksternal operasi ADC. Bit-bit
ini hanya berfugnsi jika bit ADATE pada register ADCSRA bernilai high. Bit-bit ini
bernilai awal 000 yang menandakan ADC bekerja pada mode konversi kontinyu dan
tidak ada interupsi yang akan dihasilkan. Rincian nilai ADTS[2..0] dapat dilihat pada
Tabel 10.4. Untuk operasi ADC, bit ACME, PUD, PSR2 dan PSR0 tidak diaktifkan.

Tabel 10.4. Pemilihan sumber pemicu auto ADC

133
Prosedur Pemrograman ADC ATmega8535
PEMROGRAMAN ADC MENGGUNAKAN POLLING
Prosedur pemrograman ADC ATmega8535 menggunakan polling dilakukan
sebagai berikut:
1. Lakukan pemilihan/inisialisasi kanal masukan ADC melalui register ADMUX
pada bit 4:0 MUX4:0
2. Aktifkan ADC melalui register ADCSRA pada bit-7 ADEN
3. Pilih kecepatan konversi ADC (prescaler) melalui register ADCSRA pada bit
ADPS2:0
4. Pilih tegangan referensi yang digunakan melalui register ADMUX bit 7:6
REFS1:REFS0
5. Aktifkan bit start konversi melalui register ADCSRA pada bit 6 ADSC
6. Tunggu hasil konversi hingga selesai dengan cara memantau bit ADIF dalam
register ADCSRA dengan cara polling
7. Ketika bit ADIF menjadi high, baca register ADCL dan ADCH untuk mendapatkan
keluaran digital yang diharapkan. Perhatikan bahwa anda harus membaca ADCL
lebih dulu sebelum ADCH. Jika sebaliknya maka hasilnya tidak valid.
8. Jika anda ingin membaca kanal lagi, ulangi langkah 5.
9. Jika anda ingin memilih sumber tegangan referensi lain atau kanal masukan,
maka ulangi langkah 4.

Dalam proses pembacaan hasil konversi ADC, dilakukan pengecekan pada bit
ADIF pada register ADCSRA. ADIF akan bernilai satu jika konversi sebuah kanal ADC
telah selesai dilaksanakan dan data hasil konversi siap untuk diambil, demikian pula
sebaliknya. Selanjutnya data disimpan dalam dua buah register yaitu ADCH dan ADCL.

Contoh 10.4
Program berikut ini adalah program konversi sinyal analog ke digital dengan
metode polling. Data analog dibaca dari kanal 0 dan keluaran digitalnya dikirim
ke port B dan port D. Pemrosesan dilakukan berulang secara terus menerus.

134
SOLUSI:
KODE INSTRUKSI KETERANGAN
;f kristal=8 MHZ
; Program konversi tegangan analog ke digital
; keluarannya melalui tampilan 16 LED pada portB dan portD
.include"m32def.inc"
.org 0
rjmp utama
utama:
ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16
ser r16
out ddrb,r16 ;inisialisasi port B sebagai keluaran
out ddrd,r16 ;inisialisasi port D sebagai keluaran
clr r16
out ddra,r16 ;inisialisasi port A sebagai masukan sinyal Analog
ldi r16,0b10000111 ;(ldi r16,0x87)
out ADCSRA,r16 ;aktifkan ADC dan pilih prescaler 128
ldi r16,0b11000000 ;(ldi r16,0xc0)
out ADMUX,r16 ;memilih kanal 0 (masukan pada ADC0)dan Vref 2,56V
; ;data rata kanan
BACA_ADC:
sbi ADCSRA,ADSC ;aktifkan start konversi
JAGA_POLLING:
sbis ADCSRA,ADIF
rjmp JAGA_POLLING ;jaga sampai hasil konversi digital selesai
sbi ADCSRA,ADIF
in r16,ADCL ;ADCL dulu yang disalin ke r16
out portD,r16 ;kirimkan hasil konversi ke LED di port D
in r16,ADCH ;ADCH disalin kemudian ke r16
out portB,r16 ;kirimkan hasil konversi ke LED di port B
Rjmp BACA_ADC

PEMROGRAMAN ADC MENGGUNAKAN INTERUPSI


Metode lain yang dapat digunakan untuk melakukan konversi sinyal analog ke
digital yaitu dengan metode interupsi. Keuntungan konversi ADC cara interupsi adalah
membebaskan prosesor dari keterikatan dalam memantau hasil konversi digital,
sehingga prosesor dapat melakukan aktivitas yang lain tanpa harus menongkrongi atau
memeriksa secara terus menerus sinyal “end of conversion” ADC.
Untuk memprogram ADC dengan metode interupsi, kita perlu melakukan
setting HIGH pada bit ADIE flag. Ketika proses konversi telah selesai, maka bit ADIF

135
(A/D interrupt flag) berubah ke HIGH; jika ADIE = 1, maka dia akan memaksa CPU
untuk melompat ke layanan interupsi ADC (interrupt ADC handler). Program pada
contoh 10.5 menunjukkan bagaimana melakukan proses konversi ADC menggunakan
metode interupsi.

Contoh 10.5
Program berikut ini adalah program konversi sinyal analog ke digital dengan
metode interupsi. Data analog dibaca dari kanal 0 dan keluaran digitalnya dikirim
ke port B dan port D. Pemrosesan dilakukan berulang secara terus menerus.

SOLUSI:
KODE INSTRUKSI KETERANGAN
;f kristal=8 MHZ
; Program konversi tegangan analog ke digital
; keluarannya melalui tampilan 8 buah LED pada portB
.include"m32def.inc"
.CSEG
rjmp utama
.ORG ADCCadr
Rjmp VEKTOR_ADC
.ORG 40
utama:
ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16
sei
Ser r16
out ddrb,r16 ;inisialisasi port B sebagai keluaran
out ddrd,r16 ;inisialisasi port D sebagai keluaran
clr r16
out ddra,r16 ;inisialisasi port A sebagai masukan sinyal Analog
ldi r16,0b10001111 ;(ldi r16,0x8F)
out ADCSRA,r16 ;aktifkan ADC dan prescaler 128, setting ADIE=1
ldi r16,0b11000000 ;(ldi r16,0xc0)
out ADMUX,r16 ;memilih kanal 0 (masukan pada ADC0)dan Vref 2,56V
; ;data rata kanan
BACA_ADC:
sbi ADCSRA,ADSC ;aktifkan start konversi
JAGA_DISINI:
rjmp JAGA_DISINI
VEKTOR_ADC:
in r16,ADCL ;ADCL dulu yang disalin ke r16
out portD,r16 ;kirimkan hasil konversi ke LED di port D
in r16,ADCH ;ADCH disalin kemudian ke r16

136
out portB,r16 ;kirimkan hasil konversi ke LED di port B
sbi ADCSRA,ADSC ;start konversi lagi
RETI

PRAKTIKUM MANDIRI
Buatlah program membaca sebuah potensiometer dari kanal 2 ADC internal
ATmega8535 dengan tegangan referensi 2,56 volt. Tampilkan ekivalen
heksadesimalnya pada LED 7-segmen.

137
LEMBAR LAPORAN/JURNAL PRAKTIKUM – MODUL 10
Praktikum Mandiri:
1.

Algoritma/flowchart dan Coding

138
PERTANYAAN KESIMPULAN

A. Jelaskan perbedaan mendasar ADC metode polling dan metode interupsi.


B. Jelaskan fungsi/manfaat dari pemrograman ADC.

139
DAFTAR PUSTAKA

Syahrul, ”Mikrokontroler AVR ATmega8535”, INFORMATIKA, 2012.

Syahrul, “Pemrograman Mikrokontroler AVR Bahasa Assembly dan C”,


INFORMATIKA, 2014

140

Anda mungkin juga menyukai