ANTARMUKA KEYPAD
TUJUAN
TEORI
Pada bagian ini akan dibahas tentang penggunaan tombol keypad sebagai input
bagi mikrokontroler dan cara mengaplikasikannya dalam sistem minimum
ATmega8535.
79
Gambar 6.1. Susunan/konfigurasi keypad 4x4 yang lazim
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
Langkah 2:
Gambar 6.4. Inisialisasi Keypad untuk Scanning Kolom-2 dengan kode 11011111 di
PortC
81
Jika PC0 = 0 berarti tombol 0 tertekan
Jika PC3 = PC2 = PC1 = PC0 = 1 berarti tidak satu pun tombol tertekan
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)
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.
85
2.
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
TEORI
Timer/Counter1
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
Setting bit untuk register TCCR1A dan TCCR1B dapat dilihat pada ringkasan Gambar
7.2.
89
Gambar 7.2 Register TCCR1A dan TCCR1B
90
Pengaturan Timer/Counter1 melalui register kontrol TCCR1A sebagai berikut:
Pada Tabel 7.2 ditunjukkan fungsional bit COM1x1, COM1x0 ketika bit-bit WGM13
s/d WGM10 di-set ke fast PWM mode.
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.
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.
93
4. Register TCNT1
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.
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.
6. Register TIFR
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.
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:
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
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
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.
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
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.
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
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.
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).
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
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:
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:
107
Dengan cara yang serupa maka duty cycle Fast PWM0 dengan mode inverting
digunakan persamaan 8.3 berikut:
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
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.
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
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.
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).
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
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
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
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
Geser posisi kursor atau tampilan ke kanan atau ke kiri tanpa menulis atau membaca
data tampilan. Fungsi ini digunakan untuk koreksi atau pencarian tampilan.
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.
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.
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 = 4.1 ms
Tunggu = 100 ms
Tampilan OFF 0 0 0 0 0 0 1 0 0 0
Tampilan CLEAR 0 0 0 0 0 0 0 0 0 1
Gambar 9.3. Diagram alir inisialisasi LCD 16x2 mode antarmuka 8-bit
118
INISIALISASI LCD 4 BIT MULAI
Tunggu = 4.1 ms
Tunggu = 100 ms
Gambar 9.4. Diagram alir inisialisasi LCD 16x2 mode antarmuka 4-bit
INISIALISASI
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 //
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.
123
2.
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
TEORI
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.
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:
Misalnya jika digunakan resolusi dan tegangan referensi internal Vref sebesar 2.56V,
maka dengan sinyal masukan analog 2,5V akan memberikan sinyal digital:
Karena akurasi ADC mencapai 2 LSB, maka kemungkinan kode digital yang dihasilkan
bisa menjadi F8H, F9H, FBH atau FCH
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:
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)
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.
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
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)
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
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 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.
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.
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
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.
138
PERTANYAAN KESIMPULAN
139
DAFTAR PUSTAKA
140