Pemrograman 1
Pemrograman 1
BAB 1
PENGANTAR
Mikrokontroler dengan arsitektur RISC kini semakin berkembang pesat dan
semakin banyak diminati dalam aplikasi system kendali. Salah satu jenis
mikrokontroler RISC yang sekarang banyak beredar di pasaran adalah mikrokontroler
jenis AVR dari Atmel. Mikrokontroler AVR (Alf and Vegards Risc prosessor)
memiliki konsep yang hampir sama dengan mikrokontroler PICmicro dari microchip
Inc. yang memiliki arsitektur RISC 8-bit.
Mikrokontroler AVR cukup ideal bagi pemula, karena mudah dipelajari, baik
dari segi pemrograman asemblernya, downloadingnya, maupun perancangan
perangkat keras yang dibutuhkan. Software assembler AVR juga mudah dan dapat
didownload langsung dari homepage Atmel di www.atmel.com.
Untuk mempelajari pemrograman mikrokontroler AVR, perangkat
pemrograman (downloader) yang dibutuhkan dapat anda buat sendiri atau dapat anda
beli di took elektronik yang menyediakan papan pengembangan mikrokontroler.
Pemrograman AVR tergolong mudah karena pemrograman AVR dapat dilakukan
menggunakan teknik ISP (In-System Programming) di mana kode HEX dapat
langsung didownload pada mikrokontroler di dalam rangkaian aplikasi (rangkaian
target). Selain dengan mode ISP, pemrograman AVR juga dapat dilakukan secara
paralel menggunakan perangkat programmer/downloader. Papan pengembangan AVR
yang ideal adalah STK200, STK500 Starter Kit, atau STK502 dari Atmel. Namun
demikian, kini telah banyak papan pengembangan yang lebih murah yang
dikembangkan oleh produsen local.
Mikrokontroler AVR memiliki arsitektur RISC 8-bit di mana semua instruksi
dikemas dalam kode 16-bit (16-bits word) dan sebagian besar instruksi dieksekusi
dalam 1 (satu) siklus clock. Bandingkan dengan instruksi ASM51 yang membutuhkan
12 siklus clock. Tentu saja ini terjadi karena kedua jenis mikrokontroler tersebut
memiliki arsitektur yang berbeda, yang satu RISC sedangkan yang lain CISC. Secara
umum, AVR dapat dikelompokan menjadi 4 kelas, yaitu keluarga ATtiny, keluarga
AT90Sxx, keluarga ATmega, dan AT86RFxx. Pada dasarnya yang membedakan
masing-masing kelas adalah memori, peripheral, dan fungsinya. Dari segi arsitektur
dan instruksi yang digunakan, mereka hampir sama.
Mikrokontroler AVR Atmel memiliki 118 macam instruksi asembler utama
yang harus dipelajari, namun demikian terdapat beberapa instruksi yang bila
dieksekusi menghasilkan kode yang sama. Sehingga instruksi assembler yang
sebenarnya hanya 79 macam instruksi. Beberapa tipe AVR memiliki beberapa
tambahan instruksi yang tidak terdapat pada tipe AVR yang lain. Misalnya, instruksi
PUSH dan POP yang tidak dikenal dalam keluarga AVR tipe ATtiny dan instruksi
MUL, MULS, FMUL, atau EIJMP yang dikenal dalam ATmega.
AVR memiliki register keperluan umum (GPR, General Purpose Register)
sebanyak 32 register. Semua operasi aritmatika dan logika dilakukan pada GPR.
Memori data yang tersedia pada AVR ada yang mencapai 64KB dan dapat dialamati
baik secara langsung maupun tidak langsung menggunakan istruksi Load/Store. Pada
pengalaman tidak langsung, bagian lain GPR digunakan sebagai pointer (penunjuk)
pengalamatan tidak langsung. GPR dan register I/O juga dipetekan pada bagian
bawah memori data dan dapat diakses menggunakan instruksi-instruksi Load/Store.
Semua mikrokontroler AVR memiliki jenis memori program Flash yang dapat
deprogram ulang. Hal ini sangat cocok untuk pengembangan system maupun bagi
Citra Lab
1
Pemrograman AVR
para hobbist yang gemar memodifikasi dan membuat proyek-proyek baru. Selain itu,
hampir semua mikrokontroler AVR memiliki memori EEPROM yang terintegrasi
dalam perangkat AVR tersebut.
Meskipun terdapat banyak seri mikrokontroler AVR, namun yang akan
digunakan untuk mempelajari AVR dalam buku ini adalah AT90S2313.
Mikrokontroler ini cukup ideal bagi pemula untuk mempelajari pemrograman AVR.
Tabel 1.1 Beberapa Seri Mikrokontroler AVR RISC-8bit dari Atmel
Program
Memory
(Kb)
RAM
(Byte)
ATtiny11
ATtiny12
ATtiny15L
EPROM
(Byte)
Pin
I/O
8DIP,8SOIC
Int.Osc
64
8DIP,8SOIC
64
8DIP,8SOIC
ATtiny28
20
28DIP,32TQFP
Int.Osc
Comparator,
PWM,ADC, Int Osc
Int.Osc
AT90S1200
128
15
20DIP,20SOIC,20SS0P
AT90S2313
128
128
15
20DIP,20SOIC
AT90S2323
128
128
8DIP,8SOIC
AT90S2343
128
256
8DIP,8SOIC
AT90S4433
128
512
20
28DIP,32TQFP
AT90S8515
512
512
32
40DIP,44PLCC,44TQFP
AT90S8535
512
512
32
40DIP,44PLCC,44TQFP
ATmega8
1K
512
23
28DIP, 32MDIP,32TQFP
ATmega161
16
1K
512
35
40DIP,44TQFP
ATmega163
16
1K
512
32
40DIP,44TQFP
ATmega323
32
4K
4K
32
40DIP,44TQFP
ATmega103
128
4K
4K
48
64TQFP
ATmega128
128
4K
4K
48
64TQFP
Tipe AVR
Kemasan
Catatan
Int.Osc
Comparator, UART,
PWM
Int.Osc
Comparator, UART,
SPI,PWM,ADC
Comparator, UART,
SPI,PWM
Comparator, UART,
SPI,PWM,ADC
Comparator,Int.Osc,
UART, SPI,PWM,ADC
Comparator,Int.Osc,
UART, SPI,PWM
Comparator,Int.Osc,
UART, SPI,PWM,ADC
Comparator, UART,
SPI,PWM,ADC,In.Osc
Comparator, UART,
SPI,PWM,ADC
Comparator, UART,
SPI,PWM,ADC,In.Osc
BAB 2
MIKROKONTROLER AT90S2313
Citra Lab
2
Pemrograman AVR
Dalam bab ini akan dibahas fitur-fitur dan arsitektur mikrokontroler AVR seri
AT90S2313. Seri AT90S2313 dipilih karena mikrokontroler ini dapat mewakili
beberapa seri yang lain, baik dari segi instruksi yang digunakan, maupun
peripheralnya yang relative lengkap. Dengan mempelajari tipe AVR yang lain, yang
pada dasarnya memiliki konsep dan arsitektur yang hampir sama. Bagi Anda yang
ingin mendapatkan informasi lengkap mengenai jenis mikrokontroler ini, Anda juga
dapat membacanya pada datasheet AT90S2313.
2.1 Fitur-fitur AT90S2313
Fitur-fitur utama antara lain sebagai berikut:
1. 118 macam instruksi
2. 32 x 8 bit General Purpose Register,
3. Memori program Flash pada ROM 2 K word (1Kx16),
4. Memori data SRAM 128 byte,
5. Memori EEPROM 128 byte,
6. Jalur I/O 15 pin,
7. Timer/counter 2 buah,
8. Output PWM 1 kanal,
9. Serial I/O menggunakan USART,
10. Komparator analog.
2.2 Hardware
AT90S2313 beredar dalam dua jenis kemasan, yaitu 20 DIP dan 20 SOIC.
Kemasannya yang cukup sederhana memudahkan kita yang hendak mempelajari caracara pemrograman mikrokontroler AVR tanpa harus dipusingkan oleh instalansi kabel
yang melibatkan banyak jalur sebagaimana pada mokrokontroler dengan jumlah pin
di atas 40 buah.
RESET
20
VCC
(RXD) PD0
PB7 (SCK)
(TXD) PD1
PB6 (MISO)
XTAL2
PB5 (MOBI)
XTAL1
(INT0) PD2
AT90S2313
(INT1) PD3
PB4
PB3 (OC1)
PB2
(T0) PD4
PB1 (AIN1)
(T1) PD5
PB0 (AIN0)
GND
PD6 (ICP)
Power supply.
Ground.
Citra Lab
3
Pemrograman AVR
RESET
XTA11
XTAL2
Pemrograman AVR
operasi, dan hasilnya disimpan kembali kedalam salam satu register, semuanya
dilakukan hanya dalam satu siklus clock. Arsitektur AVR AT90S2313 ditunjukkan
dalam gambar berikut.
Program
Counter
GPR
Direct Addressing
1KX16 Program
Memory FLASH
Instruction
Register
Instruction
Recorder
Indirect Addressing
Control Register
Interrupt unit
SPI unit
ALU
Serial UART
8bit Timer/
Counter
Control Line
128x8
SRAM
16bit
TimerCounter
with PWM
WDT
128x8
EEPRO
Analog
Comparator
16 I/O Line
MEMORI
PROGRAM
2.3.1
Organisasi
Memori
$0000
MEMORI DATA
32 Register GPR
64 Register I/O
1 K x 16
Flash
$00
$1F
$20
$5F
$60
128x8 SRAM
Citra Lab
5
$03FF
$DF
Pemrograman AVR
R0
$00
R1
Citra Lab
R15
$0F
R16
$1F
R26
R27
R28
R29
R30
R31
Pemrograman AVR
Bit 7
PORTB7
PORTB6
PORTB5
PORTB4
PORTB3
PORTB2
PORTB1
PORTB0
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
POR
TB
Data Direction Register port B (DDRB), berlokasi pada $17($37). Register ini bisa
ditulis/baca.
$17 ($37)
Read
white
Bit 7
DDB7
DDB6
DDB5
DDB4
DDB3
DDB2
DDB1
DDB0
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
DDB
Port B Input Pin (PINB), berlokasi pada $16($36). PINB bukanlah suatu
register, namun pin-pin fisik pada hardware mikrokontroler. PINB ini hanya bisa
dibaca. Ketika PORTB dibaca, maka data Latch dari PortB akan dibaca, sedangkan
Citra Lab
7
Pemrograman AVR
bila PINB dibaca, maka logika yang sedang terjadi pada pin-pin Port B yang akan
dibaca.
$16 ($36)
Read
white
Bit 7
PINB7
PINB6
PINB5
PINB4
PINB3
PINB2
PINB1
PINB0
PINB
Beberapa pin pada Port B memiliki fungsi alternative, yang bisa digunakan
sesuai dengan kebutuhan. Pin-pin tersebut adalah PB0, PBI, PB3, PB5, PB6, dan PB7.
Tabel 2.1 Fungsi Alterlatif Port B
Fungsi Alternatif
AIN0 (Input positif untuk komparator analog)
AIN1 (Input negatif untuk komparator analog)
OC1 (Output Timer/Counter1)
MOSI (Jalur input data untuk download memori)
MISO (Jalur output data untuk download memori)
SKC (Input clock serial)
Pin Port B
PB0
PB1
PB3
PB5
PB6
PB7
Pin-pin pada port B merupakan pin umum yang dapat anda konfigurasi
sebagai pin input atau output secara individual. Untuk konfigurasi suatu pin pada port
B, Anda harus mengatur bit-bit dalam register ini sesuai dengan pin-pin pada Port B.
Bila anda menginginkan suatu pin sebagai input, maka bit yang sesuai dengan register
DDRB harus anda beri logika 0, sedangkan bila anda ingin konfigurasi sebagai
output, maka bit tersebut harus anda set 1. Apabila PORTBn dalam register PORTB
Anda set 1, sementara pin yang bersangkutan anda konfigurasi sebagai input
(DDRB=0), maka resistor pull-up akan secara otomatis ON. Untuk mematikan pullup, bit PORTBn harus anda clear (0), atau pin yang bersangkutan harus anda
konfigurasi sebagai output.
2.4.2 PORT D
Sebagaiman Port B, Port D juga memiliki tiga buah lokasi memori yang
berkaitan dengan penggunaannya sebagai port I/O. Memori tersebut adalah PORTD,
DDRD, dan PIN.
PORTB6
PORTB5
PORTB4
PORTB3
PORTB2
PORTB1
0
PORTB
0
R/W
R/W
R/W
R/W
R/W
R/W
R/W
PORT
B
Bit 7
$11 ($31)
Read
white
DDD6
DDD5
DDD4
DDD3
DDD2
DDD1
DDD0
R/W
R/W
R/W
R/W
R/W
R/W
R/W
DDRB
PIND (Port D Input Pins), berlokasi pada $10($30). Pind bukanlah register, dan
berada dengan dua memori yang lain, PIND hanya bisa dibaca.
Citra Lab
8
Pemrograman AVR
Bit 7
$10 ($30)
Read
white
PIND6
PIND5
PIND4
PIND3
PIND2
PIND1
PIND0
PIND
Format Port D mirip dengan Port B dalam hal cara konfigurasi I/O dan
pennggunaan registor Pull-up. Hal yang sedikit membedakan dengan Port B adalah
pada Port D, jumlah bit/pin yang bisa digunakan hanya 7 buah. Hal ini sesuai dengan
jumlah pin yang ada pada port D. Pin-pin pada Port D diberi nama PD6 . .PD0. Selain
itu, semua pin pada Port D juga memilikji fungsi khusus.
Pin Port D
PD0
PD1
PD2
PD3
PD4
PD5
PD6
2.5 SRAM
Mikrokontroler AT90S2313 memiliki memori yang berupa SRAM (Static
RAM) yang berkapasitas 128 byte. Lokasi memori SRAM dalam peta memori AVR
File Register
Data Address Space
AT90S2313 ditunjukkan oleh gambar berikut.
R0
$00
R1
$01
$02
R29
$1D
R30
$1D
R30
$1F
I/O Register
$00
$20
$01
$21
$02
$22
$3D
$5D
$3D
$5D
$3F
$5F
Internal SRAM
$60
$61
$62
Citra Lab
9
$DD
$DE
$DF
Pemrograman AVR
Address
$3F($5F)
$3D($5D)
$3B($5B)
$3A($5A)
$39($59)
$38($58)
$35($55)
$33($53)
$32($52)
$2F($4F)
Name
SREG
SPL
GIMSK
GIFR
TIMSK
TIFR
MCUCR
TCCR0
TCNT0
TCCR1A
Citra Lab
10
Pemrograman AVR
$2E($4E)
$2D($4D)
$2C($4C)
$2B($4B)
$2A($4A)
$25($45)
$24($44)
$21($41)
$1E($3E)
$1D($3D)
$1C($3C)
$18($38)
$17($37)
$16($36)
$12($32)
$11($31)
$10($30)
$0C($2C)
$0B($2B)
$0A($2A)
$09($29)
$08($28)
TCCR1B
TCNT1H
TCNT1L
OCR1AH
OCR1AL
ICR1H
ICR1L
WDTCR
EEAR
EEDR
EECR
PORTB
DDRB
PINB
PORTD
DDRD
PIND
UDR
USR
UCR
UBRR
ACRR
Semua peripheral termasuk I/O dari AT90S2313 ditempatkan pada ruang ini.
Lokasi I/O dapat diakses menggunakan instruksi IN dan OUT untuk melakukan
transfer data dari dan keregister I/O. Register I/O dapat diakses secara per bit
menggunakan instruksi SBI dan CBI melalui alamat register pada range $00 hingga
$1F. Bit-bit dalam register ini dapat dicek menggunakan instruksi IN dan OUT, maka
alamat I/O yang digunakan haruslah dalam rentang $00 - $3F. Sedangkan bila
pengaksesan dilakukan menggunakan SRAM, nilai $20 harus anda tambahkan pada
alamat ini.
SREG
Meskipun semua register I/O penting, namun I/O yang palilng banyak
digunakan harus Anda ketahui adalah register STATUS (SREG) yang beralamat pada
$3F($5F). register ini berisi status yang dihasilkan setiap operasi yang dilakukan
ketika suatu instruksi dieksekusi.
$3F
($5F)
Read
white
Bit 7
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Citra Lab
11
SREG
Pemrograman AVR
Bit ini harus diset untuk mengenable interupsi. Setelah itu, Anda dapat mengaktifkan
interupsi mana yang akan Anda gunakan dengan cara mengenabel bit control register
yang bersangkutan secara individual. Bit ini akan di-clear apalagi terjadi suatu
interupsi yang dipicu oleh hardware dan tidak akan mengijinkan terjadinya interupsi
serta akan diset kembali oleh interupsi RETI.
Bit T: Bit Copy Storage
Instruksi BLD dan BST menggunakan bit-T sebagai sumber atau tujuan dalam
operasi bit yang dilakukan. Suatu bit dalam sebuah register GPR dapat disalin ke bit-T
ini menggunakan intruksi BST dan sebaliknya bit-T dapat disalin kembali ke suatu bit
dalam register GPR dengan menggunakan instruksi BLD.
Bit S merupakan hasil operasi EXOR antara flag-N (negative) dan flag V
(komplemen dua overflow).
Bit3 V: Twos Complement Overflow Flag
Bit ini berguna untuk mendukung operasi aritmatika.
Bila suatu operasi menghasilkan bilangan negative, maka flag-N akan diset.
Bit ini akan diset bila hasil operasi yang diperoleh adalah nol.
Bila suatu operasi menghasilkan carry, maka bit ini akan diset.
2.7 Interupsi
Terdapat 10 jenis interupsi yang dapat ditangani oleh AT90S2313. Interupsi
tersebut akan mengarahkan aliran program menuju vector interupsi yang berbeda pada
alamat $01 hingga $0A. Alamat $00 tidak digunakan untuk vector reset, yaitu alamat
yang akan dituju apabila terjadi salah satu kondisi dari tiga kondisi reset. Agar suatu
interupsi dapat difungsikan, maka bit pengenabel interupsi yang bersangkutan harus
dienabel bersama dengan bit-I dalam register SREG yang merupakan bit pengenabel
interupsi secara global.
Pembahasan lebih lanjut mengenai interupsi akan diterangkan dalam Bab 5.
Pemrograman AVR
CS02
CS01
CS00
R/W
R/W
R/W
PIND
Nilai pengaturan bit-bit dalam register TCCR0 ditentukan menurut tabel 2.4.
Tabel 2.4 Pengaturan bit-bit Pada TCCR0
CS02 CS01 CS00 Deskription
0
0
0
Stop, the Timer/Counter0 is stoped
0
0
1
CK
0
1
0
CK/8
0
1
1
CK/64
1
0
0
CK/256
1
0
1
CK/1024
1
1
0
External Pin T0, falling edge
1
1
1
External Pin T0, rising edge
TCN1H dan TCNT1L (merupakan 2 register Timer/Counter1 16-bit)
Register-register yang berhubungan dengan pengaturan Timer/Counter adalah
TCCR1B, TIFR, dan TIMSK. Timer/counter1 juga mendukung fungsi Output
Compare menggunakan register OCR1A sebagai sumber data yang dibandingkan
dengan isi Timer/Counter1. Selain itu, Timer Counter1 juga dapat digunakan sebagai
modul PWM 8-bit, 9-bit, atau 10-bit. Penggunaan Timer/Counter1 sebagai modul
PWM akan melibatkan register OCR1.
Citra Lab
13
Pemrograman AVR
WDTOE
WDE
WDP2
WDP1
WDP0
R/W
R/W
R/W
R/W
R/W
WDTCR
WDTCR (Watch Dog Timer Control Register) merupakan register pengendali WDT,
termasuk untuk mengatur nilai prescalernya. Nilai prescaler WDT diatur sesuai
dengan Tabel 2.5.
Tabel 2.5 Pengaturan Prescaler WDT
Number of WDT
Typical Time-out at
WDP2 WDP1 WDP0
Oscillator Cycles
Vcc=3.0v Vcc=5.0v
0
0
0
16K cycles
47 ms
15 ms
0
0
1
32K cycles
94 ms
30 ms
0
1
0
64K cycles
0.19 s
60 ms
0
1
1
128K cycles
0.38 s
0.12 s
1
0
0
256K cycles
0.75 s
0.24 s
1
0
1
512K cycles
1.5 s
0.49 s
1
1
0
1,024K cycles
3.0 s
0.97 s
1
1
1
2,048K cycles
6.0 s
1.9 s
2.8.3 EEPROM
AT90S2313 memiliki kapasitas EEPROM 128 byte. Untuk melakukan akses
terhadap EEPROM, terhadap tiga register penting yang berhubungan dengan
EEPROM. Register tersebut adalah EEAR (EEPROM Address Register), EEDR
(EEPROM Data Register), dan EECR (EEPROM Cntrol Register).
Berikut ini adalah format dan cara pengaturan bit-bit dalam register tersebut.
EEAR (EEPROM Address Register)
Bit 7
$1E
($3E)
EEAR6
EEAR5
EEAR4
EEAR3
EEAR2
EEAR1
EEAR0
Citra Lab
14
EEAR
Pemrograman AVR
Read
white
R/W
R/W
R/W
R/W
R/W
R/W
R/W
LSB
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
EEMWE
EEWE
EERE
R/W
R/W
R/W
EEDR
$1C
($3C)
Read
white
DDRB
PB0(AND)
ACIE
PB1(AIN1)
Analog
Comparator
IRQ
Interrupt select
ACIS1
ACIS0
ACIC
ACO
Citra Lab
15
ACI
To T/C1 Capture
Trigger MUX
Pemrograman AVR
Bit 7
$08 ($28)
Read
white
ACD
R/W
ACO
ACI
ACIE
ACIC
ACIS1
ACIS0
R/W
R/W
R/W
R/W
R/W
R/W
ACSR
Bit ini merupakan bit untuk menentukan apakah Analog Comparator On atau Off.
Apabila bit ACD diset, maka komparator akan Off. Dengan membuat komparator
tidak On (bila memasang tidak digunakan), maka konsumsi daya akan dapat ditekan
baik pada mode aktif ataupun idle. Ketika terjadi perubahan pada bit ACD, bit ACIE
harus di-clear. Hal ini akan mencegah terjadinya interupsi apabila terjadi perubahan
pada bit ACD.
Bit ini akan diset bbila terjadi trigger interupsi yang disebabkan oleh pengaturan
ACIS1 dan ACIS0. Rutin ACI dieksekusi bila ACIE diset dan bit-I dalam SREG juga
diset. ACI akan di-clear oleh hardware ketika mengeksekusi penanganan interupsi.
Selain itu bit ini juga akan di-clear bila terjadi penulisan logika 1 pada flag.
Perhatikan bahwa bila bit lain dalam register ini dimodifikasi menggunakan intruksi
SBI atau CBI, ACI akan di-clear sebelum operasi bit ini berlogika 1.
Bila bit ini diset sementara bit 1 dalam SREG juga diset maka interupsi komparator
akan aktif. Bila bit ini di-clear, interupsi comparator komparator menjadi tidak aktif.
2.8.5 UART
Citra Lab
16
Pemrograman AVR
Pemrograman AVR
memperdulikan pengaturan pada bit DDD1 pada register DDRD. Bila TXEN di-clear,
maka pin PD1 akan digunakan sebagai pin I/O.
Penerima Data
Pada mode pengiriman data menggunakan UART, Receiver UART akan
melakukan pencuplikan sebanyak 16 kali dari boud rate yang digunakan.
DATA BUS
UART I/O Data
Register
XTAL
/16
Store UDR
10(11)-Bit rx
Shift Register
RX
C
TX
CUDR
FE
E
Data Recovery
Logic
RXCI
E
TXCI
E
UDRI
E
UART Control
Register
OR
Pin Control
Logic
RXD
RXE
N
CHR
9
TXB
8
RXB
8
PD0
DATA BUS
RXC IRQ
Pemrograman AVR
Berikut ini adalah format register control USR dan register statusUCR yang
digunakan dalam pengoperasian fungsi UART.
USR (UART Status Register)
$OB
($2B)
Read
white
Bit 7
RXC
TXC
UDRE
FE
OR
R/W
0
USR
Bit ini akan diset bila suatu karakter yang diterima dikirimkan dari shift register
Receiver ke UDR. Pengesetan ini tidak akanmemperhatikan terdeteksinya error frame
pada penerimaan. Bila bit RXCIE dalam register UCR diset, maka interupsi penerima
komplit akan dieksekusi saat RXC berlogika 1. RXC akan di-cear saat pembacaan
UDR.
Bit ini akan diset bila karakter dalam register geser Transmiter telah dikeluarkan
semuanya ke pin PD1 dan tidak ada data baru yang dituliskan pada UDR. Bendera ini
khususnya digunakan untuk antar muka komunikasi half-duplex, di mana penerimaan
dan pengiriman dilakukan secara bergantian. Bila bit TXCIE dalam UCR diset, maka
pengesetan pada bit TXC akan menyebabkan interupsi akibat sesuainya UART
Transmit akan dieksekusi. TXC di-clear melalui hardware ketika mengeksekusi
penanganan vector interupsi yang bersangkutan.
Bit status yang menunjukkan kondisi register UDR. Bit ini akan diset ketika sebuah
karakter yang ditulis pada UDR dikirimkan ke register Transmit. Pengesetan pada bit
ini mengindikasikan bahwa pengirim siap menerima karakter baru untuk dikirimkan.
Bit ini akan diset jika kondisi error frame terdeteksi, misalkan ketika bit stop karakter
yang diterima berlogika 0. Bit ini akan di-clear bila bit stop karakter yang diterima
adalah 1.
Bila suatu kondisi overrun terdeteksi, maka bit ini akan diset. Misalnya, ketika suatu
karakter telah ada dalam UDR sebelum karakter berikutnya digeser dalam register
Receiver. Bit OR akan di-clear bila suatu data diterima atau dikirim ke UDR.
Pemrograman AVR
$0A
($2A)
Read
white
Bit 7
RXCIE
TXCIE
IDRIE
RXEN
TXEN
CHR9
RXB8
TXB8
R/W
R/W
R/W
R/W
R/W
R/W
UCR
Bila bit ini global interrupt diset, maka terjadinya pengesetan pada bit RXC dalam
USR akan mengakibatkan rutin interupsi complete receiver dieksekusi.
Seperti halnya RXCIE, pengesetan bit ini akan mengijinkan terjadinya interupsi
complete transmit akibat pengesetan bit TXC, bila bit global interrupt dienable.
Bit ini digunakan untuk mengenabel UART Receiver. Ketika UART Receiver
didisabel, maka bendera status RCX, OR, dan FE tidak dapat diset. Bila benderabendera tersebut diset, maka perubahan logika RXEN ke 0 tidak akan membuat
bendera-bendera tersebut dii-clear.
Ketika bit ini diset, berarti karakter yang dikirim atau diterima memiliki panjang 9-bit
ditambah start dan stop bit.
Ketika bit CHR9 diset, bit ini akan menjadi bit9 karakter yang diterima.
Bila bit CHR9 diset, bit ini akan menjadi bit ke9 dari data yang dikirimkan.
Pengaturan baud rate untuk UART ditentukan oleh isi register UBRR.
Tabel 2.6 Pengaturan UBRR Untuk Menentukan Baud Rate UART
XTAL= 1 MHz XTAL= 4 MHz XTAL= 8 MHZ
Baud
Rate
UBRR % Err UBRR % Err UBRR % Err
2400
25
0.2
103
0.2
207
0.2
4800
12
0.2
31
0.2
103
0.2
9600
6
7.5
25
0.2
51
0.2
14400
3
7.8
16
2.1
34
0.8
19200
2
7.8
12
0.2
25
0.2
28800
1
7.8
8
3.7
16
2.1
38400
1
22.9
6
7.5
12
0.2
57600
0
7.8
3
7.8
8
3.7
Citra Lab
20
Pemrograman AVR
76800
115200
0
0
22.9
84.3
2
1
7.8
7.8
6
3
7.5
7.8
BAB 3
TOOL TOOL
PEMROGRAMAN AVR
Untuk membuat suatu aplikasi AVR, perlu beberapa tool yang harus Anda
siapkan. Tool-tool tersebut diperlukan untuk menjalankan tahap-tahap pemrograman
AVR. Pada dasarnya, terdapat tiga tahap utama yang perlu dikerjakan dalam
pemrograman AVR, yaitu:
1. Penulisan dan Editing: proses ini dilakukan menggunakan software Editor teks.
2.
Asembling dan Debuging: merupakan proses penerjemahan dari bahasa assembler
yang dituliskan pada Editor Teks menjadi bahasa mesin yang dipahami oleh
mikrokontroler. Mikrokontroler hanya memahami bahasa mesin dalam format
Citra Lab
21
Pemrograman AVR
3.
Di samping tiga tahap utama tersebut, terdapat satu proses tambahan yang bisa
dilakukan tapi boleh juga tidak dilakukan, yaitu proses simulasi menggunakan
software simulator. Dengan Simulator, Anda dapat melihat setiap perubahan yang
terjadi pada isi memori , register dan berbagai kondisi lain dalam mikrokontroler
untuk setiap langkah yang dilakukan.
def
def
def
def
temp1=r16
temp2=r17
delay1=r18
delay2=r19
Citra Lab
22
Pemrograman AVR
. def temp=r20
. cseg
. org 0
1di
out
mulai:
1di
1di
count:
out
inc
;
rcall
cpse
rjmp
out
;
rcall
rjmp
tunda:
1di
waitsome:
1di
waitmore:
dec
brne
dec
brne
ret
temp,0b11111111
DDRB,temp
temp1,startnum
temp2,endnum
portb,temp1
temp1
tunda
;skip saja
temp1,temp2
count
portb,temp1
tunda
mulai
delay2,0xff
delay1,0xff
delay1
waitmore
delay2
waitsome
. exit
. equ startnum=0
. equ endnum=10
Citra Lab
23
Pemrograman AVR
. def temp1=r16
. def temp2=r17
. def delay1=r18
. def delay2=r19
. def temp=r20
.cseg
.org 0
000000 ef4f
000001 bb47
mulai :
000002 e000
000003 e01a
count :
000004 bb08
000005 9503
;
rcall
000006 1301
000007 cffc
000008 bb08
;
rcall
000009 cff8
1di
out
temp, 0b111111111
DDRB, temp
1di
1di
temp1, startnum
temp2, endnum
out
inc
tunda
cpse
rjmp
out
tunda
rjmp
portb, temp1
temp1
; skip saja
temp1, temp2
count
portb, temp2
tunda :
00000a ef3f
1di
waitsome :
00000b ef2f
1di
waitmore :
00000c 952a
dec
00000d f7f1
brne
00000e 953a
dec
00000f f7d9
brne
000010 9508
ret
. exit
Assembly complete with no errors.
mulai
delay2, 0xff
delay1, oxff
delay1
waitmore
delay2
waitsome
3.2 Programmer/Downloader
Mikrokontroler AVR memiliki dua mode pemrograman, yaitu Pemrogramam
Paralel (Parallel Programming Mode) dan Pemrograman Serial (In- System
Programming Mode atau ISP).
Pad pmrograman parallel, AVR harus ditempatkan pada siket programmer
dan tegangan pemrograman +12V diperlukan pada pin RESET-nya. Komunikasi
antara programmer dengan AVR dilakukan dengan perintah pemrograman parallel,
sehingga waktu pemrograman yang dibutuhkan relative lebih singkat dibanding
dengan mode pemrograman ISP. Pemrograman ini biasa dilakukan untuk
memprogram awal beberapa perangkat AVR atau bila sirkuit aplikasi tidak
mendukung dilakukannya pemrograman dengan mode ISP.
Sedangkan pada pemrograman ISP, jalur yang dibutuhkan untuk
pemrograman hanya 3 jalur untuk sinyal pemrograman dan tifak dibutuhkan tegangan
pemrograman +12V. Dengan demikian, mode pemrograman ini sangat cocok untuk
melakukan pemrograman didalam system aplikasi. Namun demikian, mode
pemrograman ini tidak dapat digunakan untuk mengubah bit-bit fuse pada beberapa
Citra Lab
24
Pemrograman AVR
tipe AVR. Terdapat beberapa tipe AVR yang tidak mendukung untuk dilakukannya
pemrograman dalam mode ini, sehingga untuk tipe tersebut harus diprogram
menggunakan pemrograman parallel.
Selain itu, terdapat mode pemrograman serial menggunakan tegangan
pemrograman +12V yang dinamakan High-Voltage Serial Programming.
Pemrograman ini serupa dengan mode parallel, dan hanya terdapat pada jenis AVR 8
pin.
Pada bab 8, Anda akan dikenal pada sebuah programmer yang mudah
digunakan dan cocok untuk berbagai jenis mikrokontroler maupun EEPROM. Dalam
bab tersebut akan dibahas mengenai bagaiman melakukan download file HEX ke
memori program dan EEPROM mikrokontroler.
BAB4
INSTRUKSI-INSTRUKSI
PEMROGRAMAN ASEMBLER
AVR
AVR AT90S2313 memiliki 118 macam instruksi assembler, yang terdiri dari instruksi
aritmatika dan logika, instruksi percabangan, instruksi transfer data, dan instruksi bit
dan tes bit. Daftar instruksi-instruksi tersebut dapat anda lihat pada tabel berikut ini.
Tabel 4.1 Daftar Instruksi At90S2313
Mnem
Operan
ADD
Rd, Rr
ADC
ADIW
Rd, Rr
Rd, K
Deskripsi
Operasi
Instruksi Aritmatika dan Logika
Add Two Registers
Rd<--Rd+Rr
Add with Carry two
Register
Rd<--Rd+Rr+C
Add Immediate to Word
Rd+1:Rd<--Rd+1:Rd+K
Citra Lab
25
Siklus
1
1
2
Pemrograman AVR
SUB
Rd, Rr
SUBI
Rd, K
SBIW
Rd, K
SBC
Rd, Rr
SBCI
AND
Rd, K
Rd, Rr
ANDI
OR
Rd, K
Rd, Rr
ORI
EOR
COM
NEG
SBR
Mnem
Rd, K
Rd, Rr
Rd
Rd
Rd, K
Operan
CBR
INC
DEC
TST
CLR
SER
Rd, K
Rd
Rd
Rd
Rd
Rd
RJMP
IJMP
JMP
RCALL
ICALL
CALL
RET
RETI
CPSE
CP
CPC
CPI
Rd, K
SBRC
Rr, b
SBRS
Rr, b
SBIC
P, b
SBIS
P, b
BRBS
S, k
BRBC
BREQ
S, k
K
K
K
K
Rd, Rr
Rd, Rr
Rd, Rr
Citra Lab
26
1
1
2
1
1
1
1
1
1
1
1
1
1
Siklus
1
1
1
1
1
1
2
2
3
3
4
4
2,1
1
1
1
2,1
2,1
2,1
2,1
2,1
2,1
2,1
Pemrograman AVR
BRNE
BRCS
BRCC
K
K
K
BRSH
BRLO
BRMI
BRPL
Mnem
K
K
K
K
Operan
BRGE
BRLT
BRHS
BRHC
BRTS
BRTC
K
K
K
BRVS
BRVC
BRIE
BRID
MOV
LDI
LD
Rd, Rr
Rd, K
Rd, X
LD
Rd, X+
LD
LD
Rd,-X
Rd, Y
LD
Rd, Y+
LD
LDD
LD
Rd,-Y
Rd,
Y+q
Rd, Z
LD
Rd, Z+
LD
LDD
LDS
ST
Rd,-Z
Rd,
Z+q
Rd, k
X, Rr
ST
X+, Rr
ST
X, Rr
Citra Lab
27
2,1
2,1
2,1
2,1
2,1
2,1
2,1
Siklus
2,1
2,1
2,1
2,1
2,1
2,1
2,1
2,1
2,1
2,1
1
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
Pemrograman AVR
ST
Y, Rr
ST
Y+, Rr
ST
Y, Rr
STD
Mnem
Y+q, Rr
Operan
ST
Z, Rr
ST
Z+, Rr
ST
Z, Rr
STD
STS
LPM
IN
OUT
PUSH
Z+q, Rr
K, Rr
POP
Rd
SBI
CBI
P, b
P, b
LSL
Rd
LSR
Rd
ROL
Rd
ROR
ASR
SWAP
BSET
BCLR
Rd
Rd
Rd
S
S
BST
Rr, b
BLD
SEC
CLC
SEN
CLN
SEZ
CLZ
SEI
CLI
SES
Mnem
Rd, b
CLS
Rd, P
P, Rr
Rr
Operan
Store Indirect
(Y)<--Rr
Store Indirect and PostInc
(Y)<--Rr, Y<--Y+1
Store Indirect and PreDec
Y<--Y-1, (Y)<--Rr
Store Indirect with
Displacement
(Y+q)<--Rr
Deskripsi
Operasi
Instruksi Aritmatika dan Logika
Store Indirect
(Z)<--Rr
Store Indirect and PostInc
(Z)<--Rr, Z<--Z+1
Store Indirect and PreDec
Z<--Z-1, (Z)<--Rr
Store Indirect with
Displacement
(Z+q)<--Rr
Store Direct to SRAM
(k)<--Rr
Load Program Memory
R0<--(Z)
In Port
Rd<--P
Out Port
P<--Rr
Push Register on Stack
STACK<--Rr
Push Register from
Stack
Rd<--Rd
Instruksi Bit dan Tes Bit
Set Bit in I/O Register
I/O(P,b)<--1
Clear Bit in I/O Register
I/O(P,b)<--0
Rd(n+1)<-Rd(n),Rd(0)<Logical Shift Left
0,C<-Rd(7)
Rd(n)<-Rd(n+1),Rd(7)<Logical Shift Right
0,C<-Rd(0)
Rotate Left through
Rd(0)<-C,Rd(n+)<Carry
Rd(n),C<-Rd(7)
Rotate Right through
Rd(7)<-C,Rd(n)<Carry
Rd(n+1),C<-Rd(0)
Arithmatic Shift Right
Rd(n)<-Rd(n+1),n=0..6
Swap Nibble
Rd(3..0)<->Rd(7..4)
Flag Set
SREG(s)<--1
Flag Clear
SREG(s)<--0
Bit Store from register to
T
T<--Rr(b)
Bit Load from T to
Register
Rb(b)<--T
Set Carry
C<--1
Clear carry
C<--0
Set Negative Flag
N<--1
Clear Negative Flag
N<--0
Set Zero Flag
Z<--1
Clear Zero Flag
Z<--0
Global Interrupt Enable
I<--1
Global Interrupt Disable
I<--0
Set Signed Test Flag
S<--1
Deskripsi
Operasi
Instruksi Aritmatika dan Logika
Clear Signed Test Flag
S<--0
Citra Lab
28
2
2
2
2
Siklus
2
2
2
2
2
3
1
1
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
Siklus
1
Pemrograman AVR
SEV
CLV
SET
CLT
SHE
CLH
NOP
SLEEP
WRD
V<--1
V<--0
T<--1
T<--0
H<--1
H<--)
1
1
1
1
BAB5
DASAR-DASAR PEMROGRAMAN
AVR
Dalam bab ini, kita akan membahas bagaiman menuliskan program assembler
untuk tahap pemrograman AVR berikutnya. Program assembler berisi mnemonic
instruksi, label, dan pengarah assembler (directive). Mnemonic instruksi dan pengarah
seringa kali memebutuhkan operan dalam penulisannya. Baris kode dalam penulisan
program assembler dibatasi hingga 120 karakter.
Pemrograman AVR
kemudahan dalam penulisan program, namun terkadang kode yang dihasilkan akan
memakan memori program yang besar.
Program assembler berisi mnemonic instruksi, label, dan pengarah assembler
(directive). Mnemonic instruksi, label, dan pengarah assembler (directive). Mnemonic
instruksi dan pengarah sering kali membutuhkan operan dalam penulisannya. Baris
kode dalam penulisan program assembler dibatasi hingga 120 karakter.
5.2 Label
Pada penulisan program, Anda akan banyak menggunakan label untuk
menandai suatu rutin program. Pemberian label akan sangat berguna untuk
menentukan tujuan instruksi lompatan (jump) dan percabangan (branch) serta sebagai
nama variable dalam memori program dan RAM. Namun demikian, penggunaan label
merupakan kenutuhan software assembler/compiler untuk mengenali suatu rutin
program yang Anda buat. Anda dapat menambahkan komentar anda sendiri untuk
memberi keterangan pada rutin atau instruksi yang Anda tulis sebagai suatu komentar.
Komentar tidak akan mempengaruhi proses asembli dan akan diabaikan oleh software
assembler/compiler. Untuk menuliskan komentar, Anda dapat memisahkannya dengan
kode program menggunakan tanda titik koma (;) pada awal komentar anda.
Secara umum setiap baris dalam program assembler AVR memiliki bentuk sebagai
berikut:
1. [label:] directive [operan] [komentar]
2. [label:] instruksi [operan] [komentar]
3. [komentar]
4. Baris kosong
Cara penulisan komentar adalah sebagai berikut:
[; teks komentar]
Citra Lab
30
Pemrograman AVR
DW
ENDMACRO
EQU
ESEG
EXIT
INCLUDE
LIST
LISTMAC
MACRO
NOLIST
ORG
SET
.BYTE ekspresi
Contoh:
. DSEG
varl: .BYTE 1
table:
.BYTE tab_size
.CSEG
1di
1di
r30,
r31,
low (var1)
high (var1)
2. CSEG
Pengarah CSEG digunakan untuk mendefinisikan awal suatu Code Segment. Sebuah
file assembler dapat terdiri dari beberapa Code Segment, yang semuanya terhubung
dengan satu Code Segment. Pengarah BYTE tidak dapat digunakan di dalam sebuah
Code Segment. Code Segment memiliki pencacah lokasinya sendiri, yaitu berupa
pencacah kata. Pengarah ORG dapat digunakan untuk menempatkan kode dan
konstanta pada suatu lokasi tertentu di dalam Memori Program. Dalam penulisannya,
pengarah CSEG tidak memerlukan suatu operan apapun.
Sintak:
.CSEG
Contoh:
Citra Lab
31
Pemrograman AVR
. DSEG
vartab:
. CSEG
const:
3. DB
Pengarah DB digunakan untuk menjaga sumber daya memori yang ada di dalam
Memori Program atau memori EEPROM. Pengarah DB mengambil beberapa ekspresi
sekaligus sebagai suatu daftar ekspresi. Dalam penulisannya, daftar ekspresi
dituliskan sebagai runtun ekspresi yang masing-masing dipisahkan dengan tanda
koma. Masing-masing ekspresi dapat berupa bilangan antara 128 hingga 255. Untuk
bilangan negative, bilangan komplemen dua 8 bit akan ditempatkan pada Memori
Program atau Memori EEPROM.Pengarah DB harus ditempatkan pada Code Segment
atau EEPROM Segment dan minimal harus mengandung sebuah ekspresi. Bila
pengarah DB berada pada Code Segment dan daftar ekspresi berisi lebih dari satu
ekspresi, maka ekspresi-ekspresi tersebut akan dikemas dalam dua byte kata pada
Memori Program.
Sintaks:
Label :
.DB
daftar_ekspresi
Contoh:
.CSEG
.ESEG
4. DEF
Pengarah DEF mengijinkan suatu register sehingga dapat ditunjuk menggunakan
suatu symbol, suatu symbol yang didefinisikan disela-sela Memori Program dapat
digunakan untuk menunjuk suatu register. Sebuah symbol dapat kembali didefinisikan
pada bagian lain dalam program.
Sintaks:
.DEF Symbol=Register
Contoh:
.DEF temp=R16
.DEF ior=R0
.CSEG
1di
temp, 0xf0
in
ior, 0x3f
eor
temp, ior
5. DEVICE
Citra Lab
32
Pemrograman AVR
AT90S1200
AT902313
AT90S8515
Contoh:
.DEVICE
AT90S2313
; Menggunakan AT90S2313
6. DSEG
Pengarah DSEG digunakan untuk mengawali suatu Data Segment. Sebuah file
assembler dapat berisi beberapa Data Segment, yang akan dinyatakan dalam sebuah
Data Segment pada saat diasembli. Sebuah Data Segment lazimnya hanya berisi
pengarah BYTE dan label saja.
Sintaks:
.DSEG
Contoh:
.DSEG
.CSEG
var1: .BYTE
table:
.BYTE tab_size
1di
1di
1d
r30, low(var1)
r30, high(var1)
r1, z
7. DW
Pengarah ini digunakan untuk mendefinisikan konstanta dalam Memori Program atau
memori EEPROM. Pengarah DB akan membawa sebuah daftar ekspresi dan minimal
harus mengandung sebuah ekspresi. Pengarah ini harus ditempatkan di dalam Code
Segment atau EEPROM Segment. Daftar ekspresi merupakan runtun ekspresi, yang
masing-masing dipisahkan dengan tanda koma dan merupakan bilangan antara
23768 hingga 65535. Apabila ekspresi menyatakan bilangan negative, maka bilangan
komplemen dua 16-bit akan ditempatkan pada Memori Program.
Sintaks:
LABEL:
.DW daftar_ekspresi
Contoh:
.CSEG
Citra Lab
33
Pemrograman AVR
.ESEG
eevar:
.DW0xfafa
8. ENDMACRO
Penagarah ini digunakan untuk mendefinisikan akhir sebuah macro. Pengarah ini
tidak membutuhkan parameter.
Sintaks:
.ENDMACRO
Contoh:
.MACRO SUBI16
subi
sbci
r16, low(@0)
r17, high (@0)
.ENDMACRO
9. EQU
Pengarah EQU digunakan untuk memberikan nilai terhadap suatu label. Label
tersebut kemudian dapat digunakan pada papan ekspresi selanjutnya. Sebuah label
yang telah diberi nilai menggunakan pengarah EQU merupakan sebuah konstanta dan
tidak dapat diubah nilainya atau didefinisikan ulang.
Contoh:
.EQU
.EQU
.CSEG
oi_offset=0x23
porta = io_offset + 2
clr
out
r2
porta, r2
10. ESEG
Pengaran ini digunakan untuk mendefinisikan EEPROM Segments. Sebuah file
assembler bisa saja terdiri dari beberapa EEPROM Segment, namun pada saat
diasembli, semuanya akan dikumpulkan dalam satu EEPROM Segment. Pengarah
ESEG tidak memerlukan parameter apapun dalam penulisannya.
Sintaks:
.ESEG
Contoh:
.DSEG
.ESEG
.CSEG
vartab:
.BYTE 4
eevar:
.DW 0x0ff0
const:
.DW 2
mov
r1, r0
11. EXIT
Citra Lab
34
Pemrograman AVR
12. INCLUDE
Pengarah INCLUDE akan memberitahukan pada software Asembler untuk mulai
membaca pada sebuah file khusus yang ditunjuk. Setelah itu, Asembler akan
membaca hingga akhir file tersebut atau hingga pengarah EXIT dijumpai.
Sintaks:
.INCLUDE
Contoh:
.EQU
.EQU
.EQU
.INCLUDE
in
nama_file
sreg=0x0f
sphigh=0x0e
splow=0x0d
iodefs.asm
r0, sreg
13. LIST
Pengarah LIST akan memberitahukan Asembler untuk membangkitkan file list.
Asembler akan membangkitkan file list yang berisi gabungan kode assembler, alamat,
dan opcode. File list akan dibangkitkan dalam mode defaut Asembler. Pengarah ini
dapat pula digunakan bersama dengan mengarah NOLIST dengan maksud untuk
hanya membangkitkan file list pada bagian tertentu saja.
Sintaks:
.LIST
Contoh:
.NOLIST
.INCLUDE macro. inc
.INCLUDE consdef. inc
.LIST
;mengaktifkan pembangkitan file LIST
14. LISTMAC
Pengarah LISTMAC akan mengatakan pada Asembler bahwa ketika sebuah macro
dipanggil, maka penambahan macro akan ditampilkan pada file list yang
dibangkitkan. Dalam mode default, hanya macro yang dipanggil dengan parameter
yang akan ditempatkan dalam file list.
Sintaks:
.LISTMAC
Contoh:
Citra Lab
35
Pemrograman AVR
.MACRO
.ENDMACRO
.LISTMAC
MACX
add
eor
MACX
r0, @0
r1, @1
r2, r1
15. MACRO
Pengarah MACRO digunakan untuk mengawali suatu macro. pengarah ini
membutuhkan parameter berupa nama_macro.
Suatu macro diakhiri menggunakan pengarah ENDMACRO. Pada kondisi default,
hanya pemanggilan macro yang ditampilkan pada file list yang dibangkitkan oleh
software assembler. Untuk memasukkan macro yang ditunjuk ke dalam file list, maka
pengarah LISTMAC harus digunakan. Suatu macro ditandai dengan tanda + pada
opcode di dalam file list.
Sintaks:
.MACRO
Contoh:
.MACRO
.ENDMACRO
.CSEG
SUBI16
SUBI16
subi @1, low (@0)
sbci @2, high (@0)
0X1234, r16, r17
16. NOLIST
Pengarah ini digunakan agar suatu runtuh instruksi tidak dimasukkan dalam file list
yang dibangkitkan. Pada umumnya, software assembler akan membangkitkan file list
yang berisi alamat, instruksi sumber, dan opcode dari file sumber. Pembangkitan file
list akan dilakukan secara otomatis dalam mode default dan dapat dibuat tidak aktif
menggunakan pengarah ini. Pengarah ini juga dapat digunakan bersama pengarah
LIST yang digunakan untuk membangkitkan file list hanya untuk bagian tertentu dari
program sumber.
Sintaks:
.NOLIST
Contoh:
.NOLIST
.INCLUDE
.INCLUDE
.LIST
17. ORG
Pengarah ORG digunakan untuk menentukan pencacah lokasi pada suatu nilai mutlak
tertentu. Nilai tersebut dituliskan sebagai parameter pengarah ini. ORG berarti nilai
awal (origin). Apabila ORG digunakan pada Data Segment, makan nilai parameter
Citra Lab
36
Pemrograman AVR
akan menunjuk pada lokasi SRAM dan bila digunakan pada Code Segment, maka
parameter tersebut akan menunjuk pada lokasi Memori Program. Sedangkan bila
digunakan pada EEPROM Segment, maka parameter dari pengarah ini akan
menunjuk lokasi EEPROM. Nilai default pencacah lokasi Code dan EEPROM adalah
nol, sedangkan nilai default pencacah lokasi SRAM adalah 32 (karena registerregister menempati alamat 0-31) pada saat proses asembli dimulai.
Sintaks:
.ORG
ekspresi
Contoh:
.DSEG
; Mulai data segment
.ORG 0x37
; Set
awwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwla mat SRAM pada 37hex
variable: .BYTE 1
;
.CSEG
.ORG 0x10
mov r0, r1
18. SET
Pengarah SET digunakan untuk memberikan suatu nilai tertentu pada suatu label.
Label tersebut dapat digunakan pada ekspresi selanjutnya.
Sinteks:
.SET label=ekspresi
Contoh:
.SET io_ofset = 0x26
.SET porta = io_ofset +2
.CSEG
clr
r2
out
porta,r2
5.4 Ekspresi
Ekspresi dapat berupa operan, operator, maupun fungsi. Semua ekspresi akan
diterjemahkan sebagai kode 32-bit oleh assembler/compiler.
5.4.1 Operan
Label yang didefinisikan oleh user dan diberi nilai pencacah lokasi sesuai dengan
tempat di mana label tersebut akan muncul.
Variable yang didefinisikan oleh user menggunakan pengarah SET.
Konstanta integer, dituliskan dalam beberapa format berikut:
a.
Desimal (default): 0, 23, 50
b. Heksadesimal:0x0a, 0xff, $80
Citra Lab
37
Pemrograman AVR
c. Biner: 0b00101110
PC: nilai pencacah Memori Program pada saat itu.
5.4.2 Fungsi
Fungsi yang digunakan pada assembler AVR didefinisikan dengan cara berikut:
5.4.3 Operator
Operator yang digunakan dalam pemrograman assembler AVR diberikan pada Tabel
5.2.
Tipe
Kalkulasi
Biner
+
*
/
&
|
^
~
<<
>>
<
>
==
<=
Logika
Simbol
>=
!=
&&
||
!
Penjumlahan
Pengurangan
Perkalian
Pembagian-Integer
Bitwise AND
Bitwise OR
Bitwise Exclusive-OR
Bitwise NOT
Geser kiri
Geser kanan
Kurang dari
Lebih dari
Sama dengan
Kurang dari atau sama
dengan
Lebih dari atau sama
dengan
Tidak sama dengan
AND
OR
NOT
Contoh
Pemrograman AVR
Deklarasi konstanta
Definisi variable
File include
Vektor Reset dan intrupsi
Program utama
Akhir program
5.5.2 Penggunaan Register
Penggunaan register dalam pemrograman AVR merupakan hal yang sangat
esensial dan tidak dapat dipisahkan dalam penulisan program. Untuk itu anda perlu
berhati-hati dalam menuliskan instruksi, memilih register, dan hal-hal lain yang
berkaitan dengan penunggunan register. Mula-mula definisikan nama register
menggunakan pengarah DEF dan pilihlah nama yang anda anggap mudah diingat dan
mencerminkan fungsi dan kegunaannya, Jika anda perlu menggunakan akses pointer,
gunakanlah register R26 sampai R31. Sedangkan bila anda ingin melakukan
pencacahan menggunakan counter 16-bit, pilihlah pasangan register R24:R25.
Apabila anda ingin membaca dari memori program, misal: nilai konstanta, anda dapat
menggunakan Z (R31:R30) dan R0. Register R16 sampai R31, dapat anda gunakan
untuk mengakses bit tunggal suatu register tertentu.
Dalam mikrokontroler AVR terdapat 32 buah register. Register tersebut
memiliki nama asli R0 hingga R31, namun anda dapat memberi nama sesuai yang
anda kehendaki dengan menggunakan pengarah assembler. Nama yang anda berikan
hendaknya adalah nama yang mudah diingat dan mencerminkan kegunaan atau isi
dari register tersebut.
.DEF reg_bilangan1 = R16
Dengan memberi nama reg_bilangan1 pada R16, maka anda dapat menggunakan
reg_bilangan1 untuk menunjuk R16.
Misalkan anda ingin memberi nilai 150 pada register R16, anda dapat menggunakan
perintah berikut:
LDI
reg_bilangan1, 150
Penulisan bilangan pada assembler AVR memiliki default pada basis bilangan
decimal. Bila anda ingin menuliskan bilangan dalam basis heksadesimal atau biner,
maka anda harus menggunakan format penulisan yang lain, misalnya 0x6a atau $6a
untuk heksadesimal, atau 0b01101010 untuk penulisan bilangan dalam format biner.
Dalam satu perintah, Anda mungkin ingin mengoperasikan dua buah register.
Misalnya anda ingin memindahkan isi suatu register ke register yang lain, anda dapat
menggunakan perintah MOV.
.DEF reg_bilangan1
= R16
reg_bilangan1, 150
MOV
reg_penampung, reg_bilangan1
Perintah diatas akan menulis nilai 150 pada register reg_bilangan1 dan
kemudian menyalin isi register reg_bilangan1 ke reg_penampung. Perhatikan, bahwa
register yang dituliskan terlebih dahulu pada instruksi MOV merupakan register target
yang merupakan register di mana hasil operasi akan dituliskan.
Citra Lab
39
Pemrograman AVR
Dua baris pertama yang berisi pengarah assembler di atas tidak akan
menghasilkan kode apapundalam Memori Program AVR. Penggunaan pengarah
assembler hanya untuk menberikan suatu informasi kepada software assembler dalam
proses pelaksanaan asembli.
Untuk memuati reg_penampungan dengan suatu bilangan (missal 150), anda mingkin
akan menuliskan perintah berikut:
.DEF
reg_penampung = R15
LDI
reg_penampung, 150
Maka anda akan kehilangan data. Perlu anda ketahui bahwa hanya register
R16 hingga R31 yang dimuati dengan suatu konstanta menggunakan instruksi ldi.
Keterbatasan ini sangat tidak menyenangkan, namun tidak dapat dihindari karena
kontruksi instruksi set AVR. Sebagai pengecualian, terdapat satu instruksi yang
berlaku untuk semua register yaitu clr, yang akan mengeset isi register dengan nilai
nol. Perintah clr <nama_register>, berlaku untuk semua register.
Di samping instruksi LDI, terdapat instruksi-instruksi lain yang memiliki pembatasan
dalam penggunaan dalam program assembler. Instruksi-instruksi tersebut adalah:
1.
ANDI Rx, K
;bit-AND register Rx dengan konstanta K.
2. CBR Rx, M
;bersihkan semua bit dalam register Rx dan set ke 1 dengan
mask value M.
3. CPI Rx, K
;bandingkan isi register Rx dengan konstanta bernilai K.
4. CBCI Rx, K
;kurangkan isi register Rx beserta nilai carry flag-nya dari nilai
konstanta K.
5. SBR Rx, M
;set semua bit dalam register Rx dengan nilai 1, dengan mask
value M.
6. SER Rx
;set semua bit dalam register Rx (sama dengan perintah LDI
Rx,255).
7. SUBI Rx, K
;kurangkan nilai konstanta K dari isi register Rx, dan simpan
hasilnya ke register Rx.
Semua instruksi di atas hanya berlaku untuk register R16 sampai R31. Apabila
anda ingin menggunakan instruksi-instruksi di atas, Anda perlu memilih salah satu
register diatas. Hal itu akan memudahkan anda dalam pemrograman. Hal ini juga
merupakan alasan tambahan digunakannya pengarah assembler untuk mendefinisikan
lokasi register sehingga kita dapat lebih mudah mengubah lokasi register yang kita
inginkan.
Sedikit mengulang apa yang telah anda pelajari di muka, dalam pemrograman
assembler, terdapat aturan tambahan yang berlaku untuk pasangan register R26:R27,
R28:R29, dan R30:R31. Seperti anda ketahui, ketiga pasangan register ini memiliki
nama tambahan yaitu X, Y dan Z. Pasangan tersebut merupakan pointer register 16-bit
yang dapat menunjuk alamat dengan maksimum 16-bit ke dalam lokasi memori
SRAM (X, Y, Z) atau ke dalam lokasi Memori Program (Z). Byte bawah dari alamat
16-bit tersebut ditempatkan pada register yang lebih rendah, sedangkan byte atas
ditempatkan pada register yang lebih tinggi. Kedua bagian ini memiliki nama yang
sendiri-sendiri, misalkan, byte atas dari Z dinamakan ZH(=R31) dan byte bawah dari
Z dinamakan ZL(= R30). Nama-nama tersebut didefinisikan dalam file header standar
untuk masing-masing mikrokontroler. Pembagian nama pointer 16-bit tersebut dalam
dua byte yang berbeda dilakukan seperti berikut:
Citra Lab
40
Pemrograman AVR
.EQU
Adress
RAMEND
1di
1di
1di
LPM
Setelah perintah ini, alamat harus di-incremen untuk menunjuk byte berikutnya dalam
memori program. Karena sering digunakan, increment pointer didefinisikan melalui
perintah berikut:
ADIW
Z, 1
LPM
data teks
Anda harus selalu menulis data berjumlah genap, jika tidak maka assembler akan
menambahkan nilai nol pada bagian akhir daftar nilai yang barangkali tidak Anda
harapkan.
Daftar data yang sama dapat Anda tuliskan dalam wordwise, sebagaimana contoh
berikut:
.DB
12345,6789
; daftar 2 word
Citra Lab
41
Pemrograman AVR
Selain data berupa konstanta, anda juga dapat memasukkan label (target lompatan),
seperti contoh berikut:
Label1:
[. . perintah . .]
Label2;
[. . perintah lainnya . .]
Tabel:
.DB
label1,Label2
; daftar label
Penggunaan khusus register pointer adalah untuk mengakses dirinya sendiri. Register
terletak pada 32-byte pertama dalam mikrokontroler (0x0000 sampai 0x001F). Akses
ini hanya akan bermanfaat apabila Anda harus menyalin isi register ke SRAM atau
EEPROM atau sebaliknya.
Penggunaan utama pointer adalah untuk mengakses tabel dengan nilai tetapan pada
memori program. Sebagai contoh, tabel dengan 10 niali 16-bit dengan nilai kelima
dibaca ke R25:R25.
Table_1:
.DW 0x1234, 0x2345, 0x3456, 0x4568, 0x5678
ADIW ZL, 10
LPM
MOV R24, R0
ADIW ZL, 1
LPM
MOV R25, R0
5.5.4 Port
Port merupakan gerbang yang menghubungkan CPU dengan komponen lain
baik internal maupun eksternal. CPU berkomunikasi dengan komponen-komponen
tersebut, membaca nilai atau menulis suatu niali padanya. Port yang paling sering
digunakan adalah register flag yang kepadanya dituliskan nilai hasil operasi
sebelumnya dan syarat percabangan dibaca darinya.
Port AVR memiliki alamat tetap yang digunakan untuk berkomunikasi dengan
CPU. Alamat Port pada AVR sudah tetap dan tidak bergantung pada tipe
mikrokontroler AVR. Misalkan saja, alamat port B adalah 0x18. Anda tidak perlu
menghafal alamat port-port tersebut, karena masing-masing port memiliki nama alias
yang didefinisikan dalam file include (file header) dari masing-masing
mikrokontroler. Dalam file include, Port B didefinisikan menggunakan baris berikut:
.EQU PORTB, 0x18
Port biasanya diorganisasikan dalam bilangan 8 bit, amaun juga dapat diakses sebagai
8 single bit. Bila single bit hendak digunakan, maka Anda dapat jhuga menggunakan
nama yang didefinisikan dalam file include. Dengan mengikuti aturan penamaan
Citra Lab
42
Pemrograman AVR
tersebut, anda tidak perlu mengingat-ingat posisi bit tersebut dalam suatu port.
Sebagai contoh, MCU General Control Register yang diberi nama MCUCR berisi
sejumlah single contoh bit yang mengendalikan kerja mikrokontroler secara umum.
MCUCR merupakan sebuah port yang dikemas dengan 8 control bit, dengan namanya
masing-masing (ISC00, ISC01, . .). Sehingga apabila anda ingin membawa
mikrokontroler Anda pada kondisi sleep, anda perlu tahu dari data sheet bagaimana
anda harus mengeset bit yang bersangkutan.
.DEF my_setting = R16
1di
my_setting = 0b00100000
out
MCUCR, my_setting
sleep
Perintah OUT akan membawa isi register my_setting, yang berisi Sleep-Enable-Bit
bernama SE, ke port MCUCR dan mengeset mikrokontroler ke kondisi sleep apabila
perintah SLEEP dieksekusi.
Pada perintah diatas, seluruh isi register my_setting akan disalin ke MCUCR.
Dari contoh di atas dapat anda lihat bahwa bit SE (bit5) berlogika 1(set) sedangkan
Sleep-Mode-Bit bernama SM (bit4) akan di-clear(0). Ini berakibat system masuk ke
mode idle atau half-sleep (setengah tidut) yang akan membuat tidak ada eksekusi
perintah berikutnya yang dilakukan, namun system tetap akan bereaksi terhadap
interupsi timer dan interupsi eksternal lainnya. Mode sleep yang lain dalam AVR
adalah mode power-down. Untuk masuk dalam mode ini, pertama SE harus diset dan
bit SM juga harus diset. Apabila program mendapatkan instruksi SLEEP, maka
mikrokontroler hanya bisa dibangunkan oleh reset eksternal, reset akibat WDT
overflow atau interupsi eksternal pada NIT0 atau INT1.
Untuk membaca isi suatu port, Anda dapat menggunakan instruksi IN. Berikut
ini contoh penggunaannya di dalam program.
.DEF
my_read = R16
IN
my_read, MCUCR
Penggalan program di atas akan membaca isi port MCUCR dan menyalinya
dalam register my_read. Pada beberapa port, terdapat sejumlah bit yang tidak
terdefinisikan atau tidak digunakan. Bila bit-bit tersebut dibaca, maka hasil yang
diperoleh adalah nol (0).
Semakin sering Anda membaca port 8-bit, maka anda harus memperhatikan
seluruh perubahan status port tersebut. Terkadang anda tidak perlu membaca
keseluruhan isi port dan memisahkan bit yang berkaitan saja. Untuk keperluan ini,
Anda dapat menggunakan instruksi yang tepat dan memberikan kesempatan untuk
eksekusi perintah pada level bit tertentu. Mengeset atau meng-clear bit suatu port juga
dapat Anda lakukan tanpa harus membaca dan menulis bit-bit lain dalam port
tersebut. Perintah-perintah tersebut adalah SBI (Set Bit I/O) dan CBI (Clear Bit I/O).
Contoh penggunaan instruksi ini adalah sebagai berikut:
.EQU
ActiveBit = 2
SBI
PortB, ActiveBit
CBI
PortB, ActiveBit
Kedua instruksi di atas memiliki kelemahan, yakni hanya port yang berlokasi
pada alamat kurang dari 0x20 yang dapat diakses. Port dengan alamat di atas 0x20
tidak dapat diakses menggunakan cara ini. Pada kasus lain, port dapat diakses dengan
Citra Lab
43
Pemrograman AVR
cara lain. Cara lain untuk mengakses port adalah dengan menggunakan perintah
akses SRAM, seperti ST dan LD. Caranya adalah dengan menambahkan 0x20 pada
alamat port. Berikut ini ditunjukkan cara pengaksesan tersebut.
.DEF
my_port = R16
1di
ZH, HIGH (PortB+32)
1di
ZL, LOW (PortB+32)
1d
my_Port, Z
0x0060, R1
Sedangkan untuk operasi sebaliknya, yaitu menyalin isi SRAM pada alamat 0x0060
ke dalam register R1, dapat anda lakukan dengan menggunakan perintah:
LDS
R1,
0x0060
Citra Lab
44
Pemrograman AVR
Untuk memudahkan Anda dalam melakukan Akses terhadap memori SRAM, Anda
dapat memberi nama simbolik yang mudah diingat untuk alamat SRAM tersebut.
Dengan cara ini, Anda tidak perlu lagi menuliskan bilangan heksa dari alamat 0x0060
Anda beri nama temp_satu. Anda dapat menuliskan dalam program sebagai berikut:
.EQU
temp_satu
STS
0x0060
temp_satu, R1
Dengan penamaan seperti di atas, Anda akan lebih mudah untuk mengingat lokasi
yang anda inginkan.
Cara pengaksesan SRAM yang lain adalah dengan menggunakan pointer. Untuk
keperluan ini, Anda membutuhkan dua buah register yang digunakan untuk
mengalamati 16-bit lokasi. Anda dapat menggunakan pasangan register X, Y, dan Z.
Pasangan register tersebut mengizinkan kita untuk melakukan akses terhadap lokasi
yang mereka tunjuk secara langsung (misalnya dengan ST X, r1), yang ditunjuk
setelah nilai alamat di-decremen (misalnya dengan ST X, R1) atau dengan increment
alamat (dengan ST +X, R1). Contoh pengaksesan tiga sel memori adalah sebagai
berikut:
.EQU
temp_satu = 0x0060
.DEG
reg_satu = r1
.DEF
reg_dua = R2
.DEF
reg_tiga = R3
LDI XH, HIGH (temp_satu)
LDI XL, LOW (temp_satu)
LD reg_satu, X+
LD reg_dua, X+
LD reg_tiga, X
Bentuk ketiga merupakan bentuk pengaksesan yang cukup jarang dilakukan, misalkan
saja kita sangat sering mengakses tiga buah lokasi SRAM. Sementara kita memiliki
sisa pasangan register, kita akan berusahan untuk menggunakannya untuk keperluan
tersebut. Bila kita menggunakan instruksi LD/ST, Anda harus selalu mengubah
pointer apabila anda ingin mengakses lokasi yang lain. Hal itu sungguh tidak
menyenangkan. Untuk menghindarinya, anda dapat menggunakan pengaksesan
dengan offset, yang cukup membingungkan bagi para pemula. Selam akses
berlangsung, isi register tidak pernah berubah. Alamat dihitung menggunakan
penjumlahan sementara terhadap nilai offset yang tetap. Dari contoh di atas,
pengaksesan lokasi 0x0062 akan tampak seperti berikut:
Pertama, pointer register kita gunakan menunjuk lokasi 0x0060.
.EQU
temp_satu = 0x0060
.DEF
reg_satu = R1
LDI YH, HIGH (temp_satu)
LDI YL, LOW (temp_satu)
[ . . . ]
Citra Lab
45
Pemrograman AVR
Kemudian bila di suatu tempat dalam program kita hendak mengakses lokasi SRAM
0x0062, kita dapat menggunakan perintah berikut:
STD
Y+2, reg_satu
reg_satu,
Y+2
SRAM juga umum digunakan sebagai stavk dalam program assembler. Stavk
memiliki struktur LAST-In-First-Out, artinya yang terakhir masuk dalam stack akan
menjadi yang pertama keluar. Untuk menggunakan SRAM sebagai stack, pertama
ANDa perlu mendefinisikan stack pointer. Stack pointer merupakan pointer 16-bit,
maka dapat diakses layaknya sebuah port. Kedua registernya bernama SPH:SPL. SPH
merupakan byte atas (MSB), sedangkan SPL merupakan byte bawah (LSB). Hal ini
hanya berlaku untuk AVR dengan kapasitas SRAM lebih dari 256 byte. Bila tidak,
maka SPH tidak didefinisikan dan tidak dapat digunakan.
Simpan
Ambil
Simpan
Terakhir Masuk,
4
pertama keluar
2
Pertama Masuk,
pertama keluar
SPH, reg_satu
LDI
OUT
SPL, reg_satu
Nilai RAMEND tentu saja tergantung pada jenis AVR yang anda gunakan. Nilai ini
juga didefinisikan dalam file header standar masing-masing jenis AVR. Untuk file
2313def.inc, nilai ini dinyatakan dalam baris berikut:
.equ
RAMEND = $xxx
Citra Lab
46
Pemrograman AVR
File 2313def.inc dimasukkan dalam program yang anda buat menggunakan pengarah
INCLUDE pada awal kode.
5.5.6 Penggunaan STACK
Menggunakan stack dalam program cukup mudah. Isi register didorong pada stack
dengan perintah seperti berikut:
PUSH
reg_satu
Apabila anda kini ingin mendapatkan isi register tadi, Anda cukup menuliskan
perintah berikut:
POP
reg_satu
Dengan instruksi POP, anda akan mendapatkan nilai yang terkhir didorong ke stack.
Perintah menggunakan PUSH dan POP hanya bermanfaat apabila isi register
masih Anda perlukan pada baris lain berikutnya, semua register telah terpakai atau
tidak terdapat tempat lain yang dapat anda gunakan untuk menyimpan nilai tersebut.
Bila kondisi-kondisi tersebut tidak terpenuhi, maka penggunaan stack tidak akan
bermanfaat dan hanya akan membuang waktu saja.
Penggunaan stack yang lain adalah pada saat Anda memanggil suatu subrutin.
Dalam hal ini, stack akan anda perlukan untuk menyimpan lokasi di mana anda
memanggil suatu subrutin. Alamat tersebut nantinya akan digunakan untuk kembali
lagi setelah subrutin selesai dieksekusi. Pada saat program memanggila suatu
subrutin, maka alamat tersebut akan didorong ke stack menggunakan instruksi PUSH
dan setelah subrutin selesai dieksekusi, alamat dalam stack akan dimunculkan
kembali menggunakan instruksi POP. Eksekusi program kemudian akan dilanjutkan
tepat pada instruksi setelah instruksi pemanggilan subrutin berada.
RCALL subrutin1
[]
subrutin1:
[]melakukan sesuatu
[]ingin kembali
RET
Citra Lab
47
Pemrograman AVR
Pad saat catu daya mikrokontroler ON, maka mikrokontroler akan mulai
bekerja dari kondisi reset. Program counter akan menunjuk nilai nol dank ode pada
alamat pertama memori program akan dieksekusi. Selain pada saat pertama catu daya
dihidupkan, terhadap beberapa keadaan yang membuat PC bernilai nol dan masuk
pada kondisi reset. Hal-hal berikut akan membawa program dalam mikrokontroler
masuk ke dalam kondisi reset:
1. Pada saat Power ON.
2. Saat reset eksternal terjadi, yaitu ketika pin reset diaktifkan.
3.
Pada saat Watchdog Timer mencapai nilai maksimum (overflow). Watchdog
Timer merupakan pewaktu independent yang harus anda reset dari waktu ke
waktu sebelum mencapai nilai maksimum, jika tidak maka mikroprosesor akan
restart.
Reset mokrokontroler yang diakibatkan oleh WDT terjadi apabila WDT dienable
melalui program dan isi WDT mencapai nilai maksimum. Dalam kondisi default,
WDT tidak aktif (disable). Untuk mengenabel WDT, diperlukan suatu perintah
terhadap port WDT. Sedangkan untuk mencegah terjadinya reset akibat WDT
mencapai nilai maksimum, maka Anda harus mengembalikan nilai WDT menjadi nol
sebelum mencapai nilai maksimum. Hal itu dapat anda lakukan dengan menggunakan
perintah WDR.
Sesudah eksekusi reset, yang akan membuat semua register dan port dalam
keadaan default, kode pada alamat 0000 akan dieksekusi. Selama eksekusi, PC akan
sudah di-incremen dank ode berikutnya akan dibaca untuk dipegang pada fetch buffer.
Teknik ini dinamakan fetch during execution. Dengan teknik inilah satu clock osilator
untuk setiap kode, kecuali untuk percabangan dan lompatan. Ini sungguh sangat
mengagumkan.
Perintah pertama yang akan dieksekusi selalu berlokasi pada alamat 0000.
Untuk mengatakan pad software assembler bahwa program yang anda buat dimulau
dari alamat ini, anda dapat menggunakan pengarah CSEG dan ORG. Penulisannya
dalam program adalah seperti berikut:
.CSEG
.ORG
0000
Pemrograman AVR
0000
RJMP
Start
RJMP
Rutin_Int1
RJMP
Rutin_Int2
Perintah RJMP akan menghasilkan lompatan nemuju label yang ditunjuk. Nama label
diakhiri dengan tanda titik dua (:).
Aliran program dan linier, kecuali bila terdapat perubahan rangkaian eksekusi.
Perubahan rangkaian eksekusi dapat terjadi apabila program menemukan kondisi
percabangan atau interupsi. Percabangan merupakan hal yang sangat lazim digunakan
dan terjadi apabila salah satu kondisi dalam percabangan bersyarat terjadi.
Sebagai contoh, anda hendak membuat pencacah 32-bit menggunakan empat
register, R1 hingga R4. Lest significant byte dalam R1 di-incrfemen. Setiap kali
register R1 overflow saat operasi increment tersebut (yakni ketika dicapai nilai
255+1=0), maka anda harus increment register R2. Begitu seterusnya sampai R4.
Untuk melakukan increment pada saat register, anda dapat menggunakan
instruksi INC. Apabila terjadi overflow saat eksekusi INC R1, bit Z (zero) dalam
status register akan diset :1:. Bit C yang diset ketika overflow tidak akan berubah
selama eksekusi INC. Zero bit dan Zero-flag cukup untuk anda gunakan untuk
mendeteksi terjadinya overflow.
Bila Zero-bit diset, Anda harus melakukan eksekusi increment tambahan
terhadap register yang lain. Interupsi percabangan yang dapat kita gunakan adalah
BRNE ((Branch if Not Equal). Selain BRNE, terdapat instruksi percabangan lain
yaitu BRNZ (Branch if not Zero).
Citra Lab
49
Pemrograman AVR
Penggalan program untuk melakukan pencacahan naik 32-bit tampak seperti berikut:
Count 32:
INC
R1
BRNE
Count 32
INC
R2
BRNE
Count 32
INC
R3
BRNE
Count 32
INC
R4
Pemrograman AVR
BRID
Namun bila Anda hendak membuat delay 1 ms, tidak berarti anda harus menggunakan
instruksi ini sebanyak 4000 buah. Hal ini merupakan hal bodoh dan hanya menyita
ruang dalam Memori Program. Yang perlu anda lakukan hanyalah membuat sebuah
delay menggunakan pencacah dan beberapa instruksi percabangan. Dengan element
tersebut, anda dapat membuat suatu loop dimana waktu eksekusi yang diperlukan
senilai dengan delay yang anda inginkan. Pada prinsipnya, delay menggunakan loop
dibangun menggunakan pencacah yang akan menghitung naik atau turun dan apabila
suatu kondisi di capai, maka program akan keluar dari loop tersebut.
Sebagai contoh, kita akan membuat suatu delay menggunakan pencacah 8-bit.
CLR
R1
Count:
DEC
R1
BREQ
Count
Pencacah 16-bit juga dapat anda gunakan untuk membuat suatu delay dengan tepat,
misalkan seperti ini:
LDI ZH, HIGH (65535)
Citra Lab
51
Pemrograman AVR
Hal yang perlu anda perhatikan dalam membangaun suatu delay adalah menghitung
berapa siklus instruksi yang dilakukan untuk menyelesaikan delay tersebut. Hal ini
terkadang cukup membuat kita pusing. Ingat bahwa eksekusi instruksi lompatan
dapat membutuhkan waktu lebih dari satu siklus instruksi. Anda harus Melakukan
kalkulasi terhadap semua proses eksekusi, yang semestinya dapat dirumuskan dengan
persamaan tertentu sesuai dengan model loop yang anda buat. Apabila anda
menginginkan kemudahan dalam menghitung lama waktu delay, anda dapat
mengujinya menggunakan simulator ataupun software assembler/compiler yang
dilengkapi dengan penghitung waktu instruksi.
5.5.9 Macro
Apabila anda sering menggunakan suatu runtun program tertentu di dalam
program anda, maka rangkaian program tersebut tidak harus selalu anda tuliskan
aetiap kali anda membutuhkannya. Anda dapat menjadikan rangkaian program
tersebut sebagai suatu makro dan anda dapat menggunakannya beberapa kali dalam
program seperti yang anda inginkan. Untuk menggunakan suatu makro, Anda cukup
memanggil namanya saja.
Makro merupakan suatu rangkaian kode program yang berisi instruksiinstruksi, yang dapat anda gunakan kembali dalam program dengan hanya
menyebutkan namanya saja. Sebagai contoh, kita akan membuat sebuah macro yang
merupakan delay 1 us pada clock 4 MHz dengan nama Delay1.
.MACRO Delay1
NOP
NOP
NOP
NOP
.ENDMACRO
Makro tersebut dapat anda panggil bila anda membutuhkan suatu delay 1 us tanpa
harus menuliskan kembali kode program yang sama.
[instruksi-instruksi dalam program anda]
Delay1
[instruksi-instruksi berikutnya]
Delay1
[selanjutnya lagi]
Dengan cara ini, maka delay1 yang berisi 4 buah NOP akan dimasukkan dalam kode
sumber program saat proses asembli/kompilasi.
Citra Lab
52
Pemrograman AVR
Sebuah subrutin harus diawali dengan label dan diakhiri dengan instruksi RET.
Sedangkan RET1 digunakan untuk mengakhiri rutin instrupsi.
Dalam contoh di atas subrutin Delay10 hanya terdapat 3 buah instruksi NOP
dan sebuah instruksi RET. Sepuluh siklus eksekusi diperoleh dari kalkulasi seluruh
eksekusi instruksi tersebut. Sepuluh siklus instruksi tersebut diperoleh dari 3 siklus
untuk NOP dan 4 siklus untuk RET. Sisanya, yaitu 3 siklus digunakan untuk
memanggil subrutin tersebut.
Pemanggilan subrutin Delay10 dilakukan seperti berikut ini:
[perintah dalam program anda]
RCAAL Delay10 ;memanggila subrutin Delay10
[perintah lain berikutnya]
Instruksi RCAAL berarti memanggil suatu alamat relative tertentu, yaitu yang
dinyatakan dengan label. Jarak relative lompatandari pemanggilan ini akan dihitung
oleh assembler/compiler. Pada penggunaan subrutin, eksekusi program akan
mengalami lompatan menuju subrutin yang dipanggila dan setelah eksekusi terhadap
subrutin tersebut selesai (menemukan instruksi RET), aliran program akan kembali
meneruskan perintah berikutnya.
Bila anda ingin menuju suatu lokasi tertentu dalam program, anda dapat
menggunakan instruksi RJMP (Relative JuMP). Instruksi RCAAL dan RJMP
merupakan instruksi percabangan tidak beryarat , yang akan mengalihkan aliran
program tanpa mensyaratkan kondisi tertentu. Instruksi RJMP tidak dapat digunakan
untuk memanggil suatu subrutin, karena instruksi ini tidak melakukan pendorongan
PC ke Stack yang mengakibatkan ketika ditemui instruksi RET, program tidak dapat
mendapatkan kembali nilai PC sebelumnya (saat eksekusi RJMP).
Citra Lab
53
Pemrograman AVR
RJMP Proses
berikutnya]
Hitung:
Proses:
RET
[Instruksi
berikutnya
RCALL Delay10
[instruksi berikutnya]
R1, R2
RCALL SomeSubroutine
Pemrograman AVR
melewatkan satu instruksi berikutnya apabila bit dalam port yang ditunjuk berlogika
1.
SBIC PortB, 0
RJMP ATarget
Dalam contoh di atas, instruksi RJMP hanya akan dieksekusi apabila bit 0
dalam portB berlogika 0. Untuk menggunakan Instruksi ini, anda perlu mengetahui,
bahwa hanya 16 port pertama yang dapat dilakukan akses per bit-nya.
5.5.11 Interupsi
Apabila anda membuat suatu aplikasi mikrokontroler, tentunya anda
menghendaki agar system tersebut dapat berinteraksi dengan dunia luar. Sebagai
contoh, anda tentu akan lebih menyukai aplikasi yang dapat memberi respon ketika
anda beri masukan dari pada salah satu pin, dari pada system yang hanya melakukan
suatu pola kegiatan yang tidak memperdulikan input yang anda berikan. Agar suatu
system aplikasi yang anda buat dapat bereaksi terhadap input yang diberikan, anda
dapat menggunakan metoda polling atau dengan menggunakan interupsi. Metoda
polling merupakan cara pengecekan terhadap adanya suatu perubahan kondisi dengan
menggunakan suatu loop. Dengan bahasa yang labih sederhana, metoda polling akan
mengecek suatu pin input atau status lain secara rutin selama menjalankan pekerjaan
utamanya. Namun bila masukan yang terjadi berupa suatu pulsa yang sangat pendek,
sedangkan periode pengecekan dari polling relative lama, maka perubahan input tadi
bisa saja terdeteksi. Agar perubahan kondisi yang terjadi dapat selalu terdeteksi,
penggunaan interupsi merupakan solusi yang sangat tepat.
Interupsi dalam mikrokontroler merupakan cara bagaimana system
memberikan respon terhadap suatu kondisi masukan tertentu, ketika proses pekerjaan
sedang berlangsung. Apabila eksekusi dienable dan terjadi suatu interupsi, system
akan meninggalkan pekerjaannya, menuju pada rutin penanganan interupsi yang
sesuai dan setelah selesai selesai akan kembali melanjutkan pekerjaan.
Interupsi dapat terjadi akibat dipicu oleh adanya trigger dari input internal
maupun interupsi eksternal hardware. Untuk menggunakan interupsi dalam system
aplikasi Anda, hal pertama harus anda lakukan adalah enable interupsi flag. AVR
memiliki satu bit untuk enable interupsi yang bernama Interrupt Enable Flag. Bit ini
dapat anda set dengan menggunakan perintah SEI (Set Enable Interrupt).
Apabila kondisi terjadi, misalnya terjadi perubahan pada bit port,
mikrokontroler akan mendorong nilai PC ke dalam stack. Bila tidak, maka
mikrokontroler tidak akan dapat kembali pada lokasi ketika terjadinya interupsi, yang
berada dapat kembali pada lokasi ketika terjadinya interupsi, ;yang dapat berada di
mana saja dan kapan saja. Setelah menyelesaikan rutin interupsi, program akan
melanjutkan pekerjaannya. Terjadinya interupsi, akan membawa program menuju
vector interupsi yang sesuai. Biasanya, kode yang terdapat dalam vector interupsi
adalah intruksi JUMP untuk mengarahkan program menuju rutin interupsi yang telah
dibuat. Vector interupsi merupakan lokasi kusus yang akan dituju oleh program
apabila terjadi interupsi dan hal itu tergantung pada komponen hardware dan kondisikondisi yang hendak ditangani dengan interupsi. Semakin banyak komponen
hardware dan kondisi interupsi yang dapat ditangani, akan semakin banyak vector
interupsi. Daftar vector intrupsi untuk beberapa tipe AVR ditunjukkan dalam tabel
berikut.
Citra Lab
55
Pemrograman AVR
Dari data di atas tampak bahwa masing-masing tipe AVR memiliki perbedaan
kemampuan untuk menangani interupsi. Semakin atas, interupsi di atas memiliki
prioritas yang semakin tinggi. Apabila dua buah interupsi terjadi bersamaan, maka
interupsi dengan alamat yang lebih rendah yang akan ditangani terlebih dahulu.
Interupsi dengan vector interupsi yang lebih tinggi harus menunggu sampai interupsi
dengan prioritas lebih tinggi diselesaikan. Untuk mendisable terjadinya interupsi yang
lebih rendah, dalam rutin interupsi harus memuat program untuk mendisable flag
Interupsi.
Tabel 5.4 Interrupt Vector Untuk Beberapa AVR
Name
Int Vector Adress
Triggered by
2313 2323 8515
RESET
0000 0000 0000 Hardware Reset, Power-on Reset,
Watchdog Reset
INTO
0001 0001 0001 Level change on the external INT0Pin
INT1
0002 0002 Level change on the external INT1Pin
TIMER1 CAPT 0003 0003 Capture event on Timer 1
TIMER1
0004 Timer1= Compore A
COMPA
TIMER1
0005 Timer1= Compore B
COMPB
TIMER1
0004 Timer1= Compore 1
COMP1
TIMER1 OVF
0005 0006 Timer1 Overflow
TIMER0 OVF
0006 0002 0007 Timer0 Overflow
SPI STC
0008 Serial transmit complete
UART RX
0007 0009 UART char in receive buffer
available
UART UDRE
0008 000
UART transmitter ran empty
A
UART TX
0009 000
UART All sent
B
ANA COMP
000
Analog Comparator
C
Bila pekerjaan dalam rutin interupsi telah selesai, dalam bagian akhir rutin
interupsi harus terdapat kode untuk mengenabel kembali flag tersebut. Untuk
mengeset ulang bit I-status dapat dilakukan dengan dua cara. Yang pertama dengan
instruksi RETI dan yang kedua menggunakan SEI/RET.
RETI
Atau dengan
SET
RET
Cara kedua berbeda dengan cara pertama. Untuk mudahnya, sebaiknya anda
gunakan cara pertama, yaitu dengan RETI.
Citra Lab
56
Pemrograman AVR
.ORG 0000
RJMP
; Alamat
0000
0000
[]
IService:
BAB 6
AVR STUDIO 4
6.1 Penjelasan Umum
Citra Lab
57
Pemrograman AVR
Citra Lab
58
Pemrograman AVR
Citra Lab
59
Pemrograman AVR
Pemrograman AVR
Citra Lab
61
Pemrograman AVR
Citra Lab
62
Pemrograman AVR
Start Debugging, digunakan untuk memulai proses debug. Bila perintah ini
diaktifkan, semua kendali debug akan aktif dan dapat digunakan. Perintah ini
berhubungan dengan platform debug, loading object file dan melakukan reset. Setelah
perintah ini, anda dapat memulai debugging untuk mengamati eksekusi program yang
anda buat.
Stop Debugging, digunakan untuk menghentikan proses debug. Perintah ini
akan memutuskan hubungan dengan platform debug dan mengijinkan dilakukannya
suatu editing.
Show Next Instruction. Tanda ini hanya merupakan petunjuk instruksi mana
yang akan dieksekusi berikutnya.
Reset (Shift+F5), digunakan untuk melakukan reset terhadap eksekusi
program. Apabila sebuah program sedang dieksekusi dan perintah ini digunakan,
eksekusi akan dihentikan.
Run Debugging (F5), digunakan untuk memulai eksekusi program. Program
akan dieksekusi sampai dihentikan oleh user atau apabila sebuah breakpoint
ditemukan. Perintah ini hanya aktif ketika eksekusi berhenti.
Single Step, Trace Into (F11). Perintah ini digunakan untuk melakukan
eksekusi terhadap satu instruksi/perintah. Dengan perintah ini, kita dapat mengamati
setiap perubahan dalam register pada setiap satu langkah eksekusi dengan
memperhatikan kondisi-kondisi pada jendela pengamatan.
Step Over (F10). Perintah ini mirip dengan Single Step, namun perintah ini
tidak hanya mengeksekusi satu perintah apabila menemukan suatu instruksi
pemanggilan fungsi atau subrutin. Perintah ini sangat bermanfaat untuk menghemat
waktu pengamatan, karena kita tidak harus mengeksekusi setiap instruksi dalam suatu
subrutin satu persatu. Anda cukup menggunakan satu perintah untuk menjalankan
seluruh instruksi dalam subrutin tersebut. Setelah kembali dari pemanggilan subrutin
tersebut, seluruh informasi akan di-update.
Run to Cursor (F7). Perintah ini digunakan untuk melakukan eksekusi
terhadap suatu instruksi yang dipilih menggunakan kursor saat itu dan hanya dapat
digunakan bila Source Window dalam keadaan aktif.
Auto Step/Auto Trace Into. Perintah ini akan secara otomatis mengeksekusi
instruksi demi instruksi secara berurutan. Anda tidak perlu mengklik icon Single Step
berkali-kali, namun Anda cukup menggunakan perintah ini untuk mengeksekusi
seluruh instruksi. Pengaktifan perintah ini menyebabkan hanya toolbar debug Break
dan Reset yang aktif.
Citra Lab
63
Pemrograman AVR
BAB 7
PRAKTIK MEMBUAT PROJECT
MENGGUNAKAN AVR STUDIO 4
Citra Lab
64
Pemrograman AVR
langkah selanjutnya, pilih debug platform dan device. Bila anda tidak
menggunakan emulator, Anda dapat memilih platform Simulator. Pilih tipe device,
misalkan untuk test1, pilih AT90S2313. Lalu klik finish.
Kotak dialog yang tampak ditunjukkan oleh gambar berikut.
Citra Lab
65
Pemrograman AVR
startnum=0
.equ
endnum=10
.def
temp1=r16
.def
temp2=r17
Citra Lab
66
;<-
tulis
dalam
satu
Pemrograman AVR
.def
delay1=r18
.def
delay2=r19
.def
temp=r20
.cseg
.org 0
1di
temp, 0b11111111
out
DDRB, temp
mulai:
1di
temp1, sternum
1di
temp2, endnum
count:
out
;
portb, temp1
rcall tunda
cspe
temp1, temp2
rjmp
count
out
portb, temp1
; skip saja
rcall tunda
rjmp
mulai
tunda:
1di
delay2, 0xff
waitsome:
1di
delay1, 0xff
waitmore:
dec
delay1
brne
waitmore
dec
delay2
brne
waitsome
ret
.exit
5.
6.
Setelah anda selesai menuliskan program test1 pada teks editor, Anda dapat
menyimpannya dengan memilih FileSave. Isikan nama file, misalkan test1.
Setelah program test disimpan, lakukan pembangunana project dengan memiliha
ProjectBuild. Laporan mengenai proses ini akan ditampilkan dalam jendela
output. Bila penulisan anda benar dan tidak terdapat error, maka project telah
berhasil anda buat.
Citra Lab
67
Pemrograman AVR
.nolist
;list
file
untuk
include
file
tidak
ditampilkan .includeC:\ProgramFile\Atmel\AVR
Tools\AvrAsembler\Appnotes\2313 def.inc ; - satu baris
. list
. equ pola_bit=0b00001101
digeser
.def
.def
pola
bit
yang
temp1=r16
temp=r17
konfigurasi:
1di
temp, 0b11111111
out
ddrb, temp
1di
temp, 0b11111110
out
ddrd,temp
1di
out
temp, pola_bit
portb, temp
geserki:
sbis
rjmp
rol
out
rjmp
pind, 0
geserka
temp
portb, temp
geserki
geserka:
sbic
rjmp
ror
out
rjmp
pind, 0
geserki
temp
port, temp
geserka
; geser kanan
Citra Lab
68
perlu
akan
Pemrograman AVR
.exit
BAB 8
PROGRAMMER
PonyProg2000
PonyProg2000 merupakan salah satu programmer yang mudah digunakan dan
support untuk berbagai macam mikrokontroler maupun EEPROM. Programmer ini
juga dapat digunakan untuk memlakukan proses download, Anda perlu menyiapkan
hardware programmer yang diperlukan. Anda tidak perlu khawatir, karena perangkat
keras yang dibutuhkan untuk programmer ini sangat sederhana dan mudah untuk
Citra Lab
69
Pemrograman AVR
dibuat sendiri. Anda dapat memperoleh software maupun cara penggunaannya dengan
mengunjungi situs www.lancos.com.
VCC 20
12
11
10
PB7 (SCK)
PB6 (MISO)
9
8
PB5 (MOBI)
7
6
XTAL 1
AT90S2313
220
25
24
23
22
21
20
19
18
17
16
15
14
DB25
(LLPT1 PORT)
GND
Citra Lab
70
Pemrograman AVR
Citra Lab
71
Pemrograman AVR
Citra Lab
72
Pemrograman AVR
Citra Lab
73
Pemrograman AVR
BAB 9
CONTOH PROGRAM
SEDERHANA
Citra Lab
74
Pemrograman AVR
MIKROKONTROLER AT90S2313
9.1 Antarmuka LCD dan Keypad 4x4
Contoh Program ini merupakan program sederhana yang mengaplikasikan
AT90S2313 sebagai pengendali LCD 2x16 karakter dan keypad 4x4. Program ini
diambil dari Internet.
Pemrograman AVR
.def
.def
monads=R22
decades=R23
;* * * * * Other equates
.equ
lcdrs =PD6
; LCD rs pin connected to PD6
.equ
lcdrw =PD5
; LCD r/w pin connected to PD5
.equ
lcde =PD4
; LCD e pin connected to PD4
.equ
line =0x80
;
.equ
line =0xC0
;
.equ
col1 =0b11101111 ;
.equ
col2 =0b11011111 ;
.equ
col3 =0b10111111 ;
.equ
col4 =0b01111111 ;
;
Main program entry point on reset
reset:
out
rcall
ldi
7outputs
out
ldi
out
rcall
longdelay
temp, 0b11110000
PB4,
5,
6,
DDRB,temp
temp, 0b00001111 ; enable internal pull-ups on PB0-PB4
PORTB, temp
lcdinit
Citra Lab
76
Pemrograman AVR
rjmp
ldi
rjmp
key4:
rjmp
ldi
rjmp
key4
monades, $33
disp_no_of_key
sbic PINB, PB3
key4
monades, $34
disp_no_of_key
key5:
out
rcall
sbic
rjmp
ldi
rjmp
ldi
temp, col2
PORTB, temp
delay
PINB, PB0
key6
monades, $35
disp_no_of_key
key6:
rjmp
ldi
rjmp
key7:
rjmp
ldi
rjmp
key8:
rjmp
ldi
rjmp
key9:
out
rcall
sbic
rjmp
ldi
rjmp
ldi
temp, col3
PORTB, temp
delay
PINB, PB0
key7
monades, $39
disp_no_of_key
key10:
rjmp
ldi
ldi
rjmp
key11:
rjmp
ldi
ldi
rjmp
key12:
rjmp
ldi
ldi
rjmp
key13:
ldi
temp,col4
out
PORTB, temp
rcall delay
Citra Lab
77
Pemrograman AVR
sbic
rjmp
ldi
ldi
rjmp
key14:
rjmp
ldi
ldi
rjmp
PINB, PB0
key14
monades, $33
decades, $31
disp_no_of_key
sbic PINB, PB1
key15
monades, $34
decades, $31
disp_no_of_key
key15:
rjmp
ldi
ldi
rjmp
key16:
rjmp
ldi
ldi
rjmp
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; Here is typed the message3, message4, decades and monads to LCD
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
disp_no_of_key:
rcall lcdclr
; Clear the LCD
ldi
wreg, line1
; Set address to line 1
rcall lcdcmd
ldi
ZH,High(2*message3);
ldi
ZL, Low(2*message3);
rcall loadbyte
ldi
wreg, line2
; Set address to line 2
rcall lcdcmd
ldi
ZH,High(2*message4);
ldi
ZL, Low(2*message4);
rcall loadbyte
mov
wreg, decades
rcall lcdput
mov
wreg, monades
rcall lcdput
rcall longdelay
; Wait some time
rjmp again
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
;
Clear entire LCD and delay for a bit
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
lcdclr:
ldi
wreg,1
; Clear LCD command
rcall lcdcmd
ldi
timeout,256 ; Delay 15 ms for clear command
rcall delay
ret
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
;
Initialize LCD module
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
lcdinit:
ldi
wreg, 0
Citra Lab
78
Pemrograman AVR
out
ldi
out
ldi
delay
ldi
out
sbi
cbi
ldi
rcall
ldi
out
sbi
cbi
ldi
rcall
ldi
out
sbi
cbi
ldi
out
sbi
cbi
ldi
out
PORTD, wreg
wreg, 0xff
DDRD, wreg
timeout,256
wreg, 3
PORTD, wreg
PORTD, lcde
PORTD, lcde
timeout, 65
delay
wreg, 3
PORTD, wreg
PORTD, lcde
PORTD, lcde
timeout, 2
delay
wreg, 3
PORTD, wreg
PORTD, lcde
PORTD, lcde
wreg, 2
PORTD, wreg
PORTD, lcde
PORTD, lcde
wreg, 0b11110000
DDRD, wreg
; Function set
wreg, 0b00100000
lcdcmd
wreg, 0b00001100
lcdcmd
wreg, 0b00000110
lcdcmd
Pemrograman AVR
out
mov
mov
swap
anto
out
sbi
cbi
mov
anto
out
sbi
cbi
ldi
out
ret
DDRD, wreg
wreg, test
test, wreg
wreg
wreg, 0x0F
PORTD, wreg
PORTD, lcde
PORTD, lcde
wreg, test
wreg, 0x0F
PORTD, wreg
PORTD, lcde
PORTD, lcde
wreg, 0xF0
DDRD, wreg
;
;
Pemrograman AVR
loadbyte:
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
lpm
tst
breq
mov
wreg, r0
rcall lcdput
adiw
rjmp
return:
;= = = =
;
; If so, quit
; Echo received char
ZL, 1
; Increase Z registers
loadbyte
ret
; return
= = = = = = = = = = = = = = = = = = = = = = = = = = =
message1:
.bd Press any key, 0
message2:
.bd please, 0
message3:
.bd You pressed, 0
message4:
.bd key, 0
.exit
Pemrograman AVR
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
rjmp
1,led2on
rx,$44
1,led3on
rx,$45
1,led4on
rx,$46
1,led5on
rx,$47
1,led6on
rx,$48
1,led7on
rx,$49
1,ledonall
off
led0on:
sbi
portb,0
nop
nop
rjmp start
led1on:
sbi
portb,1
nop
nop
rjmp start
led2on:
sbi
portb,2
nop
nop
rjmp start
led3on:
sbi
portb,3
nop
nop
rjmp start
led4on:
sbi
portb,4
nop
nop
rjmp start
led5on:
sbi
portb,5
nop
nop
rjmp start
led6on:
sbi
portb,6
nop
nop
rjmp start
Citra Lab
82
Pemrograman AVR
led7on:
sbi
portb,7
nop
nop
rjmp start
ledonall:
ldi reg1,$FF
out
portb,reg1
nop
nop
rjmp start
off:
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
cpi
brbs
rjmp
rx,$61
1,led0off
rx,$62
1,led1off
rx,$63
1,led2off
rx,$64
1,led3off
rx,$65
1,led4off
rx,$66
1,led5off
rx,$67
1,led6off
rx,$68
1,led7off
rx,$69
1,ledoffall
start
led0off:
cbi
portb,0
nop
nop
rjmp start
led1off:
cbi
portb,1
nop
nop
rjmp start
led2off:
cbi
portb,2
nop
nop
rjmp start
led3off:
cbi
portb,3
Citra Lab
83
Pemrograman AVR
nop
nop
rjmp start
led4off:
cbi
portb,4
nop
nop
rjmp start
led5off:
cbi
portb,5
nop
nop
rjmp start
led6off:
cbi
portb,6
nop
nop
rjmp start
led7off:
cbi
portb,7
nop
nop
rjmp start
ledoffall:
ldi reg1,$00
out
portb,reg1
nop
nop
rjmp start
LAMPIRAN
DAFTAR REGISTER PENTING AT90S2313
Address
(HEX)
Nama
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
$3F ($5F)
SREG
$3D ($5D)
SPL
SP7
SP6
SP5
SP4
SP3
SP2
SP1
SP0
$3B ($5B)
GIMSK
INT1
INT0
$3A ($5A)
GIFR
INTF1
INTF0
$39 ($59)
TIMSK
TOIE1
OCIE1A
TICIE1
TOIE0
$38 ($58)
TIFR
TIV1
OCF1A
ICF1
TOV0
$35 ($55)
MCUCR
SE
SM
ISC11
ISC10
ISC01
ISC00
$33 ($53)
TCCR0
CS02
CS01
CS00
$32 ($52)
TCNT0
$2F ($4F)
TCCR1A
COM1A1
COM1A0
PWM11
PWM10
$2E ($4E)
TCCR1B
ICNC1
ICES1
CTC1
CS12
CS11
CS10
$2D ($4D)
TCNT1H
$2C ($4C)
TCNT1L
$2B ($4B)
OCR1AH
$2A ($4A)
OCR1AL
$25 ($45)
ICRIH
Timer/Counter (8-bits)
Citra Lab
84
Pemrograman AVR
$24 ($44)
ICRIL
$21 ($41)
WDTCR
$1E ($3E)
EEAR
$1D ($3D)
EEDR
$1C ($3C)
EECR
$18 ($38)
PORTB
$17 ($37)
DDRB
DDB7
DDB6
DDB5
DDB4
DDB3
DDB2
DDB1
DDB0
$16 ($36)
PINB
PINB7
PINB6
PINB5
PINB4
PINB3
PINB2
PINB1
PINB0
$12 ($32)
PORTD
PORTD6
PORTD5
PORTD4
PORTD3
PORTD2
PORTD1
PORTD0
$11 ($31)
DDRD
DDD6
DDD5
DDD4
DDD3
DDD2
DDD1
DDD0
$10 ($30)
PIND
PIN6
PIN5
PIN4
PIN3
PIN2
PIN1
PIN0
$0C ($2C)
UDR
$0B ($2B)
USR
RXC
TXC
UDRE
FE
OR
$0A ($2A)
UCR
RXCIE
TXCIE
UDRIE
RXEN
TXEN
CHR9
RXB8
TXB8
$09 ($29)
UBRR
$08 ($28)
ACSR
ACIC
ACIS1
ACIS0
WDTOE
WDE
WDP2
WDP1
WDP0
EEMWE
EEWE
EERE
PORTB7
PORTB6
PORTB5
PORTB4
PORTB3
PORTB2
PORTB1
PORTB0
ACO
ACI
Citra Lab
85
ACIE