E-book ini memberikan panduan workshop pemrograman mikrokontroler AVR AT90S2313/AT90S8515. Isinya meliputi penjelasan arsitektur dan komponen utama AVR seperti register, mode pengalamatan, I/O port, interupsi, timer/counter, dan watchdog timer beserta contoh kode program.
1. e-book
Handout Workshop Pemrograman AVR
(AT90S2313/AT90S8515)
oleh
Agfianto Eko Putra
agfi@ugm.ac.id
Dapatkan ebook ini gratis di http://agfi.staff.ugm.ac.id
FREE EBOOK!!
Jika Anda merasa ebook ini bermanfaat silahkan mendistribusikan ulang ebook ini
dengan gratis di website Anda selama tidak merubah isi yang ada di e-book ini.
Terima kasih…
1
2. Handout Workshop Pemrograman AVR
(AT90S2313/AT90S8515)
Disusun oleh: Agfianto Eko Putra – agfi@ugm.ac.id
(tersedia CDROM pendukung, lihat pada bagian informasi di akhir ebook ini)
Mikrokontroler Atmel’s AVR® merupakan jenis mikrokontroler RISC yang menjalankan
instruksi siklus tunggal dan memiliki struktur I/O yang bisa mengurangi kebutuhan
komponen-komponen eksternal.
DAFTAR ISI
I. PENDAHULUAN MIKROKONTROLER AVR (AT90S2313) ................................... 3
I.a. Arsitektur Mikrokontroler Atmel’s AVR ........................................................... 3
I.b. Tentang Register-register AVR .......................................................................... 5
I.c. Mode Pengalamatan AVR dan Set Instruksi .................................................. 8
I.d. Port-port I/O ........................................................................................................... 12
I.e. Interupsi ................................................................................................................... 14
I.f. Pencacah/Pewaktu 0 dan 1................................................................................ 15
I.g. Pewaktu Watchdog............................................................................................... 18
I.h. Komparator Analog ............................................................................................... 20
I.i. Komunikasi Serial ................................................................................................... 21
II. PEMROGRAMAN MIKROKONTROLER AVR (AT90S2313).............................. 23
II.a. Eksperimen-1: Proses aritmetika sederhana ............................................ 23
Membuat proyek baru dengan VMLAB 3.10 .................................................... 23
Menuliskan program Assembly AVR ................................................................... 25
Melakukan simulasi dengan VMLAB 3.10 ......................................................... 26
II.b. Eksperimen-2: Proses aritmetika kompleks .............................................. 28
II.c. Eksperimen-3: Penggunaan I/O untuk LED .............................................. 30
Menyiapkan berkas project untuk rangkaian eksternal ............................. 30
II.d. Eksperimen-4: LED berjalan ............................................................................ 33
II.e. Eksperimen-5: Penggunaan Interupsi Eksternal INT0 dan INT1 ...... 34
Dasar-Dasar Interupsi ............................................................................................. 34
Struktur Program Terkendali-Interupsi Pada AVR ....................................... 34
Mengatur Lokasi Lompatan Vektor Interupsi dengan .org ........................ 34
Pengarah .org.............................................................................................................. 35
Mengatur register GIMSK ....................................................................................... 36
Mengatur register MCUCR ...................................................................................... 36
Mengaktifkan interupsi global dalam SREG .................................................... 37
Penjelasan program interupsi eksternal INT0 dan INT1............................ 37
II.f. Eksperimen-6: Penggunaan Interupsi Pewaktu/Pencacah ................. 42
Interupsi Limpahan Pewaktu................................................................................ 42
OVF0addr ...................................................................................................................... 42
TIMSK, TCCR0 dan TCNT0 ...................................................................................... 42
Penjelasan program interupsi pewaktu/pencacah 0 ................................... 43
2
3. I. PENDAHULUAN MIKROKONTROLER AVR (AT90S2313)
OKONTROLER
I.a. Arsitektur Mikrokontroler Atmel’s AVR
troler
Mikrokontroler Atmel’s AVR secara umum memiliki beberapa bagian penting,
VR
sebagaimana arsitektur dasarnya ditunjukkan pada Gambar 1. Sedangkan inti CPU
sarnya dangkan
(CPU core) dan periferalnya ditunjukkan pada Gambar 2 dan 3.
a
Gambar 1. Arsitektur dasar Mikrokontroler Atmel’s AVR
VR
Jika diperhatikan pada arsitektur tersebut terdapat 3 macam register:
tektur er:
1. Register serbaguna atau General Purpose Register;
na
2. Register status atau SREG – Status Register, dan
tau
3. Register periferal atau Periphery Registers
Yang masing-masing memilki fungsi atau kegunaan tertentu yang akan kita lihat
milki ng
pada pasal Tentang Register Mikrokontroler Atmel’s AVR.
er
Demikian juga dengan bagian periferal AVR, sebagaimana ditunjukkan pada Gambar
ian kan
3, terdapat berbagai macam periferal yang juga akan kita lihat pada pasal-pasal yang
m a pasal
membahas periferal.
3
4. Gambar 2. CPU Core Mikrokontroler Atmel’s AVR
Gambar 3. Periferal Mikrokontroler Atmel’s AVR
4
5. I.b. Tentang Register-register AVR
egister
CPU mengandung 32x8 bit register serbaguna (GPR – General Purpose Register),
t Register)
sebagaimana ditunjukkan pada Gambar 4 dengan waktu akses satu siklus detak
4,
tunggal. Ke-32 register GPR ini langsung terhubung dengan ALU, membolehkan dua
R
register bebas (independen) dapat diakses dalam sebuah in
en) instruksi tunggal yang
ksi
dikerjakan dalam satu siklus detak tunggal.
s
Gambar 4. Register Serbaguna
Khusus register R26 s/d R31 memiliki fungsi tambahan selain sebagai GPR,
in
sebagaimana ditunjukkan pada Gambar 4 dan 5, register
register-register ini juga berfungsi
sebagai penunjuk alamat untuk pengalamatan tak tak-langsung pada Ruang Data. Pada
mode pengalamatan lainny register alamat tak-langsung X, Y dan Z ini memiliki
ya,
fungsi sebagai fixed displacement, automatic increment dan decrement.
cement ment
Gambar 5. Register X, Y dan Z
5
6. Gambar 6. Ringkasan Register
ngkasan Register-register Periferal dan Status
tatus
Gambar 7. Register Status
Register Status pada AVR (SREG) sebagaimana ditunjukkan pada gambar 7,
R (SREG),
tersimpan pada ruang lokasi I/O $3F atau $5F. Menyimpan 8 macam status:
si m
• I – Global Interrupt Enable
• T – Bit Copy Storagee
• H – Half Carry Flag
6
7. • S – Sign Bit, S = N (+) V
+)
• V – Two’s Complement Overflow Flag
ent
• N – Negative Flag
• Z – Zero Flag
• C – Carry Flag
Catatan penting: Register status – SREG, tidak secara otomatis menyimpan dan
mengembalikan lagi isi-isinya selama proses pemanggilan interupsi, hal ini harus
nya psi,
dilakukan melalui program atau perangkat lunak secara manual.
Gambar 8. Register
mbar Register-register Periferal
7
8. I.c. Mode Pengalamatan AVR dan Set Instruksi
n
Pada Gambar 9 ditunjukkan ringkasan mode pengalamatan yang dikenal pada
kan ang
Mikrokontroler Atmel’s AVR. Mode pengalamatan ini didasarkan pada jenis sumber
R. ada
dan tujuan dari suatu instruksi, apakah melalui register, memori, data langsung atau
uksi, ata
I/O. Sedangkan set instruksi ditunjukkan pada Gambar 18, 19, 20 dan 21.
si an
Gambar 9. Ringkasan Mode Pengalamatan Atmel’s AVR
VR
Gambar 10. Pengalamat Register Tunggal Langsung
0. g
Gambar 11. Pengalamatan Dua Register Langsung
1. g
Gambar 12. Pengalamatan I/O Langsung
bar
8
9. Gambar 13. Pengalamatan Data Langsung
bar
Gambar 14. Pengalamatan Tak
bar Tak-langsung
Gambar 15. Pengalamatan Tak
galamatan Tak-langsung dengan post-increment
crement
Gambar 16. Pengalamatan Tak
galamatan Tak-langsung dengan pre-decrement
rement
Gambar 17. Pengalamatan Tak
ngalamatan Tak-langsung dengan displacement
cement
Gambar 18. Ringkasan Instruksi Aritmetika dan Logika
ka
9
10. Gambar 19. Ringkasan Instruksi Bit dan Test
ar
Gambar 20. Ringkasan Instruksi Pencabangan
r
10
11. Gambar 21. Ringkasan Instruksi Transfer Data
r
Gambar 22. Ringkasan Operator Ekspresi (kiri) dan Pengarah (Directive – Kanan)
perator ective
11
12. I.d. Port-port I/O
Semua port AVR memiliki fungsionalitas Read
Read-Modify-Write yang sesungguhnya saat
esungguhnya
digunakan sebagai port-port I/O digital. Artinya, arah sebuah pin pada port dapat
ort
diubah tanpa harus merubah arah pin
ah pin-pin port yang lain menggunakan instruksi SBI
akan
dan CBI (lihat kembali Gambar 19). Hal ini juga berlaku untuk mengubah nilai
k
penggerak (jika dikonfigurasi sebagai keluaran) atau mengaktifkan/mematikan
urasi ktifkan/mematikan
resistor pull-up (jika dikonfigurasi sebagai masukan). Ringkasan dan gambar
onfigurasi san
skematik untuk port B dan D pada AVR AT9
AT90S2313 ditunjukkan pada Gambar 23 dan
da
24.
Gambar 23. R
Ringkasan port B dan D pada AVR AT90S2313
2313
Efek DDBn pada pin-pin port B:
rt
12
13. Efek DDDn pada pin-pin port D:
rt
Gambar 24. Rangkaian pin pada port
mbar
Fungsi alternatif port B:
• PINB7 – SCK, pin masukan detak untuk up/downloading memori,
mori,
• PINB6 – MISO, pin data keluaran untuk up/downloading memori,
mori,
• PINB5 – MOSI, pin data masukan untuk up/downloading memori,
emori,
• PINB3 – OC1, keluaran cocok perbandingan (compare match),
ran h
• PINB1 – AIN1, masukan negatif komp
ukan komparator analog,
• PINB0 – AIN2, masukan positif komparator analog.
ukan
Fungsi alternatif port D:
• PIND6 – ICP, pin capture masukan untuk Timer 1,
apture
• PIND5 – T1, pin masukan sumber detak untuk Timer 1,
sukan
• PIND4 – T0, pin masukan sumber detak untuk Timer/Counter 0,
sukan r
• PIND3 – INT1, sumber interupsi eksternal 1,
ber
• PIND2 – INT0, sumber interupsi eksternal 0,
ber
• PIND1 – TxD, mengirimkan data serial, sebagai pin keluaran data untuk
ngirimkan uaran
UART,
• PIND0 – RxD, menerima data serial, sebagai pin masukan data untuk UART,
erima ata
13
14. I.e. Interupsi
Mikrokontroler AVR menyediakan 10 sumber interupsi selain RESET. Interupsi-
ediakan RESET
interupsi ini dan vektor RESET masing-masing memiliki vektor program yang terpisah
SET ram
di dalam ruang memori program. Semua interupsi berhubungan dengan bit
an bit-bit
aktivasi individual yang harus di
arus di-set bersamaan dengan bit-I dalam SREG untuk
alam
mengaktifkan interupsi yang bersangkutan. Ringkasan vektor-vektor interupsi dan
ng ktor
RESET ditunjukkan pada Gambar 25. Setup program untuk inisialisasi interupsi
isialisasi
ditunjukkan pada Gambar 26.
Gambar 25. Ringkasan vektor-vektor interupsi dan reset
eset
Catatan: Bit-I akan di-nol-k secara perangkat keras (hardware) setelah munculnya
kan s
suatu interupsi dan akan di di-set oleh instruksi RETI untuk mengaktifkan interupsi
gaktifkan
yang muncul berikutnya (jika ada).
ka
Gambar 26. Setup program yang sering untuk alamat vektor reset dan interupsi
am et
14
15. Gambar 27. Tiga sumber RESET pada AT90S2313
I.f. Pencacah/Pewaktu 0 dan 1
Gambar 28. Bagan P
gan Pewaktu/Pencacah0 8-bit (Timer/Counter0)
unter0)
Pewaktu/Pencacah0 8-bit dapat menggunakan sumber detak dari CK, CK praskala
maupun pin eksternal. Pengaturan interupsi untuk Timer/Counter0 melalui TIMSK
ngaturan 0
atau Timer/Counter Interrupt Mask Register. Flag limpahan ada di dalam TIFR atau
upt
15
16. Timer/Counter Flag Register, sedangkan sinyal kontrol ditemukan pada TCCR0 atau
er,
Timer/Counter0 Control Register.
gister.
Gambar 29. Bagan Pewaktu/Pencacah1 16
an 16-bit (Timer/Counter1)
unter1)
Timer/Counter1 16-bit mendapatkan sumber detak dari tiga macam, yaitu CK, CK
ndapatkan am,
praskala atau pin eksternal. Pengaturan interupsi untuk Timer/Counter0 melalui
nal. /Counter0
TIMSK atau Timer/Counter Interrupt Mask Register. Flag limpahan ada di dalam
er han
TIFR atau Timer/Counter Flag Register, sedangkan sinyal kontrol ditemukan pada
l
TCCR1 atau Timer/Counter1 Control Register.
r1
16
18. Gambar 32. Bagan Sumber Detak untuk Timer/Counter0 dan 1
gan
I.g. Pewaktu Watchdog
Pewaktu Watchdog mendapatkan detak secara terpisah dari osilator on
patkan or on-chip 1 MHz.
Instruksi WDR digunakan untuk mereset pewaktu Watchdog (
n (harus dijalankan
selama periode waktu tertentu sebagaimana diberikan oleh praskalar WD
entu ar WD).
Gambar 33. Bagan pewaktu watchdog
mbar
18
20. I.h. Komparator Analog
Komparator analog membandingkan nilai pada masukan positif PB0 atau AIN0
bandingkan f
dengan masukan negatif PB1 atau AIN1. Jika masukan AIN0 > AIN1 maka nilai
keluarannya adalah ACO ‘1’. Bagan dan penggunaan ko
omparator analog
ditunjukkan pada Gambar 3 dan 37.
36
Gambar 36. Bagan Komparator Analog
mbar
Gambar 37. Penggunakan Komparator analog
r
20
21. I.i. Komunikasi Serial
Komunikasi serial dilakukan oleh unit UART – Universal Asynchronous Receiver and
n ous
Transmitter yang memiliki beberapa fitur:
• Generator baudrate;
• Baudrate yang tinggi;i;
• Data 8 atau 9 bit;
• Penapis derau;
• Deteksi Overrun;
• Deteksi Framing Error;
or;
• Deteksi False Start Bit;
• Tiga macam interupsi terpisah: Rx selesai, Tx selesai dan Register data Tx
psi
kosong.
Gambar 38. Bagan Komunikasi serial UART pada Mikrokontroler AVR
roler
Generator baudrate, sebagaimana ditunjukkan pada Gambar 39, merupakan
agaimana
pembagi frekuensi yang menghasilkan baudrate berdasarkan persamaan sebagai
ersamaan
berikut:
21
22. • BAUD = baudrate;
• fck = frekuensi detak kristal;
k
• UBBR = isi dari Register UART Baud Rate;
ster
Untuk frekuensi kristal standard, baudrate yang biasa digunakan dihasilkan
nakan
menggunakan pengaturan pada UBRR. Menggunakan baudrate yang memiliki error
ang
lebih dari 1% sama sekali tidak disarankan. Semakin besar error-nya semakin rentan
ya
terhadap derau. Perhatikan tabel pada Gambar 39 untuk penentuan baudrate.
n
Gambar 39. Isi UBBR berkaitan dengan nilai baudrate
. te
NB:
Keterangan lengkap pada bagian ini silahkan merujuk pada datasheet AT90S2313.
et
22
23. II. PEMROGRAMAN MIKROKONTROLER AVR (AT90S2313)
KROKONTROLER
II.a. Eksperimen-1: Proses aritmetika sederhana
ses
Membuat proyek baru dengan VMLAB 3.10
ngan
Untuk memahami pemrograman mikrokontroler AVR (khususnya AT90S2313)
ograman nya
gunakan metode Learning by Doing Aktifkan VMLAB vers 3.0 sehingga
ng Doing. rsi
ditampilkan jendela utama sebagaimana ditunjukkan pada Gambar 40.
Gambar 40. Jendela utama VMLAB 3.0
mbar
VMLAB menggunakan sistem proyek, dengan demikian langkah awal atau langkah
em wal
pertama adalah membuat proyek baru dengan cara memilih menu Project New
Project sehingga ditampilkan jendela dialog sebagaimana ditunjukkan pada Gambar
kan kan
41.
Step 1: Beri nama proyek-nnya, misalnya coba01;
Step 2: Pilih mikrokontroler yang akan digunakan, VMLAB mendukung hampir
er endukung
seluruh keluarga besar mikrokontroler Atmel’s AVR, dalam hal ini pilih
lam
AT90S2313;
Step 3: Pilih perangkat lunak kompilasi, sementara biarkan saja dulu seperti itu
nak
karena akan digunakan pemrograman Bahasa Assembly AVR;
akan R;
Step 4: Tambahkan file-file yang digunakan, gunakan tombol
e Add this untuk
menambahkan file-file sumber;
23
24. Step 5: Jangan lupa klik Ok sehingga akan dihasilkan dua berkas, yaitu project dan
assembler-nya, sebagaimana ditunjukkan pada Gambar 42.
bagaimana
Gambar 41. Jendela Dialog Create New Project
Gambar 42. Hasil dari Create new project
ar
24
25. Menuliskan program Assembly AVR
Selanjutnya tuliskan program assembler berikut ini, keterangan lengkap ada di dalam
acara workshop:
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
.include "C:VMLABinclude2313def.inc"
; Definisikan variabel disini...
;
.def a = r16
.def b = r17
.def x = r18
.def y = r19
.def z = r20
reset:
rjmp utama ; lompat ke program utama
reti ; posisi vektor interupsi $0001
reti ; posisi vektor interupsi $0002
reti ; posisi vektor interupsi $0003
reti ; posisi vektor interupsi $0004
reti ; posisi vektor interupsi $0005
reti ; posisi vektor interupsi $0006
reti ; posisi vektor interupsi $0007
reti ; posisi vektor interupsi $0008
reti ; posisi vektor interupsi $0009
reti ; posisi vektor interupsi $000A
utama:
ldi a, 10 ; int a = 10,
ldi b, 4 ; b = 4, x, y, z;
mov x, a ; x = a + b;
add x, b ;
mov y, a ; y = a - b;
sub y, b ;
lsl x ; untuk melakukan operasi x * 2;
asr y ; untuk melakukan operasi y * 2;
mov z, x ; z = x*2 + y/2;
add z, y ;
ulang:
inc r20 ; hanya sekedar menaikkan nilai r20
rjmp ulang ; ulangi lagi…
Lakukan kompilasi dengan menekan tombol F9. Jika tidak ada kesalahan, maka pada jendela
Message akan ditampilkan:
25
26. Melakukan simulasi dengan VMLAB 3.10
an
Selanjutkan dilakukan simulasi untuk melihat perubahan
asi perubahan-perubahan isi register, aktifkan
i
jendela register, sebagaimana ditunjukkan pada Gambar 43, dengan menekan Alt+Shift+R
a ekan
atau menggunakan menu View ew Registers/Flags.
G
Gambar 44. Jendela Registers/Flags
Lakukan simulasi langkah-demiemi-langkah dengan menekan F6, perhatikan perubahan isi
kan
register yang terkait sebagaimana contohnya ditunjukkan pada Gambar 44 dan 45.
mana 44
26
28. II.b. Eksperimen-2: Proses aritmetika kompleks
Kali ini dibuat program aritmetiks yang agak lebih kompleks dari sebelumnya,
tuliskan dan lakukan simulasi untuk program berikut serta jangan lupa untuk melihat
perubahan-perubahan yang terjadi pada register yang terkait.
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
.include "C:VMLABinclude2313def.inc"
; Define here the variables
;
.def a = r16
.def b = r17
; Define here Reset and interrupt vectors, if any
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
; Program starts here after Reset
; Untuk implementasi--------------------------
; while (a != b)
; if (a>b)
; a = a - b
; else
; b = b - a;
;---------------------------------------------
start:
cp a,b
brmi a_lbhkecil_b
sub a,b
rjmp cek
a_lbhkecil_b:
sub b,a
cek:
cp a,b
brne start
ulang:
28
29. rjmp ulang
Gambar 46. Perhatikan juga perubahan pada SREG
Gambar 47. Perhatikan juga perubahan pada SREG
29
30. II.c. Eksperimen-3: Penggunaan I/O untuk LED
Sekarang simulasi menggunakan LED pada Control Panel VMLAB (Gambar 48). Ketik
program assembler berikut, lakukan simulasi dan amati hasilnya.
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
.include "C:VMLABinclude2313def.inc"
; Define here the variables
;
.def temp =r16
; Define here Reset and interrupt vectors, if any
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
; Program starts here after Reset
;
start:
ldi temp, 0xFF ; simpan 255 kedalam r16 sebagai var temp
out DDRB, temp ; kirimkan nilai ini ke register arah
; port B (sebagai keluaran)
ulang:
out PORTB, temp ; tampilkan isi temp melalui PORTB
dec temp ; kurang nilai temp (=r16)
rjmp ulang
Menyiapkan berkas project untuk rangkaian eksternal
Kemudian buat rangkaian di sekitar mikrokontroler menggunakan berkas dengan format
SPICE sebagai berikut…
; ************************************************************
; PROJECT:
; AUTHOR:
; ************************************************************
; Micro + software running
; ------------------------------------------------------------
.MICRO "AT90S2313"
.PROGRAM "coba03.asm"
30
31. .TARGET "coba03.hex"
.TRACE ; Activate micro trace
tivate
; Following lines are optional; if not included
tional;
; exactly these values are taken by default
re
; ------------------------------------------------------------
--------------------------------------
--
.POWER VDD=5 VSS=0 ; Power nodes
wer
.CLOCK 1meg ; Micro clock
cro
.STORE 250m ; Trace (micro+signals) storage time
ace
; Micro nodes: RESET, PB0
0-PB7, PD0-PD5, ACO, TIM1OVF
; Define here the hardware around the micro
re
; ------------------------------------------------------------
--------------------------------------
--
D1 VDD n0 ; Like in real life, with a resistor.
D2 VDD n1
D3 VDD n2
D4 VDD n3
D5 VDD n4
D6 VDD n5
D7 VDD n6
D8 VDD n7
R0 n0 PB0 1K ; Voltage drop seen at PB0
ge
R1 n1 PB1 1K
R2 n2 PB2 1K
R3 n3 PB3 1K
R4 n4 PB4 1K
R5 n5 PB5 1K
R6 n6 PB6 1K
R7 n7 PB7 1K
Nb: jika Anda belum memahami SPICE dan ingin belajar simulasi elektronika menggunakan
ami nika
SPICE, dapatkan ebooknya dan softwaren (versi student) gratis di…
booknya softwarenya atis
http://agfi.staff.ugm.ac.id/index.php?page=simul
gfi.staff.ugm.ac.id/index.php?page=simul.
Perhatikan, susunan LED adalah common anoda, sehingga untuk menghidupkan digunakan
ah dupkan
logika ‘0’ bukan logika ‘1’.
Gambar 48. Tampilan Control Panel (
(Alt+Shift+C)
31
32. Gambar 49. Tampilan port I/O (
ar (Alt+Shift+I)
Gambar 50. Hasil simulasi…
32
33. II.d. Eksperimen-4: LED berjalan
Apa yang dilakukan oleh program ini??
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
.include "C:VMLABinclude2313def.inc"
; Define here the variables
;
.def temp =r16
; Define here Reset and interrupt vectors, if any
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
; Program starts here after Reset
;
start:
ldi temp, 0xFF ; jadikan semua PORTB menjadi keluaran
out DDRB, temp
ldi temp, 0x01 ; isikan data 0000 0001
ulang:
out PORTB, temp
cpi temp, 0x80 ; cek apakah sudah data 1000 0000?
brne lanjut ; Tidak, lompat ke lanjut
ldi temp, 0x01 ; Ya isi lagi dengan data awal 0000 0001
rjmp ulang ; ulangi lagi
lanjut:
lsl temp ; lakukan geser ke kiri
rjmp ulang ; ulangi lagi
Bagaimana jika sekarang arah gerakan diubah? Bagaimana pula untuk animasi ping-pong?
Atau animasi gerakan pingpong dua arah? Lakukan percobaan/modifikasi pada program…
33
34. II.e. Eksperimen-5: Penggu
ggunaan Interupsi Eksternal INT0 dan INT1
Dasar-Dasar Interupsi
Interupsi merupakan sebuah mekaniskme kontrol aliran yang diimplementasikan pada
h lementasikan
hampir semua kontroler, termasuk Atmel’s AVR. Pada aplikasi mikrokontroler yang
ikrokontroler
melibatkan interaksi dengan dunia luar, banyak hal-hal yang terjadi pada saat yang
n di
bersamaan, artinya, tidak pada kondisi tersinkronisasi, inilah yang harus ditangani oleh
ada arus
mikrokontroler.
Misalnya: sebuah tombol yang ditekan oleh pengguna, data
ng data-data yang dibaca pada port
g
serial atau UART, cuplikan-cuplikan yang diambil dari ADC atau bahkan sebuah pewaktu
uplikan an
yang seakan-akan meneriakkan “euy… waktunya habis!!”. Semua kejadian ini perlu ditangani
an n
oleh mikrokontroler.
Selain menggunakan teknik polling, dimana mikrokontroler selalu bertanya ke setiap periferal
olling, bertanya
apakah perlu dilayani atau tidak, kita bisa membuat agar periferal yang bersangkutan
dak, g bersangkutan-lah
yang akan memanggil mikrokontroler jika sudah tiba saatnya membutuhkan layanan. Hal ini
kontroler kan
dinamakan sebagai “interupsi”, prosesor atau mikrokontrol akan menghentikan program
i”, mikrokontroler ghentikan
utama yang sedang dijalankan untuk memeriksa interupsi yang terjadi dan melakukan aksi
n an aksi-
aksi yang terkait, setelah itu, program utama dijalankan kembali.
Struktur Program Terkendali
dali-Interupsi Pada AVR
Kita sekarang akan menuliskan sebuah program yang terkendali
an terkendali-interupsi dimana program
psi
utama tidak melakukan apapun kecuali menunggu terjadinya interupsi. Untuk AT90S8515
pun
akan digunakan dua interupsi eksternal yang diperoleh dari pin PD2 dan PD3, sebagaimana
i
ditunjukkan pada Gambar 51.
Gambar 51. Interupsi eksternal AT90S8515
bar
Hal-hal penting yang perlu dituliskan dalam program:
tuliskan
1. Mengatur lokasi lompatan vektor interupsi
atan gunakan .org
2. Mengatur set interupsi yang benar untuk mengaktifkan interupsi yang diinginkan
si
melalui GIMSK;
3. Lakukan pengaturan seperlunya pada register kontrol MCUCR;
eperlunya
4. Aktifkan interupsi secara global melalui SREG;
ara
Mengatur Lokasi Lompatan Vektor Interupsi dengan .org
n
Bagian paling bawah dari memori program AVR, dimulai pada alamat 0x0000, sering
at
disebut sebagai “Tabel vektor memori program dan program yang sesungguhnya harus
or program” esungguhnya
berawal dari ruang ini.
Tabel vektor digunakan untuk menyimpan vektor
k vektor-vektor interupsi, yaitu suatu lokasi tujuan
lompatan jika terjadi interupsi. Artinya, masing
psi. masing-masing interupsi memiliki lokasi memori
miliki
tertentu dan jika suatu interupsi terjadi, mikrokontroler akan melompat ke lokasi tersebut
upsi t
dan memeriksa apa yang ada di lokasi tersebut, misalnya untuk menemukan alamat dimana
a ukan
kode-kode untuk menangani interupsi tersebut d disimpan, perhatikan Gambar 52 tentang
ringkasan tabel vektor interupsi pada AT90S8515.
psi
34
35. Pengarah .org
Pada kode-kode assembly, pengarah .org digunakan untuk mengatur lokasi kode program.
Pengarah ini akan memberitahukan assembler untuk men-set pencacah lokasi pada suatu
nilai absolut. Ini bukan set instruksi AVR, hanya sekedar perintah yang digunakan assembler
untuk memastikan bahwa kode program dipetakan secara benar pada saat membuat berkas
biner untuk AVR. Perhatikan Gambar 53.
Gambar 52. Ringkasan Tabel Vektor 8515
Gambar 53. Contoh kode
Label digunakan untuk menggantikan suatu angka absolut yang menyatakan suatu alamat.
Yang perlu kita lakukan adalah memberitahukan assembler dimana lompatnya saat,
35
36. misalnya, terjadi pemanggilan vektor reset (dengan instruksi rjmp reset dan reset
merupakan label).
Harap dicatat bahwa baris pertama adalah penghandel reset. Di sinilah stack diatur.
Stack digunakan untuk menyimpan alamat kembalian (return address) dalam kode program
utama saat sebuah rutin interupsi atau subrutin dijalankan. Untuk sembarang layanan
interupsi atau subrutin agar bisa kembali ke alamat awal dengan benar, stack harus
ditempatkan di luar dari ruang vektor. Secara default, nilai SP (penunjuk stack) di-inisialisasi
dengan nilai $0000, yang sama dengan lokasi tempat vektor reset berada, sehingga kita
perlu mengaturnya dengan benar.
Untuk AVR dengan SRAM lebih dari 256 byte (selain dari AT Tiny, 2343 maupun 4433),
register SP panjangnya 2 byte dan terbagi dalam register SPL (low byte) dan SPH (high
byte).
Mengatur register GIMSK
Register GIMSK digunakan untuk mengaktifkan dan mematikan interupsi eksternal secara
individual, sebagaimana ditunjukkan pada Gambar 54. Karena kita akan menggunakan
interupsi eksternal INT0 dan INT1 melalui tombol di PD2 dan PD3, maka kedua interupsi
eksternal ini diaktifkan melalui GIMSK pada bit 6 dan 7.
Gambar 54. Pengaturan aktivasi interupsi pada GIMSK
Mengatur register MCUCR
Kita akan menggunakan bit 0, 1, 2 dan 3 pada register MCUCR, sebagaimana ditunjukkan
pada Gambar 55, untuk mengendalikan interupsi yang berasal dari INT0 dan INT1. Bit-bit
ini digunakan untuk mengendalikan bagaimana interupsi eksternal dapat terjadi, apakah saat
sisi turun (falling edge dari 1 0), sisi naik (rising edge dari 0 1) atau level (saat 0),
sebagaimana aturannya ditunjukkan pada Gambar 56.
Gambar 55. Pengaturan pada MCUCR
36
37. Gambar 56. Menentukan jenis picuan untuk aktivasi interupsi
Kita akan menggunakan sisi naik dari tombol yang terpasang, sebagaimana ditunjukkan
pada Gambar 57, sehingga untuk INT0, ISC01 dan ISC00 diisi masing-masing 1 dan 1,
demikian juga dengan ISC11 dan ISC10 untuk INT1.
Gambar 57. Rangkaian saklar untuk interupsi eksternal pada PD2 dan PD3
Anda perhatikan rangkaian di Gambar 57, normal akan terbaca sebagai logika ‘1’. Saat
tombol ditekan maka pada pin akan terbaca ‘0’. Sehingga interupsi akan terjadi saat tombol
dilepas, terjadi perubahan dari 0 1.
Mengaktifkan interupsi global dalam SREG
Untuk mengaktifkan interupsi secara global, selain mengaktifkan secara individu, bit 7 pada
register SREG (register status) juga harus di-set untuk mengaktifkan interupsi secara global
atau keseluruhan, perhatikan posisi bit-7 pada SREG di Gambar 58.
Gambar 58. Register SREG, gunakan instruksi sei agar bit 7 =1
Semua bit pada SREG akan di-nol-kan saat reset dan dapat dibaca/tulis selama program
berjalan. Hanya bit 7 yang diperhatikan untuk masalah interupsi ini, jika dibuat ‘1’, maka
akan mengaktifkan seluruh interupsi, untuk itu digunakan instruksi khusus sei.
Penjelasan program interupsi eksternal INT0 dan INT1
Untuk VMLAB, digunakan tombol K0 dan K1 untuk masukan PD2 dan PD3 sebagai
interupsi eksternal. Selain itu 8 LED dihubungkan ke PORTB sebagai tampilan eksternal. Saat
program dijalankan, semua LED akan mati, jika dilakukan penekanan salah satu tombol,
maka terjadi pencacahan naik atau pencacahan turun dan hasilnya ditunjukkan pada LED.
37
38. Perhatikan bagan aliran program sebagaimana ditunjukkan pada Gambar 59.
Gambar 59. Proses penanganan interupsi
1. Sebuah tombol ditekan misalnya PD2 yang berkaitan dengan INT0;
2. Vektor INT0 ditemukan;
3. Kode pada lokasi yang terkait dijalankan dan lompat ke suatu subrutin;
4. Subrutin kembali ke pengulangan utama menggunakan instruksi reti.
Inilah yang akan dilakukan program kita, tidak lebih tidak kurang. Selain inisialisasi, juga
dituliskan rutin-rutin pendek untuk menangani tombol (menghasilkan INT0 dan INT1) dan
beberapa pengarah assembler, hanya itu saja…
Oke inilah program kita menggunakan mikrokontroler AT90S8515…
;--------------------------------------------------------------------------
; Nam1: intr01.asm
; Judul: Program Interupsi sederhana pada AVR
;--------------------------------------------------------------------------
.include "C:VMLABinclude8515def.inc"
; Vektor layanan Interupsi
.org $0000
rjmp Reset ; vektor Reset
.org INT0addr
rjmp IntV0 ; vektor INT0 (interupsi eksternal dari pin D2)
.org INT1addr
rjmp IntV1 ; vektor INT1 (interupsi eksternal dari pin D3)
;--------------------------------------------------------------------------
;
; Definisi register untuk kalang utama
.def TIME=r16
.def TEMP=r17
.def BEEP=r18
;--------------------------------------------------------------------------
;
; Vektor Reset - hanya mengatur interupsi dan rutin layanan kemudian
; mengulang selamanya...
38
39. Reset:
ldi TEMP,low(RAMEND) ; Atur penunjuk stack ke akhir RAM
out SPL,TEMP
ldi TEMP, high(RAMEND)
out SPH, TEMP
ser TEMP ; Atur TEMP menjadi $FF menjadi...
out DDRB,TEMP ; ...atur arah data sebagai "keluaran"
out PORTB,TEMP ; ...semua lampu MATI!
out PORTD,TEMP ; ...semua high untuk pullup pada masukan
ldi TEMP,(1<<DDD6) ; hanya bit D6 saja sebagai keluaran,
out DDRD,TEMP ; ...keluaran untuk piezo buzzer pada pin D6
; atur int0 dan int1
ldi TEMP,(1<<INT0)+(1<<INT1) ; atur int masks 0 dan 1
out GIMSK,TEMP
ldi TEMP,$0f ; interrupsi t0 dan t1 hanya pada rising edge saja
out MCUCR,TEMP
ldi TIME,$00 ; Mulai dari 0
sei ; aktifkan interupsi dan go...!
loop:
rjmp loop ; Mengulang selama-lamanya...
;--------------------------------------------------------------------------
;
; Vektor Int0 - menurunkan pencacahan
IntV0:
dec TIME ; turunkan nilai TIME
rjmp Int01 ; lompat ke kode untuk menampilkan hasil
;--------------------------------------------------------------------------
;
; Vektor Int1 - menaikkan pencacahan
IntV1:
inc TIME ; naikkan nilai TIME
Int01:
mov r0,TIME ; tampilkan pada LED di PORT B
com r0
out PORTB,r0
reti
Baris pertama digunakan untuk menyertakan berkas 8515def.inc, sehingga semua nama
register dan I/O akan dikenal oleh assembler. Pada baris berikutnya didefinisikan tabel
vektor interupsi, pada $0000 diletakkan vektor reset. Ini adalah lokasi saat mikrokontoler
bangun di pagi hari, segalanya berawal dari lokasi ini. Selain itu, juga dilakukan pengaturan
vektor INT0 dan INT1 serta rutin untuk menghandelnya diberi nama IntV0 dan IntV1,
berturut-turut.
Selanjutnya dideklarasikan 3 variabel yang digunakan dalam program ke register r16, r17
dan r18 yang masing-masing panjangnya 1 byte saja!
39
40. Label RESET
Label RESET mengandung semua kode insialisasi, dijalankan saat mikrokontoler dihidupkan
atau saat reset. 4 baris pertama digunakan untuk mengatur stack, sebagaimana telah
dijelaskan sebelumnya. Perhatikan bagaimana instruksi ldi (load immediate) digunakan
untuk menyimpan nilai sementara sebelum nilai tersebut disimpan pada lokasi yang
sesungguhnya. Low() dan High() merupakan makro yang digunakan untuk mengembalikan
nilai dari argumen-nya, yang merupakan lokasi memori yang didefinisikan di berkas def.
Kemudian, 6 baris berikutnya mengatur register arah data PORTB dan PORTD, yaitu DDRB
dan DDRD. Semua bit PORTB sebagai keluaran, sehingga DDRB = $FF, sedangkan pada
PORTD, semua bit kecuali bit 6 sebagai masukan, karena bit-6 nantinya bisa dikembangkan
untuk memberikan sinyal keluaran.
Perhatikan instruksi:
ldi Temp, (1<<DDD6)
artinya “simpankan ke register TEMP nilai byte 1 yang digeser DDD6 ke kiri”.
Apa artinya DDD6? Dari berkas def, kita temukan bahwa nilai ini adalah 6 dan artinya
menunjuk pada bit ke-6 dari register arah PORTD (DDRD). Nilai disimpan kedalam TEMP
kemudian ke dalam DDRD, sehingga DDRD menyimpan 01000000.
6 baris selanjutnya digunakan untuk mengatur INT0 dan INT1 dengan memberikan nilai-
nilai tertentu pada register GIMSK dan MCUCR serta menyiapkan register TIME dengan
data $00, dan diakhiri instruksi sei untuk mengaktifkan seluruh interupsi.
Label LOOP
Label LOOP hanya berisi panggilan ke dirinya sendiri, mengulag terus menerus selama-
lamanya.
Label IntV0
Blok ini digunakan untuk menurukan nilai TEMP dengan instruksi dec. Kemudian lompat ke
label Int01 untuk menampilkan hasilnya pada LED.
Label IntV1
Blok ini digunakan untuk menaikkan nilai TEMP dengan instruksi inc kemudian
menampilkan hasilnya pada LED, yaitu masuk ke label Int01.
Label Int01
Disinilah register TEMP ditampilkan hasilnya ke LED, karena untuk menghidupkan LED harus
menggunakan logika 0, maka sebelumnya TEMP di-negasi dulu melalui r0 menggunakan
instruksi com (complement).
Jangan lupa siapkan berkas projek-nya untuk membuat rangkaian eksternal mikrokontroler.
; ************************************************************
; PROJECT:
; AUTHOR:
; ************************************************************
40
41. ; Micro + software running
ng
; ------------------------------------------------------------
--------------------------------------
--
.MICRO "AT90S8515"
.PROGRAM "intr01.asm"
.TARGET "intr01.hex"
.TRACE ; Activate micro trace
tivate
; Following lines are optional; if not included
tional;
; exactly these values are taken by default
re
; ------------------------------------------------------------
--------------------------------------
--
.POWER VDD=5 VSS=0 ; Power nodes
wer
.CLOCK 1meg ; Micro clock
cro
.STORE 250m ; Trace (micro+signals) storage time
ace
; Micro nodes: RESET, PA0
0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF
CO,
; Define here the hardware around the micro
re
; ------------------------------------------------------------
--------------------------------------
--
K0 VSS NODE1
R1 PD2 NODE1 1k
R2 NODE1 VDD 1K
K1 VSS NODE2
R3 PD3 NODE2 1k
R4 NODE2 VDD 1K
D1 VDD n0 ; Like in real life, with a resistor.
D2 VDD n1
D3 VDD n2
D4 VDD n3
D5 VDD n4
D6 VDD n5
D7 VDD n6
D8 VDD n7
R5 n0 PB0 1K ; Voltage drop seen at PB0
age
R6 n1 PB1 1K
R7 n2 PB2 1K
R8 n3 PB3 1K
R9 n4 PB4 1K
R10 n5 PB5 1K
R11 n6 PB6 1K
R12 n7 PB7 1K
Gunakan Control Panel untuk melakukan simulasi, sebagaimana ditunjukkan pada Gambar
uk ukkan
60, gunakan K0 dan K1 untuk INT0 dan INT1 serta perhatikan LED D1 s/d D8-nya.
k
Gambar 60. Control Panel untuk Eksperimen
ar Eksperimen-5
41
42. II.f. Eksperimen-6: Penggunaan Interupsi Pewaktu/Pencacah
Setelah sukses mencoba program interupsi sebelumnya, kali ini program interupsi akan kita
modifikasi dengan menambahkan satu interupsi lagi, yaitu interupsi pewaktu/pencacah
(Timer/Counter0). Jika ada perangkat kerasnya, pin PD6 bisa disambungkan ke speaker
sehingga bisa didengarkan hasilnya, menggunakan VMLAB digunakan scope dengan
instruksi spice plot untuk menggambarkan gelombangnya.
Interupsi Limpahan Pewaktu
AT90S8515 (juga AVR lainnya) memiliki dua pewaktu/pencacah, yang satu 8-bit sedangkan
lainnya 16-bit. Artinya, kedua pewaktu/pencacah tersebut bisa melakukan pencacahan mulai
dari suatu nilai tertentu (yang kita tentukan) hingga nilai maksimum-nya (256 dan 65535,
masing-masing). Kemudian akan menghasilkan interupsi limpahan (jika pencacahan
dilanjutkan hingga batas maksimal tersebut), jika interupsi yang terkait diaktifkan.
Saat terjadi limpahan, pencacah/pewaktu akan tetap melakukan pencacahan, mulai dari awal
(0) hingga batasan maksimal-nya. Dengan demikian, jika Anda ingin pencacahan tidak
dimulai dari 0 tetapi nilai lain yang Anda tentukan, maka program Anda buat sedemikian
rupa sehingga pencacah akan mereset bukan ke nilai 0 tetapi ke nilai yang Anda tentukan.
Apa yang akan kita lakukan? Cukup tambahkan 3 blok kode:
1. Vektor interupsi lainnya, untuk interupsi limpahan Timer0: OVF0addr;
2. Kode inisialisasi untuk pewaktu/pencacah 0: TIMSK, TCCR0 dan TCNT0;
3. Subrutin penghandel interupsi.
OVF0addr
Ini adalah nama yang sudah tercakup di dalam berkas 8515def.inc yang berupa lokasi
dimana vektor interupsi harus berada (silahkan cek pada berkas 8515def.inc). Kita
tambahkan dua baris berikut ke dalam program sebelumnya:
; -- vektor interupsi yang baru -
.org OVF0addr
rjmp TimerV0 ; vektor limpahan T/C0
TIMSK, TCCR0 dan TCNT0
Ketiga register ini digunakan untuk menyiapkan interupsi limpahan pewaktu kita. TCCR0
digunakan untuk mengendalikan operasi pewaktu/pencacah 0. Cacahan akan naik pada
setiap sinyal detak pada masukan pewaktu yang bersangkutan. Tetapi masukan detak dapat
dipilih dan diskala-kan dengan N. Yang perlu diperhatikan dalam hal ini adalah 3 bit pertama
pada TCCR0 sebagaimana ditunjukkan pada Gambar 61.
Gambar 61. Perhatikan 3 bit pertama pada TCCR0 untuk pemilihan sumber datak
42
43. Tabel yang ditunjukkan pada Gambar 62 digunakan sebagai acuan isi CS00, CS01 dan
CS02 untuk memilih sumber detaknya.
Gambar 62. Pemilihan sumber detak
TIMSK merupakan register interupsi pewaktu/pencacah yang digunakan untuk mematikan
dan mengaktifkan interupsi pewaktu/pencacah, yang juga mirip dengan GIMSK,
sebagaimana ditunjukkan pada Gambar 63.
Gambar 63. Register TIMSK
Yang perlu diperhatikan pada register TIMSK ini adalah sebuah bit khusus yang dinamakan
sebagai “Timer/Counter0 Overflow Interrupt Enable” yang disingkat sebagai TOIE0
dan ditemukan pada posisi bit ke-1. Untuk mengaktifkan, cukup tuliskan ‘1’ ke bit ini,
demikian juga untuk mematikan, gunakan logika ‘0’.
TCNT0 merupakan register pewaktu/pencacah yang sesungguhnya, di register inilah
pewaktuan atau pencacahan dilakukan, tidak bit khusus di dalam register ini. Register ini
bisa dibaca/tulis, dengan demikian bisa kita isi dengan sembarang nilai awal sesuai dengan
kebutuhan (untuk program kita digunakan 128 desimal atau $80).
Penjelasan program interupsi pewaktu/pencacah 0
Jika PD6 dihubungkan dengan speaker maka akan terdengar suara. Saat pewaktu/pencacah
0 melimpah akan men-togel pin PD6, hasilnya speakar akan berbunyi dengan frekuensi
dasar yang proporsional dengan frekuensi pin yang di-togel. Frekuensi dasarnya:
CLK/2*Praskala*(256-TIME)
Dengan TIME adalah nilai saat ini pada register TIME (=r16). Kedua tombol K0 dan K1
akan berpengaruh pada frekuensi dasar pin PD6 dengan demikian suara yang dihasilkan
bisa berbeda-beda.
43
44. Bagaimana rumus frekuensi dasarnya?
Pewaktu/pencacah mencacah naik dari suatu nilai tertentu setiap siklus detak hingga
melimpah (overflow). Kemudian nilai pewaktu/pencacah direset dan proses berulang lagi dari
nilai reset tersebut.
Perhatikan ilustrasi berikut, jika limpahan terjadi setiap siklus detak CLK dan digunakan
untuk mem-flip nilai suatu pin, maka akan diperoleh frekuensi dasar:
CLK/2
2 Hz
4 clock
melimpah melimpah melimpah melimpah
karena register pewaktu/pencacah panjang-nya 8 bit, maka pencacah akan mencacah dari
suatu nilai awal (misalnya TIME) hingga batasan maksimum (255 atau $FF), sehingga
persamaan menjadi…
CLK/2 * (256-TIME)
Selain itu ada juga praskala (=N), maka persamaan berubah menjadi…
CLK/2 * N *(256-TIME)
Perhatikan program lengkap berikut…
;--------------------------------------------------------------------------
; Nama: intr02.asm
; Judul: Program Interupsi sederhana pada AVR + Timer0
;--------------------------------------------------------------------------
.include "C:VMLABinclude8515def.inc"
; Vektor layanan Interupsi
.org $0000
rjmp Reset ; vektor Reset
.org INT0addr
rjmp IntV0 ; vektor INT0 (interupsi eksternal dari pin D2)
.org INT1addr
rjmp IntV1 ; vektor INT1 (interupsi eksternal dari pin D3)
; -- vektor interupsi yang baru -
.org OVF0addr
rjmp TimerV0 ; vektor limpahan T/C0
;--------------------------------------------------------------------------
;
; Definisi register untuk kalang utama
.def TIME=r16
.def TEMP=r17
.def BEEP=r18
;-----------------------------------------------------------------
;
44
45. ; Vektor Reset - hanya mengatur interupsi dan rutin layanan
; kemudian mengulang selamanya...
Reset:
ldi TEMP,low(RAMEND) ; Atur penunjuk stack ke akhir SRAM
out SPL,TEMP
ldi TEMP, high(RAMEND)
out SPH, TEMP
ser TEMP ; Atur TEMP dengan nilai $FF untuk...
out DDRB,TEMP ; ...mengatur arah data sebagai "keluaran"
out PORTB,TEMP ; ...semua lampu MATI!
out PORTD,TEMP ; ...semua HIGH untuk masukan
ldi TEMP,(1<<DDD6) ; kecuali bit D6 sebagai keluaran
out DDRD,TEMP ; ...keluaran ke piezo buzzer melalui pin D6
; set up int0 and int1
ldi TEMP,(1<<INT0)+(1<<INT1) ; set int masks 0 dan 1
out GIMSK,TEMP
ldi TEMP, 0x0F ; interrupsi t0 dan t1 pada rising edge
out MCUCR,TEMP
;-- blok baru --
ldi TIME, 0x80 ; mulai dari 128.
out TCNT0,TIME ; set Timer/counter juga.
ldi TEMP,(1<<TOIE0) ; aktivasi interupsi limpahan timer 0
out TIMSK,TEMP
ldi TEMP, 0x02 ; praskala detak = clk/8
out TCCR0,TEMP
ldi BEEP, 0x00
sei ; aktivasi seluruh interupsi...
loop:
rjmp loop ; mengulang selama-lamanya...
;-----------------------------------------------------------------
;
; Vektor Int0 - menurunkan cacahan
IntV0:
dec TIME ; turunkan cacahan
rjmp Int01 ; lompat ke INT01 untuk menampilkan hasil ke LED
;-----------------------------------------------------------------
;
; Vektor Int1 - menaikkan cacahan
IntV1:
inc TIME ; naikkan cacahan
Int01:
mov r0,TIME ; tampilkan ke LED
com r0
out PORTB,r0
reti
;-----------------------------------------------------------------
;
45
46. ; Vektor Timer 0 - togel bit PD6
TimerV0:
out TCNT0,TIME ; reset pewaktu TCNT0 <- TIME
com BEEP
ori BEEP,0xBF ; bit 6 saja; lainnya HIGH untuk pullup
out PORTD,BEEP
reti ; penting buanget - harus reti
;untuk set interrupt flag
Jangan lupa untuk membuat rangkaian eksternalnya menggunakan project…
; ************************************************************
; PROJECT:
; AUTHOR:
; ************************************************************
; Micro + software running
; ------------------------------------------------------------
.MICRO "AT90S8515"
.PROGRAM "intr02.asm"
.TARGET "intr02.hex"
.TRACE ; Activate micro trace
; Following lines are optional; if not included
; exactly these values are taken by default
; ------------------------------------------------------------
.POWER VDD=5 VSS=0 ; Power nodes
.CLOCK 1meg ; Micro clock
.STORE 250m ; Trace (micro+signals) storage time
; Micro nodes: RESET, PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF
; Define here the hardware around the micro
; ------------------------------------------------------------
K0 VSS NODE1
R1 PD2 NODE1 1k
R2 NODE1 VDD 1K
K1 VSS NODE2
R3 PD3 NODE2 1k
R4 NODE2 VDD 1K
D1 VDD n0 ; Like in real life, with a resistor.
D2 VDD n1
D3 VDD n2
D4 VDD n3
D5 VDD n4
D6 VDD n5
D7 VDD n6
D8 VDD n7
46
47. R5 n0 PB0 1K ; Voltage drop seen at PB0
age
R6 n1 PB1 1K
R7 n2 PB2 1K
R8 n3 PB3 1K
R9 n4 PB4 1K
R10 n5 PB5 1K
R11 n6 PB6 1K
R12 n7 PB7 1K
.plot v(PD6)
Hasilnya dilihat melalui control panel dan scope, sebagaimana ditunjukkan pada Gambar 64.
ol n
Gambar 64. Scope pada VMLAB untuk eksperimen
eksperimen-6
Catatan:
Saran dan masukan untuk ebook ini silahkan kirim email ke agfi@ugm.ac.id terima kasih!
ook id,
--- selesai ---
47
48. INFORMASI TENTANG PELATIHAN MIKROKONTROLER
Hanya dengan minimal 10 JAM (karena langsung dibimbing oleh Pakarnya)
Anda bisa memahami konsep dasar dan membuat aplikasi mikrokontroler
(AT89/AVR)!
Ditambah dengan konsultasi gratis Anda bisa meningkatkan
kemampuan Anda dalam mikrokontroler AVR/AT89!
Anda juga bisa menghasilkan
INCOME TAK TERBATAS
dengan memanfaatan kemampuan Anda di bidang mikrokontroler!
Pelatihan yang saya selenggarakan mampu memberikan peserta konsep dasar dan tip/trik
pembuatan aplikasi mikrokontroler hanya dengan 4 sesi x 2,5 jam = 10 jam!
Jika Anda merasa kurang, saya juga memberikan konsultasi gratis selama 3 bulan!
Informasi dan pemesanan: akses ke http://agfi.staff.ugm.ac.id atau agfi@ugm.ac.id
Untuk pelatihan sehari workshop AVR ini silahkan hubungi: agfi@ugm.ac.id
Didukung oleh:
-o-
48