mikrokontrolleravr-121108060828-phpapp01
DESCRIPTION
Aplikasi Mikrokontroller AVRTRANSCRIPT
1
e-book Handout Workshop Pemrograman AVR
(AT90S2313/AT90S8515)
oleh Agfianto Eko Putra
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…
2
Handout Workshop Pemrograman AVR (AT90S2313/AT90S8515)
Disusun oleh: Agfianto Eko Putra – [email protected]
(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
I. PENDAHULUAN MIKROKONTROLER AVR (AT90S2313)
I.a. Arsitektur Mikrokontroler Atmel’s AVR
Mikrokontroler Atmel’s AVR secara umum memiliki beberapa bagian penting,sebagaimana arsitektur dasarnya ditunjukkan pada Gambar 1. Sedangkan inti CPU(CPU core) dan periferalnya ditunjukkan pada Gambar 2 dan 3.
Gambar 1. Arsitektur dasar Mikrokontroler Atmel’s AVR
Jika diperhatikan pada arsitektur tersebut terdapat 3 macam register:1. Register serbaguna atau2. Register status atau SREG3. Register periferal atau
Yang masing-masing memilki fungsi atau kegunaan tertentu yang akan kita lihatpada pasal Tentang Register Mikrokontroler Atmel’s AVR.
Demikian juga dengan bagian periferal AVR, sebagaimana ditunjukkan pada Gambar3, terdapat berbagai macammembahas periferal.
OKONTROLER AVR (AT90S2313)
troler Atmel’s AVR
VR secara umum memiliki beberapa bagian penting,sarnya ditunjukkan pada Gambar 1. Sedangkan inti CPUa ditunjukkan pada Gambar 2 dan 3.
Arsitektur dasar Mikrokontroler Atmel’s AVR
tektur tersebut terdapat 3 macam register:na atau General Purpose Register;tau SREG – Status Register, dan atau Periphery Registers
milki fungsi atau kegunaan tertentu yang akan kita lihater Mikrokontroler Atmel’s AVR.
ian periferal AVR, sebagaimana ditunjukkan pada Gambarm periferal yang juga akan kita lihat pada pasal
3
bagian penting,dangkan inti CPU
VR
er:
ng akan kita lihat
kan pada Gambara pasal-pasal yang
Gambar 2. CPU Core
Gambar 3. Periferal Mikrokontroler Atmel’s AVR
2. CPU Core Mikrokontroler Atmel’s AVR
3. Periferal Mikrokontroler Atmel’s AVR
4
I.b. Tentang Register-register AVR
CPU mengandung 32x8 bit registersebagaimana ditunjukkan pada Gambar 4tunggal. Ke-32 register GPR ini langsung terhubung dengan ALU, membolehkan duaregister bebas (independen) dapat diakses dalam sebuah indikerjakan dalam satu siklus detak tunggal.
Khusus register R26 s/d R31 memiliki fungsi tambahan selain sebagai GPR,sebagaimana ditunjukkan pada Gambar 4 dan 5, registersebagai penunjuk alamat untuk pengalamatan takmode pengalamatan lainnyfungsi sebagai fixed displacement
egister AVR
t register serbaguna (GPR – General Purpose Register)pada Gambar 4, dengan waktu akses R ini langsung terhubung dengan ALU, membolehkan dua
en) dapat diakses dalam sebuah instruksi tunggal yangs detak tunggal.
Gambar 4. Register Serbaguna
R31 memiliki fungsi tambahan selain sebagai GPR,pada Gambar 4 dan 5, register-register ini juga berfungsiuntuk pengalamatan tak-langsung pada Ruang Data. Padaya, register alamat tak-langsung X, Y dan Z ini memilikicement, automatic increment dan decrement
Gambar 5. Register X, Y dan Z
5
Purpose Register),satu siklus detak
membolehkan duaksi tunggal yang
in sebagai GPR,ini juga berfungsiRuang Data. Padadan Z ini memilikiment.
Gambar 6. Ringkasan Register
Register Status pada AVR (SREG)tersimpan pada ruang lokasi I/O $3F atau $5F. Menyimpan 8 macam status:
• I – Global Interrupt Enable• T – Bit Copy Storage• H – Half Carry Flag
ngkasan Register-register Periferal dan Status
Gambar 7. Register Status
R (SREG), sebagaimana ditunjukkan pada gambar 7,si I/O $3F atau $5F. Menyimpan 8 macam status:Enable
e
6
tatus
pada gambar 7,m status:
• S – Sign Bit, S = N (+) V• V – Two’s Complement Overflow Flag• N – Negative Flag • Z – Zero Flag • C – Carry Flag
Catatan penting: Register statusmengembalikan lagi isi-isinya selama proses pemanggilan interupsi, hal ini harusdilakukan melalui program atau perangkat lunak secara manual.
Gambar 8. Register
+) Vent Overflow Flag
status – SREG, tidak secara otomatis menyimpan dannya selama proses pemanggilan interupsi, hal ini harusatau perangkat lunak secara manual.
mbar 8. Register-register Periferal
7
menyimpan danpsi, hal ini harus
I.c. Mode Pengalamatan AVR
Pada Gambar 9 ditunjukkan ringkasan mode pengalamatan yang dikenal padaMikrokontroler Atmel’s AVR. Mode pengalamatan inidan tujuan dari suatu instruksi, apakah melalui register, memori, data langsung atauI/O. Sedangkan set instruksi ditunjukkan pada Gambar 18, 19, 20 dan 21.
Gambar 9. Ringkasan Mode Pengalamatan Atmel’s AVR
Gambar 10.
Gambar 11. Pengalamatan Dua Register Langsung
Gambar 12. Pengalamatan
n AVR dan Set Instruksi
kan ringkasan mode pengalamatan yang dikenal padaR. Mode pengalamatan ini didasarkan pada jenis sumberuksi, apakah melalui register, memori, data langsung atausi ditunjukkan pada Gambar 18, 19, 20 dan 21.
Ringkasan Mode Pengalamatan Atmel’s AVR
0. Pengalamat Register Tunggal Langsung
1. Pengalamatan Dua Register Langsung
bar 12. Pengalamatan I/O Langsung
8
ang dikenal padaada jenis sumberata langsung atauan 21.
VR
g
g
Gambar 13. Pengalamatan Data Langsung
Gambar 14. Pengalamatan Tak
Gambar 15. Pengalamatan Tak
Gambar 16. Pengalamatan Tak
Gambar 17. Pengalamatan Tak
Gambar 18. Ringkasan Instruksi Aritmetika dan Logika
bar 13. Pengalamatan Data Langsung
bar 14. Pengalamatan Tak-langsung
galamatan Tak-langsung dengan post-increment
galamatan Tak-langsung dengan pre-decrement
ngalamatan Tak-langsung dengan displacement
Ringkasan Instruksi Aritmetika dan Logika
9
crement
rement
cement
ka
Gambar 19. Ringkasan Instruksi Bit dan Test
Gambar 20. Ringkasan Instruksi Pencabangan
ar 19. Ringkasan Instruksi Bit dan Test
r 20. Ringkasan Instruksi Pencabangan
10
Gambar 21. Ringkasan Instruksi Transfer Data
Gambar 22. Ringkasan Operator Ekspresi
r 21. Ringkasan Instruksi Transfer Data
perator Ekspresi (kiri) dan Pengarah (Directive
11
ective – Kanan)
I.d. Port-port I/O Semua port AVR memiliki fungsionalitas Readdigunakan sebagai port-port I/O digital. Artinya, arah sebuah pin pada port dapatdiubah tanpa harus merubah arah pindan CBI (lihat kembali Gambar 19). Hal ini juga berlaku untuk mengubah nilaipenggerak (jika dikonfigurasi sebagai keluaran) atau mengaktifkan/mematikanresistor pull-up (jika dikonfigurasi sebagai masukan). Ringkasan dan gambarskematik untuk port B dan D pada AVR AT924.
Gambar 23. R
Efek DDBn pada pin-pin port B:
fungsionalitas Read-Modify-Write yang sesungguhnya saatort I/O digital. Artinya, arah sebuah pin pada port dapatah arah pin-pin port yang lain menggunakan instruksi
Gambar 19). Hal ini juga berlaku untuk mengubah nilaiurasi sebagai keluaran) atau mengaktifkan/mematikanonfigurasi sebagai masukan). Ringkasan dan gambarD pada AVR AT90S2313 ditunjukkan pada Gambar 23
Ringkasan port B dan D pada AVR AT90S2313
rt B:
12
esungguhnya saatpada port dapat
akan instruksi SBI k mengubah nilaiktifkan/mematikansan dan gambarda Gambar 23 dan
2313
Efek DDDn pada pin-pin port D:
Gambar 24. Rangkaian pin pada port
Fungsi alternatif port B: • PINB7 – SCK, pin m• PINB6 – MISO, pin data keluaran untuk up/downloading memori,• PINB5 – MOSI, pin data masukan untuk up/downloading memori,• PINB3 – OC1, keluaran cocok perbandingan (• PINB1 – AIN1, masukan negatif komp• PINB0 – AIN2, masukan positif komparator analog.
Fungsi alternatif port D: • PIND6 – ICP, pin capture• PIND5 – T1, pin masukan sumber detak untuk Timer 1,• PIND4 – T0, pin masukan sumber detak untuk Timer/Counter 0,• PIND3 – INT1, sumber interupsi eksternal 1,• PIND2 – INT0, sumber interupsi eksternal 0,• PIND1 – TxD, mengirimkan data serial, sebagai pin keluaran data untuk
UART, • PIND0 – RxD, menerima data serial, sebagai pin masukan data untuk UART,
rt D:
mbar 24. Rangkaian pin pada port
asukan detak untuk up/downloading memori,data keluaran untuk up/downloading memori,data masukan untuk up/downloading memori,ran cocok perbandingan (compare matchukan negatif komparator analog, ukan positif komparator analog.
apture masukan untuk Timer 1, sukan sumber detak untuk Timer 1,sukan sumber detak untuk Timer/Counter 0,ber interupsi eksternal 1,ber interupsi eksternal 0,ngirimkan data serial, sebagai pin keluaran data untuk
erima data serial, sebagai pin masukan data untuk UART,
13
mori,mori,
emori,h),
r 0,
uaran data untuk
ata untuk UART,
I.e. Interupsi Mikrokontroler AVR menyediakan 10 sumber interupsiinterupsi ini dan vektor RESETdi dalam ruang memori program. Semua interupsi berhubungan dengan bitaktivasi individual yang harus dimengaktifkan interupsi yang bersangkutan.RESET ditunjukkan pada Gambar 25.ditunjukkan pada Gambar 26.
Gambar 25.
Catatan: Bit-I akan di-nol-ksuatu interupsi dan akan diyang muncul berikutnya (jika ada).
Gambar 26. Setup program yang sering untuk alamat vektor reset dan interupsi
ediakan 10 sumber interupsi selain RESETSET masing-masing memiliki vektor program yang terpisahprogram. Semua interupsi berhubungan dengan bitarus di-set bersamaan dengan bit-I dalam SREG untukng bersangkutan. Ringkasan vektor-vektor interupsi danGambar 25. Setup program untuk inisialisasi interupsi
26.
Ringkasan vektor-vektor interupsi dan reset
kan secara perangkat keras (hardware) sdi-set oleh instruksi RETI untuk mengaktifkan interupsi
ka ada).
am yang sering untuk alamat vektor reset dan interupsi
14
RESET. Interupsi-ram yang terpisahan dengan bit-bit alam SREG untukktor interupsi danisialisasi interupsi
eset
setelah munculnyagaktifkan interupsi
et dan interupsi
Gambar 27. Tiga sumber RESET pada AT90S2313
I.f. Pencacah/Pewaktu 0 dan 1
Gambar 28. Bagan P
Pewaktu/Pencacah0 8-bit dapat menggunakan sumber detak dari CK, CK praskalamaupun pin eksternal. Pengaturan interupsi untuk Timer/Counter0 melaluiatau Timer/Counter Interrupt Mask Register. Flag limpahan ada di dalam
27. Tiga sumber RESET pada AT90S2313
0 dan 1
gan Pewaktu/Pencacah0 8-bit (Timer/Counter0)
dapat menggunakan sumber detak dari CK, CK praskalangaturan interupsi untuk Timer/Counter0 melaluiupt Mask Register. Flag limpahan ada di dalam
15
unter0)
CK, CK praskala0 melalui TIMSK dalam TIFR atau
Timer/Counter Flag Register, sedangkan sinyal kontrol ditemukan padaTimer/Counter0 Control Register.
Gambar 29. Bagan Pewaktu/Pencacah1 16
Timer/Counter1 16-bit mendapatkan sumber detak dari tiga macam, yaitu CK, CKpraskala atau pin eksternal.TIMSK atau Timer/Counter Interrupt Mask Register. Flag limpahan ada di dalamTIFR atau Timer/Counter Flag Register, sedangkan sinyal kontrol ditemukan padaTCCR1 atau Timer/Counter1 Control Register.
er, sedangkan sinyal kontrol ditemukan padagister.
an Pewaktu/Pencacah1 16-bit (Timer/Counter1)
ndapatkan sumber detak dari tiga macam, yaitu CK, CKnal. Pengaturan interupsi untuk Timer/Counter0 melaluier Interrupt Mask Register. Flag limpahan ada di dalamFlag Register, sedangkan sinyal kontrol ditemukan padar1 Control Register.
16
pada TCCR0 atau
unter1)
am, yaitu CK, CK/Counter0 melaluihan ada di dalaml ditemukan pada
Gambar 30. Penggunaan Timer/Counter1
Gambar 31. Ilustrasi sumber detak
bar 30. Penggunaan Timer/Counter1
ambar 31. Ilustrasi sumber detak
17
Gambar 32. Bagan
I.g. Pewaktu Watchdog
Pewaktu Watchdog mendapatkan detak secara terpisahInstruksi WDR digunakanselama periode waktu tertentu sebagaimana diberikan oleh praskalar WD
Gambar 33. Bagan pewaktu watchdog
gan Sumber Detak untuk Timer/Counter0 dan 1
patkan detak secara terpisah dari osilator onn untuk mereset pewaktu Watchdog (entu sebagaimana diberikan oleh praskalar WD
mbar 33. Bagan pewaktu watchdog
18
dan 1
or on-chip 1 MHz. (harus dijalankan ar WD).
Gambar 34. Penggunaan pewaktu watchdog
G
ar 34. Penggunaan pewaktu watchdog
Gambar 35. Praskalar Watchdog
19
I.h. Komparator Analog
Komparator analog membandingkan nilai pada masukan positif PB0 atau AIN0dengan masukan negatif PB1 atau AIN1. Jika masukan AIN0 > AIN1 maka nilaikeluarannya adalah ACOditunjukkan pada Gambar 3
Gambar
Gambar
bandingkan nilai pada masukan positif PB0 atau AIN0PB1 atau AIN1. Jika masukan AIN0 > AIN1 maka nilai� ‘1’. Bagan dan penggunaan ko
36 dan 37.
mbar 36. Bagan Komparator Analog
r 37. Penggunakan Komparator analog
20
f PB0 atau AIN0AIN1 maka nilai
omparator analog
I.i. Komunikasi Serial Komunikasi serial dilakukan oleh unit UARTTransmitter yang memiliki beberapa fitur:
• Generator baudrate;• Baudrate yang tinggi;• Data 8 atau 9 bit; • Penapis derau; • Deteksi Overrun; • Deteksi Framing Error;• Deteksi False Start Bit;• Tiga macam interupsi terpisah: Rx selesai, Tx selesai dan Register data Tx
kosong.
Gambar 38. Bagan Komunikasi serial UART pada Mikrokontroler AVR
Generator baudrate, sebagaimana ditunjukkan pada Gambar 39,pembagi frekuensi yang menghasilkan baudrate berdasarkan persamaan sebagaiberikut:
n oleh unit UART – Universal Asynchronous Receiver andbeberapa fitur:
i;
or;Bit;psi terpisah: Rx selesai, Tx selesai dan Register data Tx
Komunikasi serial UART pada Mikrokontroler AVR
agaimana ditunjukkan pada Gambar 39,menghasilkan baudrate berdasarkan persamaan sebagai
21
ous Receiver and
Register data Tx
roler AVR
39, merupakan ersamaan sebagai
• BAUD = baudrate; • fck = frekuensi detak kristal;• UBBR = isi dari Register UART Baud Rate;
Untuk frekuensi kristal standard, baudrate yang biasa digunakan dihasilkanmenggunakan pengaturan pada UBRR.lebih dari 1% sama sekali tidak disarankan.terhadap derau. Perhatikan tabel pada Gambar 39 untuk penentuan baudrate.
Gambar 39. Isi UBBR berkaitan dengan nilai baudrate
NB: Keterangan lengkap pada bagian ini
k kristal;ster UART Baud Rate;
standard, baudrate yang biasa digunakan dihasilkanpada UBRR. Menggunakan baudrate yang memiliki error
tidak disarankan. Semakin besar error-nya semakin rentantabel pada Gambar 39 untuk penentuan baudrate.
. Isi UBBR berkaitan dengan nilai baudrate
bagian ini silahkan merujuk pada datasheet AT90S2313.
22
nakan dihasilkanang memiliki errorya semakin rentann baudrate.
te
et AT90S2313.
II. PEMROGRAMAN MIKROKONTROLER AVR (AT90S2313)
II.a. Eksperimen-1: Proses aritmetika sederhana
Membuat proyek baru dengan VMLAB 3.10
Untuk memahami pemrograman mikrokontroler AVR (khususnya AT90S2313)gunakan metode Learning by Doingditampilkan jendela utama sebagaimana ditunjukkan pada Gambar 40.
Gambar 40. Jendela utama VMLAB 3.0
VMLAB menggunakan sistem proyek, dengan demikian langkah awal atau langkahpertama adalah membuat proyek baru dengan cara memilih menuProject sehingga ditampilkan jendela dialog sebagaimana ditunjukkan pada Gambar41. Step 1: Beri nama proyek-nStep 2: Pilih mikrokontroler yang akan digunakan, VMLAB mendukung hampir
seluruh keluarga besar mikrokontrolerAT90S2313;
Step 3: Pilih perangkat lunak kompilasi, sementara biarkan saja dulu seperti itukarena akan digunakan pemrograman Bahasa Assembly AVR;
Step 4: Tambahkan file-file yang digunakan, gunakan tombolmenambahkan file-
KROKONTROLER AVR (AT90S2313)
ses aritmetika sederhana
ngan VMLAB 3.10
ograman mikrokontroler AVR (khususnya AT90S2313)ng by Doing. Aktifkan VMLAB verssebagaimana ditunjukkan pada Gambar 40.
mbar 40. Jendela utama VMLAB 3.0
em proyek, dengan demikian langkah awal atau langkahproyek baru dengan cara memilih menukan jendela dialog sebagaimana ditunjukkan pada Gambar
nya, misalnya coba01;er yang akan digunakan, VMLAB mendukung hampirbesar mikrokontroler Atmel’s AVR, dalam hal ini pilih
nak kompilasi, sementara biarkan saja dulu seperti ituakan pemrograman Bahasa Assembly AVR;e yang digunakan, gunakan tombol �file sumber;
23
nya AT90S2313)rsi 3.0 sehingga 40.
wal atau langkahProject � New
kan pada Gambar
endukung hampirlam hal ini pilih
dulu seperti ituR;
Add this untuk
Step 5: Jangan lupa klik Oassembler-nya, sebagaimana ditunjukkan pada Gambar 42.
Gambar 41. Jendela Dialog
Gambar 42. Hasil dari
k sehingga akan dihasilkan dua berkas, yaitu project danbagaimana ditunjukkan pada Gambar 42.
41. Jendela Dialog Create New Project
ar 42. Hasil dari Create new project
24
yaitu project dan
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:\VMLAB\include\2313def.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:
Melakukan simulasi dengan VMLAB 3.10
Selanjutkan dilakukan simulasi untuk melihat perubahanjendela register, sebagaimana ditunjukkan pada Gambar 43, dengan menekanatau menggunakan menu View
G
Lakukan simulasi langkah-demiregister yang terkait sebagaimana contohnya ditunjukkan pada Gambar 4
an VMLAB 3.10
asi untuk melihat perubahan-perubahan isi register, aktifkana ditunjukkan pada Gambar 43, dengan menekanew � Registers/Flags.
Gambar 44. Jendela Registers/Flags
emi-langkah dengan menekan F6, perhatikan perubahan isimana contohnya ditunjukkan pada Gambar 44
26
i register, aktifkanekan Alt+Shift+R
kan perubahan isi4 dan 45.
Gambar 44. Hasil simulasi…
Gambar 45. Hasil simulasi…
27
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:\VMLAB\include\2313def.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:
29
rjmp ulang
Gambar 46. Perhatikan juga perubahan pada SREG
Gambar 47. Perhatikan juga perubahan pada SREG
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:\VMLAB\include\2313def.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"
.TARGET "coba03.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, PB0; Define here the hardware around the micro; ------------------------------------------------------------
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 PB0R1 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 SPICESPICE, dapatkan ebooknya dan softwaren
http://agfi.staff.ugm.ac.id/index.php?page=simul
Perhatikan, susunan LED adalah common anoda, sehingga untuk menghidupkan digunakanlogika ‘0’ bukan logika ‘1’.
Gambar 48. Tampilan Control Panel (
tivate micro trace
tional; if not includedre taken by default--------------------------------------wer nodescro clockace (micro+signals) storage time
0-PB7, PD0-PD5, ACO, TIM1OVF re around the micro--------------------------------------
in real life, with a resistor.
ge drop seen at PB0
ami SPICE dan ingin belajar simulasi elektronika menggunakanbooknya dan softwarenya (versi student) gratisgfi.staff.ugm.ac.id/index.php?page=simul.
ah common anoda, sehingga untuk menghidupkan digunakan
48. Tampilan Control Panel (Alt+Shift+C)
31
--
--
nika menggunakanatis di…
dupkan digunakan
Gambar 49. Tampilan port I/O (ar 49. Tampilan port I/O (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:\VMLAB\include\2313def.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…
II.e. Eksperimen-5: Penggu
Dasar-Dasar Interupsi Interupsi merupakan sebuah mekaniskme kontrol aliran yang diimplementasikan padahampir semua kontroler, termasuk Atmel’s AVR. Pada aplikasi mikrokontroler yangmelibatkan interaksi denganbersamaan, artinya, tidak pada kondisi tersinkronisasi, inilah yang harus ditangani olehmikrokontroler. Misalnya: sebuah tombol yang ditekan oleh pengguna, dataserial atau UART, cuplikan-cuplikan yang diambil dari ADC atau bahkan sebuah pewaktuyang seakan-akan meneriakkan “euy… waktunya habis!!”. Semua kejadian ini perlu ditanganioleh mikrokontroler. Selain menggunakan teknik polling, dimana mikrokontroler selalu bertanyapakah perlu dilayani atau tidak, kita bisa membuat agar periferal yang bersangkutanyang akan memanggil mikrokontroler jika sudah tiba saatnya membutuhkan layanan. Hal inidinamakan sebagai “interupsi”, prosesor atau mikrokontrolutama yang sedang dijalankan untuk memeriksa interupsi yang terjadi dan melakukan aksiaksi yang terkait, setelah itu, program utama dijalankan kembali.
Struktur Program Terkendali
Kita sekarang akan menuliskan sebuah program yang terkendaliutama tidak melakukan apapun kecuali menunggu terjadinya interupsi. Untuk AT90S8515akan digunakan dua interupsi eksternal yang diperoleh dari pin PD2 dan PD3, sebagaimanaditunjukkan pada Gambar 51.
Gambar 51. Interupsi eksternal
Hal-hal penting yang perlu dituliskan dalam program:1. Mengatur lokasi lompatan vektor interupsi2. Mengatur set interupsi yang benar untuk mengaktifkan interupsi yang diinginkan
melalui GIMSK;3. Lakukan pengaturan seperlunya pada register kontrol4. Aktifkan interupsi secara global melalui
Mengatur Lokasi Lompatan Vektor Interupsi
Bagian paling bawah dari memori program AVR, dimulai pada alamatdisebut sebagai “Tabel vektor memori programberawal dari ruang ini. Tabel vektor digunakan untuk menyimpan vektorlompatan jika terjadi interupsi. Artinya, masingtertentu dan jika suatu interupsi terjadi, mikrokontroler akandan memeriksa apa yang ada di lokasi tersebut, misalnyakode-kode untuk menangani interupsi tersebut dringkasan tabel vektor interupsi pada AT90S8515.
ggunaan Interupsi Eksternal INT0 dan INT1
h mekaniskme kontrol aliran yang diimplementasikan padatermasuk Atmel’s AVR. Pada aplikasi mikrokontroler yangn dunia luar, banyak hal-hal yang terjadi pada saat yangada kondisi tersinkronisasi, inilah yang harus ditangani oleh
ng ditekan oleh pengguna, data-data yang dibaca pada portuplikan yang diambil dari ADC atau bahkan sebuah pewaktuan “euy… waktunya habis!!”. Semua kejadian ini perlu ditangani
olling, dimana mikrokontroler selalu bertanyadak, kita bisa membuat agar periferal yang bersangkutan
kontroler jika sudah tiba saatnya membutuhkan layanan. Hal inii”, prosesor atau mikrokontroler akan menghentikan programn untuk memeriksa interupsi yang terjadi dan melakukan aksiprogram utama dijalankan kembali.
dali-Interupsi Pada AVR
an sebuah program yang terkendali-interupsi dimana programpun kecuali menunggu terjadinya interupsi. Untuk AT90S8515i eksternal yang diperoleh dari pin PD2 dan PD3, sebagaimana
bar 51. Interupsi eksternal AT90S8515
tuliskan dalam program:atan vektor interupsi � gunakan .org si yang benar untuk mengaktifkan interupsi yang diinginkan
eperlunya pada register kontrol MCUCR;ara global melalui SREG;
n Vektor Interupsi dengan .org
memori program AVR, dimulai pada alamator memori program” dan program yang sesungguhnya harus
k menyimpan vektor-vektor interupsi, yaitu suatu lokasi tujuanpsi. Artinya, masing-masing interupsi memiliki lokasi memoriupsi terjadi, mikrokontroler akan melompat ke lokasi tersebut
a di lokasi tersebut, misalnya untuk menemukan alamat dimanainterupsi tersebut disimpan, perhatikan Gambar 52 tentang
psi pada AT90S8515.
34
dan INT1
lementasikan padaikrokontroler yang
di pada saat yangarus ditangani oleh
g dibaca pada portan sebuah pewaktun ini perlu ditangani
a ke setiap periferalg bersangkutan-lah kan layanan. Hal inighentikan programan melakukan aksi-
psi dimana programUntuk AT90S8515PD3, sebagaimana
yang diinginkan �
at 0x0000, sering esungguhnya harus
suatu lokasi tujuanmiliki lokasi memorit ke lokasi tersebutukan alamat dimanaGambar 52 tentang
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,
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
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.
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:\VMLAB\include\8515def.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...
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!
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: ; ************************************************************
; Micro + software running; ------------------------------------------------------------.MICRO "AT90S8515" .PROGRAM "intr01.asm" .TARGET "intr01.hex"
.TRACE ; Activate micro trace
; Following lines are optional; if; 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; 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
R5 n0 PB0 1K ; Voltage drop seen at PB0R6 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 melakukan60, gunakan K0 dan K1 untuk
Gambar 60. Control Panel untuk Eksperimen
ng--------------------------------------
tivate micro trace
tional; if not included re taken by default--------------------------------------wer nodescro clockace (micro+signals) storage time
0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVFre around the micro--------------------------------------
in real life, with a resistor.
age drop seen at PB0
uk melakukan simulasi, sebagaimana ditunjukkan pada Gambark INT0 dan INT1 serta perhatikan LED D1
ar 60. Control Panel untuk Eksperimen-5
41
--
--
CO, TIM1OVF
--
ukkan pada Gambars/d D8-nya.
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
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.
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 clockmelimpah 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:\VMLAB\include\8515def.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
;----------------------------------------------------------------- ;
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
;----------------------------------------------------------------- ;
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
R5 n0 PB0 1K ; Voltage drop seen at PB0R6 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
Gambar 64. Scope pada VMLAB untuk eksperimen
Catatan: Saran dan masukan untuk ebook ini silahkan kirim email ke
age drop seen at PB0
ol panel dan scope, sebagaimana ditunjukkan pada Gambar
64. Scope pada VMLAB untuk eksperimen-6
ook ini silahkan kirim email ke [email protected]
--- selesai ---
47
n pada Gambar 64.
id, terima kasih!
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 [email protected] pelatihan sehari workshop AVR ini silahkan hubungi: [email protected]
Didukung oleh:
-o-