Anda di halaman 1dari 85

Pemrograman AVR

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)

Gambar 2.1 Pin-pin Pada AT90S2313


Deskripsi Pin
VCC
GND

Power supply.
Ground.

Citra Lab
3

Pemrograman AVR

Port B (PB7 . .Pb0)

Port D (PD6 . .PD0)

RESET
XTA11
XTAL2

port B merupakan Port I/O 8-bit bi-direktional. Pin-pin pada


port ini dapat diberi resistor pull-up internal secara individual.
PB0 dan PBI juga dapat digunakan untuk melayani input
sebagai komparator analog. Buffer port B dapat mencatu arus
hingga 20 mA dan dapat secara langsung men-drive LED.
Port D memiliki tujuh buah pin I/O bi directional, yakni
PD6 . .PD0. Seperti halnya port B, pin-pin pada port ini juga
mampu men-drive LED karena dapat mencatu arus hingga 20
mA.
Reset input. Kondisi logika rendah 0 lebih dari 50 ns pada
pin ini akan membuat mikrokontroler masuk ke dalam
kondisi reset.
Input bagi inverting oscillator amplifier dan input bagi clock
internal.
Output inverting oscillator amplifier.

2.3 Arsitektur AT90S2313


Mikrokontroler AT90S2313 merupakan mikrokontroler CMOS dengan daya
rendah yang memiliki arsitektur AVR RISC 8-bit. Arsitektur ini mendukung
kemampuan untuk melaksanakan eksekusi instruksi hanya dalam satu siklus clock
osilator. Hal ini sangat cocok bagi Anda yang menginginkan suatu disain system
aplikasi yang cepat dan hemat daya. AVR ini memiliki fitur untuk menghemat
konsumsi daya, yaitu dengan menggunakan mode sleep. Mode sleep pada
mikrokontroler AVR ada dua macam, yaitu mode idle dan mode power-down.

Gambar 2.2 Blok Diagram AT90S2313


Mikrokontroler AVR memiliki model arsitektur Harvard, di mana memori dan
bus untuk program dan data dipisahkan. Dalam arsitektur AVR, seluruh 32 register
umum yang ada terhubung langsung ke ALU prosesor. Hal inilah yang membuat AVR
begitu cepat dalam mengeksekusi instruksi. Dalam satu siklus clock terdapat dua
register independent yang dapat diakses oleh satu instruksi. Teknik yang digunakan
adalah fect during execution atau memegang sambil mengerjakan, dilakukan eksekusi
Citra Lab
4

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

Data Bue 8-bit


Status and
Test
GPR
32x8
GPR

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

Gambar 2.3 Arsitektur AT90S2313


Dari 32 Register yang ada, terdapat enam buah register yang dapat digunakan
untuk pengamatan tidak langsung 16-bit sebagai register pointer. Register tersebut
memiliki nama khusus, yaitu X, Y, dan Z. Masing-masing terdiri dari sepasang
register. Register-register khusus tersebut adalah R26:R27 (register X),
R28:R29(register Y), dan R30:R31 (register Z). Selain ketiga pasangan register
tersebut, sebenarnya terdapat satu pasang register lagi yang dapat anda gunakan
bersama untuk pengolahan data 16-bit, yaitu R24:R25. Pasangan register ini tidak
memiliki nama khusus sebagaiman ketiga pasangan register yang disebutkan di muka.

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

Gambar 2.4 Peta memori AT90S2313


Dalam organisasi memori AVR, 32 register keperluan umum (GPR)
menempati space data pada alamat terbawah, yaitu $00 sampai $1F. Sedangkan
register-register khusus untuk penanganan I/O dan control terhadap mikrokontroler,
menempati 64 alamat berikutnya, yaitu mulai dari $20 hingga $5F. Register-register
ini merupakan register-register yang khusus digunakan untuk melakukan pengaturan
fungsi terhadap berbagai perihal mikrokontroler semacam control register,
timer/counter, fungsi-fungsi I/O, dan sebagainya. Kelompok register ini dinamakan
register I/O. Alamat berikutnya digunakan untuk SRAM 128 byte, yaitu pada lokasi
$60 sampai dengan $DF. Gambaran peta memori untuk AVR AT90S2313 ditunjukan
oleh Gambar 2.4.
2.3.2 General Purpose Register (GPR)
Seluruh instruksi operasi register dalam AVR memiliki akses langsung ke
semua register. Kecuali untuk lima instruksi aritmatika logika yang mengoperasikan
register dengan konstanta (SBCI, SUBI, CPI, ANDI, dan ORI) dan LDI yang
mengoperasikan pemuatan data konstan imediet. Instruksi-instruksi tersebut
dioperasikan hanya pada separo lokasi register terakhir GPR (R16 sampai R31).
Instruksi untuk operasi umum seperti SBC, SUB, CP, AND, OR dan operasi lainnya
yang mengoperasikan dua register atau satu register dapat melakukan akses terhadap
seluruh register.

R0

$00

R1

Citra Lab

R15

$0F

R16

$1F

R26

$1A register X byte bawah

R27

$1B register X byte atas

R28
R29

R30
R31

$1F register X byte atas

Pemrograman AVR

Gambar 2.5 General Purpose Register AT90S2313

2.4 I/O Port


Seperti telah disampaikan sebelumnya, AT90S2313 memiliki dua buah port
I/O yaitu PortB dan PortD. Berikut ini penjelasan singkat mengenai kedua port I/O
tersebut.
2.4.1 PORT B
Port B merupakan port I/O 8-bit bi-directional yang masing-masing pinnya
dapat dikonfigurasi secara individual. Masing-masing pin dalam port ini juga
memiliki fasilitas berupa resistor pull-up internal yang berguna untuk memberikan
kondisi yang tentu (tidak ngambang) pada saat dikonfigurasi sebagai input, tanpa
harus memberikan pull-up eksternal. Untuk mendukung penggunaan port ini, terdapat
tiga buah alamat memori yang khususu digunakan untuk menangani fungsi port B.
Alamat memori tersebut adalah:
Data register (PORTB), berlokasi pada $18 ($38). Register ini bisa ditulis/baca.
$18
($38)
Read
white

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.

PORTD (Data Direction), berlokasi pada $12($32).


Bit 7
$12
($32)
Read
white

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

DDRD (Data Direction Register port D) berlokasi pada $11($31).

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

Tabel 2.2 Fungsi Alternatif Port D


Fungsi Alternatif
RXD (Receive data input for the UART)
TXD (Transmit data output for the UART)
INTO (External interrupt 0 input)
INT1 (External interrupt 1 input)
T0 (Timer/Counter0 external input)
T1 (Timer/Counter1 external input)
ICP (Timer/Counter1 Input Capture Pin)

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

Gambar 2.6 SRAM Dalam Organisasi Memori AT90S2313


Memori data AVR AT90S2313 terdiri dari 224 lokasi yang digunakan untuk
alamat Register file (GPR), I/O register, dan SRAM. Pengamatan memori data
mencakup lima mode pengalamatan, yaitu mode langsung, mode tak langsung, mode
tak langsung dengan penggeseran, mode tak langsung dengan pre-decremenr, dan
mode tak langsung dengan post-increment. Seluruh register GPR dapat diakses
menggunakan mode-mode pengalamatan tersebut.

2.6 Register I/O


Register I/O seperti telah ditunjukkan dalam gambar 2.6, menempapti lokasi
pada ruang memori data $20 hingga $5F. Register I/O merupakan register yang sangat
pencting karena register ini berfungsi untuk mengatur dan melakukan control berbagi
peripheral mikrokontroler. Definisi masing-masing register I/O dapat anda lihat pada
daftar berikut.

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

Tabel 2.3 Register I/O


Function
Status Register
Stack Pointer Low
General interrupt Mask register
General interrupt Flag Register
Timer/Counter interrupt Mask Register
Timer/Counter interrupt Flag Register
MCU general Control Register
Timer/Counter 0 Control Register
Timer/Counter 0 (8-bit)
Timer/Counter 1 Control Register A

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

Timer/Counter 1 Control Register B


Timer/Counter 1 High Byte
Timer/Counter 1 Low Byte
Output Compare Register 1 High Byte
Output Compare Register 1 Low Byte
T/C 1 Input Capture Register High Byte
T/C 1 Input Capture Register Low Byte
Watchdog Timer Control Register
EEPROM Address Register
EEPROM Data Register
EEPROM Control Register
Data Register, Port B
Data Direction Register, Port B
Input Pins, Port D
Data Register, Port D
Data Direction Register, Port D
Input Pins, Port D
UART I/O Data Register
UART Status Register
UART Control Register
UART Baud Rate Register
Analog comparator Control and Status Register

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

Bit I: Global Interrupt Enable

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.

Bit5 H: Half Carry Flag

Bit4 S: Stop Bit

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.

Bit2 N: Negatif Flag

Bila suatu operasi menghasilkan bilangan negative, maka flag-N akan diset.

Bit1 Z: Zero Flag

Bit ini akan diset bila hasil operasi yang diperoleh adalah nol.

Bit C: Carry Flag

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.

2.8 Peripheral AT90S2313


Citra Lab
12

Pemrograman AVR

Peripheral utama pada At90S2313 meli puti Timer/Counter, WatchDog Timer,


EEPROM, Analog Comparator, dan UART. Untuk mengkonfigurasi fungsi peripheraperipheral di atas, maka hal yang harus Anda lakukan adalah mengatur setting bit
pada register control yang bersangkutan.
2.8.1 Timer/Counter
AT90S2313 memiliki dua modul Timer/Counter, yaitu Timer/Counter0 (8-bit)
yang dinamakan TCNT0 dan Timer/Counter1 (16-bit) yang dinamakan TCNT1L dan
TCNT1H. Untuk mengatur kerja Timer/Counter Anda perlu melakukan setting
terhadap bit-bit dalam register I/O.
TCNT0 (Timer/Counter0 8-bit)
Register-register yang berhubungan dengan penggunaan Timer/Counter0
adalah TCCR0 (Timer/Counter Register), TIFR (Timer/Counter0 Interrupt Flag
Register), dan TIMSK (Timer/Counter0 interrupt Mask Register). Sumber clock untuk
Timer/Counter0 dapat berasal dari clock CK, clock CK yang diprescaler, atau clock
dari pin eksternal. Clock eksternal dapat digunakan sebagai sumber clock bagi
TCNT0 melalui pin PD4/T0. Sinyal kendali untuk Timer/Counter0 diatur
menggunakan register TCCR0. Hanya tiga bit dalam TCCR0 yang digunakan, yaitu
CS00 (bit0), CS01(bit1), dan CS02(bit2). Bit ini digunakan untuk menentukan nilai
prescaler dan sumber clock yang digunakan.
Bit 7
$3 ($53)
Read
white

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

Untuk fungsi input Capture, Timer/Counter1 menyediakan capture dari isi


Timer/Counter1 ke dalam register ICP. Pengaturan capture dilakukan menggunakan
register control TCCR1B.
2.8.2 WathDog Timer
WDT merupakan sebuah timer dengan clock terpisah dari osilator chip dan
bekerja pada frekuansi clock 1 MHz. Saat WDT mencapai nilai maksimal dan terjadi
overflow, maka WDT akan mereset mikrokontroler. Clock untuk WDT dapat diatur
menggunakan prescaler, sehingga waktu yang diperlukan untuk mencapai overflow
juga dapat dikendalikan. Anda sebagai programmer harus menempatkan instruksi
WDT secara berkala dari waktu ke waktu untuk mencegah WDT melakukan reset
terhadap mikrokontroler. WDT dapat anda disable dengan membuat bit WDTOE
berlogika 1 dan bit WDE berlogika 0 pada register WDTCR.
Bit 7
$21
($41)
Read
white

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

EEDR (EEPROM Data Register)


Bit 7
$1D
($3D)
Read
white

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

EECR (EEPROM Control Register)


Bit 7

$1C
($3C)
Read
white

DDRB

EEAR merupakan register yang digunakan untuk menempatkan alamat


memori EEPROM yang akan diakses. Perhatikan bahwa bit7 dari register ini tidak
digunakan dan akan menghasilkan 0 bila dibaca. Sedangkan EEDR merupakan
register untuk menempatkan data sementara pada pengaksesan EEPROM. Pada
operasi penulisan EEPROM, register ini berisi data yang akan dituliskan pada alamat
EEPROM yang ditunjuk dalam register EEAR, sedangkan pada operasi pembaca
EEPROM, register ini berisi data yang dibaca dari alamat EEPROM yang ditunjuk
dalam EEAR.
Register EECR merupakan register yang mengontrol proses akses terhadap
EEPROM. Bit yang digunakan dalam register ini adalah bit EEMWE, EEWE, dan
EERE yang masing-masing menempati bit 0, bit1, dan bit 2 dalam register tersebut.

2.8.4 Analog Comparator


VCC
ACD

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

Gambar 2.7 Diagram Blok Analog Comparator


Komparator analog dalam AVR akan membandingkan dua nilai pada input
positif (AIN0) dan input negative (AIN1). Apabila tegangan pada AIN0 lebih tinggi
dibandingkan tegangan pada AIN1, maka keluaran komparator analog pada
AT90S2313 diatur menggunakan register ACSR (Analog Comparator Control and
Status Register). Format ACSR adalah sebagai berikut.

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

Bit7 ACD: Analog Comparator Disabel

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.

Bit6 Tidak digunakan

Bit ini tidak digunakan dalam pengaturan komparator analog.

Bit5 ACO: Analog Comparator Output

Bit ini terhubung langsung dengan keluaran komparator.

Bit4 ACI: Analog Comparator Interrupt Flag

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.

Bit3 ACIE: Analog Comparator Interrup Enable.

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.

Bit2 ACIC: Analog Comparator input Capture Enable

2.8.5 UART

Citra Lab
16

Pemrograman AVR

AT90S2313 memiliki fitur untuk melakukan komunikasi menggunakan UART


(Universal Asyncronous Receiver and Transmiter). Fasilitas komunikasi ini sangat
bermanfaat agar system aplikasi AVR yang anda buat dapat berkomunikasi dengan
system lain, misalnya PC atau jaringan system kendali lain.
Pengiriman Data
Pengiriman data menggunakan UART akan melibatkan pengoperasian 4 buah
register UART, yaitu UDR, UCR, USR, dan UBRR.

Gambar 2.8 Diagram Blok UART Transmitter


UDR (UART I/O Data Register) merupakan register yang berguna untuk
menampung data sementara dalam proses pengiriman data. Data yang akan
dikirimkan melalui post UART, harus terlebih dahulu ditempatkan dalam register ini,
sebelum proses pengiriman data UART dapat dilakukan.
Bila register TX 10(11)-bit kosong (semua berlogika 0), maka bit UDRE
(UART Data Register Empty) pada register status USR akan diset (1). Bila bit ini
diset, berarti UART siap untuk menerima karakter berikutnya. Pada saat data
ditransfer dari UDR ke shift register, bit0 shift register (star bit) akan di-clear. Dan
bit9 atau bit10 akan diset (stop bit). Pengaturan lebar data karakter dapat diatur
menggunakan bit CHR( pada register control UCR. Bila bit CHR9 diset, berarti
pengiriman dan menggunakan lebar data 9 bit. Bila ini dipilih, maka bit TXB8 pada
UCR akan dikirim ke bit9 dalam register geser transmit. Operasi pengiriman data
menggunakan UART dilakukan melalui dengan pengiriman start bit, digeser keluar,
dan diikuti data mulai dari LSB. Pengiriman ini dilakukan dengan kecepatan sesuai
dengan baud rate yang dipilih. Ketika stop bit telah dikeluarkan, shift register
transmitter akan diisi dengan data baru berikutnya yang telah dituliskan pada UDR
selama proses pengiriman berlangsung. Pada kondisi ini, bit UDRE akan tetap diset
hingga ada penulisan data baru pada register UDR. Bila tidak ada penulisan dat baru,
maka bit TXC akan diset.
Untuk mengaktifkan fungsi pengiriman data menggunakan UART, bit TXEN
pada register control UCR harus diset. Hal ini akan menghubungkan UART
transmitter dengan pin PD1 dan memaksa pin ini sebagai output, tanpa
Citra Lab
17

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

Baud Rate generator

/16
Store UDR

10(11)-Bit rx
Shift Register

RX
C
TX
CUDR
FE
E

Data Recovery
Logic

UART Status Register


RX
C

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

Gambar 2.9 Diagram Blok UART Receiver


Untuk mengaktifkan fungsi penerima UART, bit RXEN harus diset. Seperti
halnya pada pengiriman, Bila bit ini di-clear, maka pin PD0 akan digunakan sebagai
pin I/O. Namun, bila bit diset, maka pin PD0 akan dipaksa berlaku sebagai input,
tanpa mempedulikan pengaturan bit DDD0 dalam register DDRD. Selain itu,
PORTD0 tetap dapat digunakan untuk mengendalikan resistor pull-up pada pin
tersebut.
Bila bit CHR9 pada UCR diset, maka data pengiriman data penerima dan
pengiriman menggunakan panjang data 9-bit. Bit ke-9 yang dikirimkan adalah bit
TXB8 dalam register UCR. Sedangkan pada proses penerimaan, bit ke-9 adalah bit
RXB8 dalam register UCR.
Pengendalain UART
Pengendalian UART dilakukan menggunakan register UCR sedangkan status
UART terdapat pada register USR. Register UDR merupakan register I/O untuk
komunikasi UART yang berhubungan dengan data yang akan dikirim atau data yang
telah diterima.
Citra Lab
18

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

Bit7 RXC: UART Receiver Complete

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.

Bit6 TXC: UART Transmite Complete

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.

Bit5 UDRE: UART Data Register Empty

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.

Bit4 FE: Framing Error

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.

Bit3 OR: Over Run

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.

Bit2 0: Tidak digunakan

UCR (UART Control Register)


Citra Lab
19

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

Bit7 RXCIE: RX Complete Interrupt Enable

Bila bit ini global interrupt diset, maka terjadinya pengesetan pada bit RXC dalam
USR akan mengakibatkan rutin interupsi complete receiver dieksekusi.

Bit6 TXCIE: TX Complete Interrupt Enable

Seperti halnya RXCIE, pengesetan bit ini akan mengijinkan terjadinya interupsi
complete transmit akibat pengesetan bit TXC, bila bit global interrupt dienable.

Bit4 RXEN: Receiver Enable

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.

Bit3 TXEN: Transmitter Enable

Bit ini diset untuk mengenable UART Transmitter.

Bit2 CHR9: 9 Bit Characters

Ketika bit ini diset, berarti karakter yang dikirim atau diterima memiliki panjang 9-bit
ditambah start dan stop bit.

Bit1 RXB8: Receiver Data Bit 8

Ketika bit CHR9 diset, bit ini akan menjadi bit9 karakter yang diterima.

Bit0 TXB8: Transmit Data Bit 8

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.

HEX. Proses asembling ini dilakukan dengan menggunakan software assembler.


Sedangkan yang dimaksud dengan proses debugging adalah proses mencari error
yang mingkin terjadi pada program yang anda buat pada saat program dijalankan.
Meskipun pada proses assembling dinyatakan tidak terdapat error, namun pada
proses debugging bisa saja ditemukan bug. Bug yang dimaksud adalah kondisikondisi yang menyebabkan program tidak berjalan sebagai mana mestinya. Salah
satu contoh bug adalah stack overflow, di man dalam program anda menuliskan
instruksi pemanggilan suatu subrutin hingga beberapa tingkat dan melebihi stack
yang dimiliki oleh mikrokontroler target.
Programming/Downloading/Burning: merupakan proses penulisan kode mesin
dari hasil assembling (berupa file berekstensi HEX) ke dalam memori program
flash mikrokontroler AVR. Proses ini dilakukan dengan menggunakan perangkat
programmer (hardware) beserta software programmernya, atau dengan
menggunakan antarmuka ISP beserta software ISPnya.

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.

3.1 Software Asembler


Dalam prakteknya, banyak software asembler yang sekaligus menyediakan
editor teks atau bahkan dapat untuk downloading dan simulasi. Anda dapat memilih
tool-tool pemrograman AVR yang Anda sukai untuk anda gunakan. Beberapa
software assembler yang dapat anda gunakan antaa lain: gavrasm.exe, WAVRASM
dan AVR Studio. Khusus untuk AVR Studio, lebih lanjut akan dijelaskan pada Bab 6.
Secara umum,, fungsi suatu software assembler adalah menerjemahkan
program assembler yang anda tuliskan dalam editor teks menjadi kode dalam bahasa
mesin yang bisa diartikan oleh mikrokontroler. Kode ini dikemas dalam suatu file
HEX.
Misalkan untuk program assembler (file ASM) berikut ini.
; Contoh Program sederhana
;"Pencacah biner8-bit pada portB mikrokontroler AT90S2313"
; nilai awal dan nilai akhir pencacah diset melalui
; variable: startnum dan ednum
;
; oleh; Sigit Haryanto
. nolist ;list file untuk include file tidak perlu ditampilkan
. includeC:\Atmel\AVRTools\AVrAssembler\Appnotes\2313def.inc
. list
. equ startnum=0
. equ endnum=10
.
.
.
.

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

Oleh software assembler, program di atas akan di asembli/kompilasi menghasilkan


file HEX berikut ini.
:020000020000FC
:100000004FEF47BB0E01AE008BB039501113FCCF9C
:1000100008BBF8CF3FEF2FEF2A95FIF73A95D9F7C4
:02002000089541
:00000001FF

Untuk mengetahui bagaimana setiap instruksi dan operan tersebut dikodekan


oleh assembler, Anda dapat melihatnya dari file LIST yang dibangkitkan selama
proses asembli berlangsung. Flie ini juga akan membantu Anda untuk memperbaiki
kesalahan yang mungkin Anda lakukan saat penulisan program.
AVRASM ver. 1.57 D:\UjiAVR\Belajar\test1.asm Thu Aug 16 21:49:34 2007
; Contoh Program sederhana
; Pencacah biner 8-bit pada portB mikrokontroler AT90S2313
; nilai awal dan nilai akhir pencacah diset melalui
; variable : startnum dan endnum
;
; oleh Sigit Haryanto
. nolist

; list file tidak perlu ditampilkan

. 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

Subtract Two Registers


Rd<--Rd-Rr
Subtract Constant from
Register
Rd<--Rd-K
Subtract Immediate from
Word
Rd+1:Rd<--Rd+1:Rd+K
Subtract With Carry Two
Registers
Rd<--Rd-Rr-C
Subtract With Carry
Constant from Register
Rd<--Rd-K-C
Logical AND Register
Rd<--Rd AND Rr
Logical AND Register
and Constant
Rd<--Rd AND K
Logical OR Register
Rd<--Rd OR Rr
Logical OR Register and
Constant
Rd<--Rd OR K
Exclusive OR Registers
Rd<--Rd XOR Rr
One's Complement
Rd<--$FF-Rd
Two's Complement
Rd<--$00-Rd
Set Bit(s) in Register
Rd<--Rd OR K
Deskripsi
Operasi
Instruksi Aritmatika dan Logika
Clear Bit(s) in Register
Rd<--Rd AND($FF-K)
Increment
Rd<--Rd+1
Decrement
Rd<--Rd-1
Test for Zero or Minus
Rd<--Rd AND Rd
Clear Register
Rd<--Rd XOR Rd
Set Register
Rd<--$FF
Instruksi Percabangan
Relative Jump
PC<--PC+k+1
Indirect Jump to (Z)
PC<--Z
Jump
PC<--k
Relative Subroutine Call PC<--PC+k+1
Indirect Jump to (Z)
PC<--Z
Call subrutin
PC<--k
Subrutine return
PC<--Stack
Interrupt Routine
PC<--Stack
Compare, Skip if Equal
if(Rd=Rr)PC<--PC+2 or 3
Compare
Rd-Rr
Compare With Carry
Rd-Rr-C
Compare Register With
Immediate
Rd-K
Skip if Bit in Register
Cleared
if(Rr(b)=0)PC<--PC+2 or 3
Skip if Bit in Register is
Set
if(Rr(b)=1)PC<--PC+2 or 3
Skip if Bit in I/O register
if(I/O(P,b)=0)PC<--PC+2 0r
Cleared
3
if(I/O(P,b)=1)PC<--PC+2 0r
Skip if Bit in I/O is Set
3
if(SREG(s)=1)thenPC<Branch if status Flag Set PC+k+1
Branch if status Flag
if(SREG(s)=0)thenPC<Clear
PC+k+1
Branch if Equal
if(Z=1)then PC<--+k+1

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

Branch if Not Equal


if(Z=0)then PC<--+k+1
Branch if Carry Set
if(C=1)then PC<--+k+1
Branch if Carry Cleared
if(C=0)then PC<--+k+1
Branch if Some or
Higher
if(C=0)then PC<--+k+1
Branch if Lower
if(C=1)then PC<--+k+1
Branch if Minus
if(N=1)then PC<--+k+1
Branch if Plus
if(N=0)then PC<--+k+1
Deskripsi
Operasi
Instruksi Aritmatika dan Logika
Branch if Greater or
if(N xor V=0)then PC<-Equal, Signeg
PC+k+1
Branch if Less Than
if(N xor V=1)then PC<-Zero, Signed
PC+k+1
Branch if Half-carry Flag
Set
if(H=1)then PC<--PC+k+1
Branch if Half-carry Flag
Cleared
if(H=0)then PC<--PC+k+1
Branch if T-Flag Set
if(T=1)then PC<--PC+k+1
Branch if T-Flag Cleared if(T=0)then PC<--PC+k+2
Branch if Overflow Flag
is Set
if(V=1)then PC<--PC+k+1
Branch if Overflow Flag
is Cleared
if(V=0)then PC<--PC+k+1
Branch if Interrupt
Enable
if(I=1)then PC<--PC+k+1
Branch if Interrupt
Disable
if(I=0)then PC<--PC+k+1
Instruksi transef Data
Move between Register
Rd<--Rr
Load Immediate
Rd<--K
Load Indirect
Rd<--(X)
Load Indirect and PostInc
Rd<--(X),X<--X+1
Load Indirect and PreDec
X<--X-1,Rd<--(X)
Load Indirect
Rd<--(Y)
Load Indirect and PostInc
Rd<--(Y), Y<--Y+1
Load Indirect and PreDec
Y<--Y-1, Rd<--(Y)
Load Indirect with
Displacement
Rd<--(Y+q)
Load Indirect
Rd<--(Z)
Load Indirect and PostInc
Rd<--(Z), Z<--(Z)
Load Indirect and PreDec
Z<--Z-1, Rd<--(Z)
Load Indirect with
Displacement
Rd<--(Z+q)
Load Direct from SRAM
Rd<--(k)
Store Indirect
(X)<--Rr
Store Indirect and PostInc
(X)<--Rr, X<--X+1
Store Indirect and PreDec
X<--X-1, (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

Set two's Complement


Overflow
Clear Two's
Complement Overflow
Set T in SREG
Clear T in SREG
Set Half-carry Flag in
SREG
Clear Half-carry Flag in
SREG
No Operation
Sleep
WatchDog Reset

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.

5.1 Bahasa Asembler dan C untuk


Mikrokontroler
Program sumber (source program) untuk mikrokontroler dapat dituliskan
dalam berbagai bahasa, antara lain bahasa asembler dan C. Ada juga program yang
dituliskan menggunakan bahasa basic untuk mikrokontroler, source program harus
dikompilasi/diasembli menggunakan program yang sesuai. Penggunaan bahasa sangat
tergantung pada kepentingan dan kemampuan suatu system aplikasi mikrokontroler.
Setiap bahasa memiliki kelebihan dan kekurangannya masing-masing. Bahasa
assembler dituliskan dengan detail setiap langkah yang dijalankan, sehingga
penulisanya relative lebih panjang. Pemrogram harus mengetahui benar proses yang
terjadi dalam program tersebut. Namun demikian, program assembler sangat cocok
dalam hal efisiensi penggunaan memori program. Di sini lain, bahasa C memiliki
Citra Lab
29

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]

5.3 Pengarah Asembler


Dalam pennulisan program assembler, dikenal adanya sejumlah pengarah
assembler (directive). Pengarah assembler tidak secara langsung diterjemahkan dalam
opcode pada waktu asembli atau kompilasi. Pengarah digunakan untuk mengatur
penempatan program ke dalam memori, mendefinisikan macro, inisialisasi memori,
dan sebagainya. Pengarah assembler AVR dituliskan dengan didahului tanda titik(.),
sehingga disebut juga perintah bertitik. Berikut ini pengarah assembler yang
digunakan dalam pemrograman AVR.
Pengarah
BYTE
CSEG
DB
DEF
DEVICE
DSEG

Tabel 5.1 Daftar Pengarah Asembler


Deskripsi
Byte untuk variable
Segmen kode
Mendefinisikanbyte konstanta
Mendefinisikan nama symbol dari register
Mendefinisikan tipe AVR
Segmen dat

Citra Lab
30

Pemrograman AVR

DW
ENDMACRO
EQU
ESEG
EXIT
INCLUDE
LIST
LISTMAC
MACRO
NOLIST
ORG
SET

Mendefinisikan word konstanta


Mengakhiri macro
Menentukan suatu symbol sama dengan ekspresi
Segmen EEPROM
Mengakhiri file
Membaca source code dari file lain
Membangkitkan file list
Ekspansi file list untuk macro
Memulai macro
Tidak membangkitkan file list
Menentukan awal program
Menentukan suatu symbol sebagai ekspresi

Penjelasan untuk masing-masing pengarah diberikan berikut ini.


1. BYTE
Pengarah BYTE merupakan pengarah yang digunakan untuk menjaga ketersediaan
memori didalam SRAM. Agar dapat digunakan untuk menunjuk suatu lokasi memori,
pengarah BYTE harus dituliskan melalui label. Pengarah BYTE akan mengambil
sebuah parameter yaitu banyaknya byte yang akan dipertahankan. Pengarah ini hanya
dapat digunakan dalam Data Segment.
Sintak:
Label:

.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:

; Memulai data segment


.BYTE 4
;
; Memulai code segment
.DW 2
; Tulis 0x0002 dlm prog. Mem.
Mov r1,r0
; Lakukan sesuatu

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

konstanta: .DB 5, 255, 0b01000101, 0xaa


eeconstan: .DB 0xff

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

; Load 0xf0 ke register temp


; Baca SREG ke dalam register oir
; exclusive OR temp dan ior

5. DEVICE

Citra Lab
32

Pemrograman AVR

Pengarah DEVICE akan memberitahukan kepada software assembler mengenai


jenis/tipe perangkat mikrokontroler apa yang akan digunakan untuk mengeksekusi
kode program tersebut. Apabila pengarah ini anda gunakan, maka adanya suatu
instruksi yang tidak mendukung tipe mikrokontroler akan ditampilkan sebagai
peringatan (warning). Peringatan ini misalnya, apabila ukuran Code Segment atau
EEPROM Segment melebihi kapasitas mikrokontroler yang dispesifikasikan. Bila
pengarah ini tidak digunakan, maka anggap semua intruksi mendukung untuk
digunakan pada perangkat mikrokontroler tersebut.
Sintak:
.DEVICE

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

varlist: .DW 64286, 0b0101011110100011,0xffff

.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

Pengarah EXIT akan memberitahu pada software Asembler untuk menghentikan


proses asembli. Pada umumnya assembler akan berjalan hingga akhir file. Apabila
pengarah EXIT ditemukan dalam suatu file include, maka Asembler akan melanjutkan
prosesnya pada baris sesudah pengarah INCLUDE dalam file yang berisi pengarah
INCLUDE tersebut.
Contoh:
.EXIT

; keluar dari file

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

; Pembangkitan file list tidak diaktifkan


macro.inc
cons.def
; Bangkitkan file list kembali

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

; Set Program Counter dengan 10hex


;

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

operan yang dapat digunakan dalam program assembler antara lain :

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:

LOW (ekspresi) mengembalikan byte low dari sebuah ekspresi.


HIGH (ekspresi) mengembalikan byte kedua dari sebuah ekspresi.
BYTE2 (ekspresi) sama dengan HIGH.
BYTE3 (ekspresi) mengembalikan byte ketiga dari sebuah ekspresi.
BYTE4 (ekspresi) mengembalikan byte keempat dari sebuah ekspresi.
LWRD (ekspresi) menunjuk pada bit 0-15 dari sebuah ekspresi.
HWRD (ekspresi) menunjuk pada bit 16-31 dari sebuah ekspresi.
PAGE (ekspresi) menunjuk pada bit 16-21 dari sebuah ekspresi.
EXP2 (ekspresi) menunjuk 2 pangkat nilai ekspresi.
LOG2 (ekspresi) menunjuk bagian integer dari log 2 dari ekspresi.

5.4.3 Operator
Operator yang digunakan dalam pemrograman assembler AVR diberikan pada Tabel
5.2.
Tipe
Kalkulasi

Biner

+
*
/
&
|
^
~
<<
>>
<
>
==
<=

Logika

Tabel 5.2 Daftar Operator


Deskripsi

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

ldi r30, c1+c2


ldi r17, c1-c2
ldi r30, label*2
ldi r30, label/2
ldi r18, High(c1&c2)
ldi r18, Low(c1|c2)
ldi r18, Low(c1^c2)
ldi r16.~0xf0
ldi r17,1<<bitm
ldi r17,c1>>c2
ori r18,bitmask*(c1<c2)+1
ori r18,bitmask*(c1>c2)+1
andi r19,bitmask*(c1= =c2)+1
ori r18,bitmask*(c1<=c2)+1
ori r18,bitmask*(c1>=c2)+1
.SET flag=(c1!=c2)
ldi r18, Low(c1&&c2)
ldi r18, Low(c1| |c2)
ldi r1, !0xf0

5.5 Dasar-dasar Pemrograman AVR


5.5.1 Struktur Program
Bentuk umum program yang biasa digunakan adalah sebagai berikut:
Citra Lab
38

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

.DEF reg_penampung = R17


LDI

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

YH, HIGH (Adress)

1di

YL, LOW (Adress)

Pengaksesan melalui pointer dilakukan menggunakan instruksi yang dirancang


khusus. Untuk membaca, digunakan instruksi LD (LoaD), sedangkan penulisan
dilakukan dengan instruksi ST (Store).
Hanya terdapat satu instruksi akses baca untuk Memori Program yang
didefinisikan pada pasangan register Z. Instruksi tersebut bernama LPM (Load
Program Memory). Instruksi ini akan menyalin alamat byte Z dalam memori program
ke register R0. Mengingat Program memori diatur dalam word-wise (satu instruksi
pada satu alamat berisi 16-bit atau 2-byte atau 1-word) LSB menentukan byte bawah
(jika LSB = 0) atau byte atas (jika LSB = 1). Hal ini mengakibatkan alamat asli
harus dikalikan dua dan akses dibatasi untuk 15-bit atau 32kB memori program.
1di

ZH, HIGH (2*Adress)

1di

ZL, LOW (2*Adress)

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

ADIW berarti Add Immediate Word.


Komplemen instruksi ADIW adalah SBIW (SuBtract Immediate Word). ADIW dan
SBIW dapat digunakan untuk pasangan register X, Y, dan Z, dan untuk pasangan
register R24:R25 yang tidak memiliki nama tambahan dan tidak mengijinkan akses
SRAM dan lokasi Memori Program. R24:R25 merupakan pasangan memori yang
cocok untuk penanganan nilai 16-bit.
5.5.3 Membuat Tabel
Seringkali kita perlu membuat suatu tabel data untuk melakukan operasioperasi di dalam program yang kita buat. Di sini kita membahas bagaimana suatu
perintah dituliskan untuk membentuk suatu tabel menggunakan pengarah .DB dan
.DW. dengan perintah tersebut Anda dapat memasukkan daftar nilai (data)bytewise
atau wordwise.
Data bytewise ditata dalam format sepeti berikut:
.DB 123, 45, 67, 89
.DB

data teks

; data empat byte


; data karakter ASCII

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

.DW 0x6789, 0x789A, 0x89AB, 0x9ABC, 0xABCD;


Read5:
LDI ZH, HIGH (Table_1*2)

LDI ZL, LOW (Table_1*2)

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

Penggunaan cara diatas hanya pada khusus tertentu saja.


5.5.5 Mengakses SRAM
SRAM merupakan memori dalam mikrokontroler AVR yang tidak dapat
diakses langsung dari CPU. Apabila Anda ingin mengakses lokasi memori ini, anda
perlu menggunakan register sebagai media penyimpan sementara. Proses pengaksesan
SRAM jelas memerlukan waktu yang lebih lama dibanding dengan pengaksesan
register itu sendiri, karena register merupakan memori yang berada di dalam CPU.
Namun disisi lain, tipe paling rendah dari AVR saja memiliki 128 byte SRAM, ukuran
yang cukup besar disbanding dengan jumlah register yang hanya 32 buah. Pada AVR
tipe AT90S8515 ke atas, terdapat fitur tambahan yang memungkinkan kita untuk
menyambungkan dengan RAM eksternal guna memperbesar ukuran SRAM internal
yang hanya 512 byte. Dari sudut pandang assembler, pengaksesan Ram eksternal
sama persis dengan pengaksesan SRAM internal. Tidak ada perintah khusus yang
diperuntukkan dalam pengaksesan RAM eksternal.
Terdapat berbagai kemudahan yang ditawarkan apabila kita menggunakan
memori SRAM. Tidak hanya akses dengan alamat tetap yang diperbolehkan, tetapi
kita juga dapat menggunakan pointer untuk mengakses lokasi memori. Dengan
demikian, floating access terhadap beberapa lokasi dapat deprogram. Dengan cara ini,
Anda dapat membangun sebuah ring buffer untuk penyimpanan sementara suatu nilai
atau tabel kalkulasi. Hal ini ternyata tidak mungkin dilakukan apabila hanya
menggunakan register.
Hal lain yang berhubungan dengan itu adalah akses dengan menggunakan
sebuah offset pada suatu alamat awal yang tetap dalam satu register pointer. Dalam
kasus ini, alamat tetap disimpan dalam register pointer, nilai konstanta ditambahkan
pada
alamat tersebut dan akses baca/tulis dilakukan pada alamat tersebut
menggunakan sebuah offset.
Selanjutnya akan membicarakan penggunaan SRAM sebagai stack. Anda
dapat melakukan push terhadap suatu nilai ke dalam stack, menjadi isi suatu register,
mengembalikan alamat utama untuk pemanggilan subrutin atau mengembalikan
alamat utama untuk sebuah interupsi yang dipicu hardware.
Dalam penggunaan SRAM, Anda perlu terlebih dahulu mendefinisikan alamat
yang hendak Anda gunakan. Alamat SRAM yang dapat digunakan adalah mulai dari
0x0060 hingga batas akhir SRAM fisik dari jenis AVR yang anda gunakan.
Anda dapat menyalin isi register R1 ke dalam lokasi pertama SRAM dengan perintah
berikut.
STS

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

Perhatikan bahwa 2 tidak hanya ditambahkan sementara terhadap Y. Penambahan


sementara seperti ini tidak dapat dilakukan untuk pointer register X, hanya Y dan Z
saja.
Perintah lain yang masih berhubungan degnan pengaksesan SRAM dengan
menggunakan offset adalah seperti berikut:
LDD

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

Gambar 5.3 Metoda Penanganan Stack


Untuk membangun stack, stack pointer harus dimuati dengan alamat tertinggi SRAM.
.DEF reg_satu = R16
LDI reg_satu, HIGH (RAMEND)
OUT

SPH, reg_satu

LDI

reg_satu. LOW (RAMEND)

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
[]

program selanjutnya berada

subrutin1:

;subrutin yang dipanggil1

[]melakukan sesuatu
[]ingin kembali
RET

Selama mengeksekusi instruksi RCALL sementara PC telah di increment,


alamat 16-bit didorong ke stack. Setelah Program menemukan instruksi RET, isi
program counter dimuati kembali dengan alamat dalam stack.
Penanganan interupsi hardware tidak mungkin dilakukan tanpa stack. Interupsi
akan memotong aliran eksekusi program, apapun yang sedang dilakukan saat itu.
Program lalau menuju pada rutin interupsi dan mengeksekusinya. Setelah itu, program
harus kembali ke lokasi sebelum terjadinya interupsi untuk melanjutkan pekerjaannya.
Hal ini memerlukan suatu tempat penyimpanan sementara, yaitu stack.
Dalam menggunakan stack, seringkali terjadi berbagai masalah, terutama bagi
anda yang belum terbiasa dengan stack. Cara pintar untuk menggunakan stack adalah
menggunakan tanpa harus mengatur stack pointer. Karena jika pointer ini diset ke nol
0 pada awal program, pointer akan menunjuk pada register R0.
5.5.7 Kondisi Reset

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

Pengarah yang pertama, menyatakan bahwa assembler berada pada kode


segment. Sedangkan pengarah ORG akan menyatakan, bahwa kode setelah pengarah
ini akan dituliskan pada alamat 0000 dalam Memori program. Bila program anda akan
dimulai dari alamat 0000, maka penggunaan kode pengarah ini tidak mutlak. Anda
dapat membuangnya tanpa akan mendapatkan error. Namun bila anda menghendaki
program anda dimulai pada alamat lain, maka anda perlu menuliskannya. Pengarah
ORG juga dapat anda gunakan pada saat Anda ingin membuat suatu tabel data pada
code segment.
Seperti telah disampaikan sebelumnya, kode pertama selalu dimulai dari
alamat 0000. Alamat 0000 ini juga disebut sebagai reset vector yang merupakan
alamat yang akandituju apabila terjadi kondisi reset. Beberapa alamat sesudah reset
vector merupakan interrupt vector, misalnya 0001, 0002, dan seterusnya. Interrupt
vector merupakan alamat yang akan dituju apabila interrupt diijinkan dan
kemudianinterrupt tersebut terjadi. Posisi yang disebut sebagai vector mungkin akan
berbeda untuk masing-masing AVR dan bergantung pada ada/tidaknya interrupt
Citra Lab
48

Pemrograman AVR

internal dan eksternal. Perintah untuk menangani terjadinya interupsi harus


ditempatkan pada vector interupsi. Bila anda menggunakan interupsi, maka kode
pertama dalam reset vector harus merupakan perintah lompatan. Hal ini agar program
yang anda jalankan tidak mengeksekusi rutin interupsi sebelum terjadinya interupsi
yang anda inginkan. Demikian juga dengan perintah pada vector interrupsi, mestinya
juga merupakan perintah lompatan menuju rutin interupsi yang anda inginkan dan
dapat anda tempatkan pada bagaian lain program yang bukan merupakan vector
interupsi.
Bentuk umum rangkaian program yang biasa digunakan adalah sebagai berikut:
.CSEG
.ORG

0000
RJMP

Start

RJMP

Rutin_Int1

RJMP

Rutin_Int2

[disini merupakan tempat untuk vector interupsi yang lain]


Rutin_Int1:
[berisi rutin program untuk penanganan interupsi1]
Rutin_Int2:
[berisi rutin program untuk interusi2]
[Rutin Interupsi yang lain]
Start:

; Di sini awal dari program anda

[program utama anda berada]


.EXIT

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

Instruksi percabangan yang merupakan kebalikan BRNE adalah BREQ (BRanch if


Equal).
Untuk melakukan percabangan, anda tidak harus menggunakan instruksiinstruksi percabangan di atas yang mengacu pada perubahan Zero-bit. Anda dapat
pula menggunakan bit status yang menggunakan bit status yang lain untuk melakukan
percabangan. Berikut ini instruksi-instruksi percabangan dalam AVR.
Tabel 5.3 Daftar Instruksi percabangan dan Kondisi yang mempengaruhinya.
INSTRUKSI OPERAN DESKRIPSI
FLAG
CPSE
Rd, Rr
Compare, skip if Equal
Z
CP
Rd, Rr
Compare
Z
CPC
Rd, Rr
Compare with Carry
Z
CPI
Rd, k
Compare Register with Immediate Z
SBRC
Rr, b
Skip if Bit in Register Cleared
Rr(b)
SBRS
Rr, b
Skip if Bit in Register is Set
Rr(b)
SBIC
P, b
Skip if Bit in I/O Register Cleared I/O(P,b)
SBIS
P, b
Skip if Bit in I/O is Set
I/O(P,b)
BRBS
S, k
Branch is status Flag Set
S
BRBC
S, k
Branch is status Flag Clear
S
BREQ
K
Branch if Equal
Z
BRNE
K
Branch if Not Equal
Z
BRCS
K
Branch if Carry Set
C
BRCC
K
Branch if Carry Cleared
C
BRSH
K
Branch if Same or Higher
C
BRLO
K
Branch if Lower
C
BRMI
K
Branch if Minus
N
BRPL
K
Branch if Plus
N
BRGE
K
Branch if Greater or Equal, Signed N,v
BRLT
K
Branch if Less Than Zero, Signed N,v
BRHS
K
Branch if Half-carry Flag Set
H
BRHC
K
Branch if Half-carry Flag Cleared H
BRTS
K
Branch if T-Flag Set
T
BRTC
K
Branch if T-Flag Cleared
T
BRVS
K
Branch if Overflow Flag is Set
V
BRVS
K
Branch if Overflow Flag is V
Cleared
BRIE
K
Branch if Interrupt Enabled
I
Citra Lab
50

Pemrograman AVR

BRID

Branch if Interupt Disabled

5.5.8 Pewaktuan Eksekusi Program


Salah satu kelebihan AVR disbanding mikrokontroler yang lain terletak pada
kecepatannya dalam melakukan eksekusi program. AVR membutuhkan waktu satu
siklus clock untuk melakukan eksekusi terhadap satu instruksi. Bila AVR bekerja pada
clock input 4 MHz, maka waktu satu siklus instruksi adalah 250 ns, sedangkan bila
anda memasang kristal osilator 10 MHz sebagai clock input, waktu yang dibutuhkan
untuk melakukan eksekusi sebuah instruksi adalah 100 ns. Waktu yang dibutuhkan
untuk mengeksekusi sebuah instruksi dinamakan waktu siklus instruksi (instruction
clyces time), yang nilainya bergantung pada kristal yang anda gunakan sebagai input
clock. Namun demikian, Anda perlu tahu bahwa terdapat beberapa instruksi yang
membutuhkan lebih dari satu instruksi, yaitu untuk instruksi percabangan atau
lompatan. Instruksi-instruksi tersebut mungkin membutuhkan lebih dari satu siklus
instruksi (bila percabangan dilakukan).
Apabila anda ingin membuat program anda melakukan dengan waktu yang tepat,
mungkin anda akan memerlukan instruksi NOP. Instruksi ini tidak akan mengerjakan
apapun, kecuali hanya melewatkan waktu eksekusi saja. Instruksi NOP (No
Operation), dapat digunakan untuk membuat sebuah delay (tunda) pendek.
Misalkan anda bekerja dengan clock input 4 MHz dan Anda menghendaki
delay 1 us, anda dapat menggunakan instruksi NOP dengan menempatkannya dalam
program sebanyak empat buah.
NOP
NOP
NOP
NOP

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

LDI ZH, LOW (65535)


Count :
SBWIN ZL, 1
BRNE Count

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

;Anda kembali ingin menggunakan 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

Penggunaan macro, pada dasarnya hanya memberikan kemudahan dalam


penulisan dan editing kode sumber program yang Anda buat. Dari segi software
Asembler, penggunaan makro tidak memberikan keuntungan yang berarti.
Apalagi ruang memori AVR anda cukup terbatas, penggunaan makro tidak
begitu dianjurkan. Dalam kasus ini, anda sebaiknya menggunakan subrutin yang dapat
anda panggil setiap waktu. Penggunaan subrutin akan sangat menghemat ruang
memori program pada AVR anda.
Terdapat perbedaan yang cukup mendasar antara macro dan subrutin. Pada
penggunaan macro, kode akan tetap dituliskan dalam Memori Program setiap nama
macro disebutkan, sedangkan pada subrutin hanya dituliskan sekali dalam Memori
Program. Bila subrutin hendak digunakan, yang perlu anda lakukan adalah
memanggilnya dengan instruksi RCALL.
Untuk subrutin delay 10 siklus instruksi, anda dapat menuliskan rangkaian perintah
berikut ini:
Delay10:
NOP
NOP
NOP
RET

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

Ilustrasi pemanggilan subrutin dengan RCALL dan lompatan menggunakan RJMP


ditunjukkan dalam gambar 5.4.
RCALL Hitung
[Instruksi

RJMP Proses

berikutnya]

Hitung:
Proses:

RET
[Instruksi
berikutnya

Gambar 5.4 Aliran Program Untuk RCALL dan RJMP


5.5.10 Percabangan Bersyarat
Untuk melakukan percabangan dengan memperhatikan kondisi tertentu, Anda perlu
menggunakan instruksi percabangan bersyarat. Instruksi percabangan bersarat akan
melakukan lompatan menuju suatu rangkaian program (berlabel) apabila suatu
kondisi dipenuhi atau suatu kondisi tidak dipenuhi. Apabila anda ingin memanggil
suatu subruti, dengan syarat suatu kondisi terepenuhi, anda dapat menggunakan
perintah seperti berikut:
SBRC R1, 7

; Lewati instruksi berikutnya bila bit7, R1 0

RCALL Delay10

; Panggil Rutin Delay10

[instruksi berikutnya]

Instruksi SBRC (Skip next instruction if Bit in Register is Clear) merupakan


instruksi pengecek kondisi bit dari suatu register. Instruksi ini akan melewatkan satu
instruksi berikutnya apabila bit b yang register Rx berlogika nol (0). Dalam contoh
diatas, RCALL hanya akan dieksekusi apabila bit 7 dalam register R1 berlogika 0.
Bila bit 7 dalam register R1 berlogika 1maka perintah RCALL tidak akan
dieksekusi, yang berarti subrutin delay10 tidak akan dipanggil.
Bila anda menghendaki sebaliknya, yakni subrutin Delay10 hanya dieksekusi
apabila bit7 dalam register R1 berlogika 1, maka anda dapat menggunakan instruksi
lai yang serupa, yaitu SBRS (Skip next instruction if Bit in Register is Set).
Instruksi percabangan bersyarat yang lain adalah CPSE (Compare two registers, and
Skip next instruction if Equal).
CPSE

R1, R2

RCALL SomeSubroutine

; Compare R1 and R2, skip if equal


; Call SomeSubroutine

Anda juga dapat melakukan percabangan bersyarat berdasarkan kondisi bit


tertentu didalam port. Instruksi yang dapat anda gunakan adalah SBIC atau SBIC.
SBIC (Skip next instruction if Bit in I/O space is Clear) berarti lewatkan satu instruksi
berikutnya apabila bit b pada port berlogika 0. Sebaliknya, instruksi SBIS akan
Citra Lab
54

Pemrograman AVR

melewatkan satu instruksi berikutnya apabila bit dalam port yang ditunjuk berlogika
1.
SBIC PortB, 0

; Lewati instruksi berikutnya bila bit0, portB 0

RJMP ATarget

; Jump to the label 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

Hal yang sangat penting dalam penggunaannya adalah bagaimana


mengamankan data dan kondisi-kondisi sebelum terjadinya interupsi, sehingga tidak
hilang atau berubah akibat pelaksanaan rutin interupsi. Oleh karena itu, instruksi
pertama dalam rutin interupsi harus merupakan instruksi untuk menyimpan isi register
ke stack dan instruksi terakhir sebelum RETI merupakan instruksi untuk
memunculkannya kembali dari stack.
.CSEG

; Code_Segment, mulai di sini

.ORG 0000
RJMP

; Alamat

0000

Mulai ; Reset vector

0000

RJMP IService ; 0001=Int-Vektor pertama, INTO service routine


[] vector interupsi yang lain
Mulai:

; Di sini program utama dimulai

[]
IService:

; Here we start with the Interrupt-Service-Routine

PUSH R16; save a registr to stack


IN R16, SREG; read status register
PUSH R16; and put on stack
[] Here the Int-Service-Routine does something and uses R16
POP R16; get previous flag register from stack
OUT SREG,R16

; restore old status

POP R16; get previous content of R16 from the stack


RETI

; and return from int

BAB 6
AVR STUDIO 4
6.1 Penjelasan Umum
Citra Lab
57

Pemrograman AVR

AVR Studio 4 menggunakan file object yang telah dibangkitkan untuk


melakukan eksekusi program pada simulator maupun In-Circuit Emulator. File object
tersebut dibangkitkan melalui proses assembling atau compiling terhadap file-file
(source) seperti file .asm dan file .inc.
Dengan AVR Studio 4, Anda dapat menjalankan Program yang anda buat,
mengujinya langkah demi langkah, menjalankan suatu rutin, menempatkan kursor
pada suatu statemen dan menjalankan, dan juga reset eksekusi program.
Pada saat anda keluar dari program AVR Studio 4, software akan menyimpan setup
environment yang telah anda bangun pada suatu project. Sehingga ketika suatu saat
Anda membuka kembali project tersebut, maka setup environment yang
menyertainyaakan dapat direkontruksi.
AVR Studio 4 menyediakan area kerja dan toolbar yang memudahkan
pengguna untuk melakukan berbagai operasi sesuai yang diinginkannya. Pada saat
pertama kali anda membuka program AVR Studio 4, tampilan yang terlihat adalah
seperti ditunjukkan oleh Gambar 6.1.

Gambar 6.1 Tampilan AVR Studio 4 Saat pertama kali Dibuka


Tampilan pada Gambar 6.1 tersebut tidak aktif pada saat pertama anda
menjalankan AVR Studio 4, karena secara otomatis sebuah tampilan pembuka (wizard
start-up AVR Studio 4) akan muncul. Tampilan pembuka tersebut akan memberikan
pilihan bagi Amda membuat suatu project baru atau membuka project yang pernah
dibuat. Tampilan tersebut akan tampak seperti pada gambar 6.2 berikut ini.

Citra Lab
58

Pemrograman AVR

Gambar 6.2 Wizard Start-Up Dari AVR Studio 4


Bila anda tak menginginkan kedua pilihan tersebut, anda dapat menekan tombol
Cancel.

6.2 Menu AVR Studio 4


AVR Studio 4 memiliki beberapa menu layaknya program aplikasi mindows lainnya.
Menu pada AVR Studio 4 meliputi file, Edit, Debug, View, Window, dan Help.
Masing-masing fungsi dan cara penggunaan dari menu tersebut akan dijelaskan
berikut ini.
Perhatikan dua tampilan program AVR Studio 4 berikut ini. Ketika belum ada
satupun Project atau file yang dibuka, AVR Studio 4 hanya memiliki enam buah menu
aktif yaitu File, Project, View, Tools, Debug, dan Help. Namun bila sebuah project
telah terbuka, atau sedang dikerjakan, maka akan terdapat dua menu tambahan, yaitu
Edit dan Window.

Citra Lab
59

Pemrograman AVR

Gambar 6.3 Menu dan Toolbar Pada AVR Studio 4

6.3 Project management


Dalam AVR Studio 4, terdapat beberapa fitur yang memungkinkan Anda untuk
melakukan pengendalian project yang dibuat. AVR Studio 4 juga memberi
keleluasaan dalam melakukan editing pada saat debugging berlangsung.
Beberapa fitur yang sangat membantu Anda dalam pemrograman antara lain:

Kemudahan menggunakan Source file editor dengan sintaks berwarna.

Tampilan project management dengan target, grup, dan file berbeda.

Editing pada saat debugging berlangsung menggunakan jendela yang sama.

Breakpoint terjaga saat editing.


6.3.1 Membuat Sebuah Project
Untuk membuat sebuah project baru, Anda dapat melakukan langkah-langkah berikut
ini:
1.
Pilih Create New Project ketika pertama kali jendela welcome terbuka (Gambar
6.2).
Atau
Klik menu Project New Project.
2.
Berikan nama untuk project anda pada kolom Project Name. Nama file sumber
pada kolom di bawahnya akan secara otomatis mengikutinya. Bila anda
menginginkan nama yang berbeda, anda dapat mengubahnya. File sumber akan
memiliki ekstensi .asm.
3.
Tandai pada pilihan Create Initial File.
4. Tentukan lokasi di mana Anda akan menempatkan project anda. Lakukan dengan
browse pada tombol di sebelah kanan kolom Location.
5. Setelah itu, klik Next.
Citra Lab
60

Pemrograman AVR

Gambar 6.4 Membuat Project Baru


6. Pilih platform debug yang anda gunakan. Bila anda tidak bekerja menggunakan
perangkat emulator, pilih saja AVR Simulator. Kemudian pilih tipe mikrokontroler
yang anda gunakan.

Gambar 6.5 Memilih Platform Debug dan Tipe AVR


7. Klik Finish.
Maka pada layar monitor anda akan muncul tampilan seperti pada gambar 6.6.
Kini anda dapat memulai menuliskan program assembler.

Citra Lab
61

Pemrograman AVR

Gambar 6.6 Siap Untuk Menuliskan Program Asembler AVR


Setelah selesai menuliskan program assembler, anda herus menyimpannya dengan
pilih FileSave atau klik toolbar save. Setelah itu, pilih ProjectBuild. Bila pesan
yang dihasilkan menunjukkan tidak adanya error, maka project tersebut telah berhasil
dibangun. Setelah berhasil dibangun dengan tanpa error, Anda dapat menyimpan
project anda dengan pilih Project Save Project.
6.3.2 Mendebug dan Mensimulasi Project
Untuk mendebug project yang telah anda bangun, Anda dapat melakukannya dengan
pilih DebugStart Debug atau DebugRun. Bila anda ingin menjalankan debug
langsung dari saat anda mulai membangunnya, anda dapat melakukan langkah
berikut.
Klik menu ProjectBuild atau klik toolbar
Klik DebugRun.
Atau dengan satu langkah yaitu:
Pilih projectBuild and Run.
Selama proses debugging berlangsung, anda dapat mengendalikan proses eksekusi
program. Semua kendali debug dapat digunakan melalui menu, shortcut maupun
toolbar debug. Icon-icon pada debug toolbar untuk pengendalian debugging adalah
sebagai berikut:

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

Break (Ctrl+F5). Toolbar ini digunakan untuk menghentikan proses eksekusi


program yang dijalankan menggunakan Auto Step.
Setelah perintah kendali Debug di atas, terdapat kendali Breakpoint yang digunakan
untuk melakukan penanganan breakpoint.
Toggle Breakpoint.
Clear all breakpoint.
Bila anda hendak mencari suatu teks tertentu, Anda dapat mencarinya menggunakan
toolbar berikut.
Find in files
Find in this file
Selama proses debug, Anda dapat sekaligus melakukan simulasi dengan
mengamati perubahan isi GPR register, I/O register, dan hal-hal lain yang berkaitan
dengan eksekusi program anda. Dalam AVR Studio 4, terdapat sejumlah jendela yang
anda gunakan untuk mengamati perubahan setiap langkah eksekusi program Anda.
Jendela pengamatan dapat Anda tampilkan melalui perintah-parintah toolbar berikut:

BAB 7
PRAKTIK MEMBUAT PROJECT
MENGGUNAKAN AVR STUDIO 4
Citra Lab
64

Pemrograman AVR

Setelah mempelajari, mengenal, da memahami AVR Studio 4, kini anda dapat


mencoba membuat sebuah project sederhana. Berikut ini akan diberikan beberapa
contoh program sederhana untuk AVR AT90S2313. Dalam contoh ini, anda akan
dituntun langkah demi langkah, sehingga anda mengetahui bagaimana membuat suatu
aplikasi program assembler untuk AVR menggunakan AVR Studio 4.
Project 1: test1
Untuk membuat sebuah project baru, pertama kali bukalah AVR Studio 4 yang anda
install.
Membuat project baru.
Kilk pada tombol Create New Project pada wizard yang akan muncul secara
otomatis ketika pertama kali anda memulai AVR Studio. Lalu klik pada Next.
Atau
Anda juga dapat melakukannya dengan cara pilih menu ProjectNew Project.
2. Isikan nama project dan file.asm yang ingin Anda buat. Nama file.asm secara
otomatis akan mengikuti nama project, namu bila anda menghendaki, anda dapat
mengubahnya.
Misalkan project yang akan anda buat diberi nama test1, seperti yang tampak pada
gambar berikut.
Tentukan juga lokasi tempat project tersebut akan disimpan. Setelah itu klik Next.
1.

Gambar 7.1 Membuat Project


3.

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

Gambar 7.2 Memilih Platform Debug dan Tipe AVR


4. Kini anda dapat menuliskan program assembler untuk test1. pada project test1,
kita akan mencoba untuk membuat sebuah pencacah biner dengan output pada
portb. Pencacah tersebut dapat Anda tentukan nilai awal dan nilai akhirnya dengan
mengatur konstanta startnum dan endnum pada deklarasi konstanta diawal
program.
Tuliskan program assembler test1 berikut ini:
; Contoh Program Sederhana
;Pencacah biner 8-bit pada portB mikrokontroler AT90S2313
; nilai awal dan nilai akhir pencacah diset melalui
; variable : sternum dan endnum
;
; oleh: Sigit Haryanto
.nolist

; list file tidak perlu ditampilkan

.include C:\Program files\Atmel\AVR


Tools\AvrAssembler\Appnotes\2313def.inc
baris
.list
.equ

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

Simulasi program menggunakan input stimulus


Project2:test2
Pada project ini, Anda akan membuat suatu program yang melibatkan input stimulus
untuk menentukan arah aliran program.
Program ini masih sangat sederhana, yaitu melakukan pergeseran bit pada
PortB yang dikendalikan menggunakan input pada pin0 PortD. Bila pin0 PortD
berlogika 0 maka bit-bit pada PortB akan digeser kekanan, tapi bila pin0 PortD
berlogika 1, maka akan dilakukan pergeseran kekiri.
Silakan ketik program test2 berikut ini dan simpan sebagai project test2.
;
;
;
;
;
;
;
;
;

Contoh program sederhana


nama file: test2.asm
Menggeser bit-bit pada PORTB (kekanan atau kekiri)
yang dikendalikan dengan bit0 pada PIND
bit0 PIND =0- ->Geser kanan
=1-- Geser kiri
pola bit dapat set-up melalui konstanta pola-bit
oleh: Anto

.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

; pino port sebagi input


; pola bit
; geser kiri

; 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.

8.1 Hardware PonyProg2000 untuk AT90S2313


13
1 RESET

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

Gambar 8.1Skema Rangkaian Antar Muka Untuk Program AT902313


Dengan PonyProg2000
Untuk AVR AT902313, Anda dapat melakukan download program dengan ICProg menggunakan Port serial (COM) atau dengan port parallel (LPT). Rangkaian
pada gambar di atas merupakan antar muka yang anda perlukan untuk melakukan
pemrograman AVR AT902313 dengan menggunakan port parallel. Untuk
memudahkan Anda dalam melakukan pemrograman AVR yang mungkin akan anda
lakukan berulang kali, sebaiknya anda menggunakan soket zip untuk menempatkan
mikrokontroler AVR.

8.2 Software PonyProg2000

Citra Lab
70

Pemrograman AVR

Gambar 8.2 Tampilan Software PonyProg2000

8.3 Menggunakan PonyProg2000


Setelah Anda memiliki rangkaian untuk keperluan pemrograman dan
menginstall Software Ponyprog di atas, anda dapat menghubungkannya pada port
LPT1.
Sebelum menggunakan program untuk pertamakalinya anda harus melakukan
kalibrasi dengan memilih menu setupcalibration

Gambar 8.3 Tampilan calibration OK


Untuk melakukan download file HEX ke dalam memori pemrogram maupun
EEPROM mikrokontroler AVR, Anda terlebih dahulu harus melakukan Setting
Interface yaitu dengan cara klik menu SetupInterface Setup. Selanjutnya lakukan
setting seperti gambar dibawah.

Citra Lab
71

Pemrograman AVR

Gambar 8.3 Setting Interface Ponyprog2000 Sebelum Memprogram AVR


Setelah itu, Anda juga perlu melakukan pemilihan tipe AVR sesuai dengan AVR yang
anda gunakan.

Gambar 8.4 Memilih Tipe Mikrokontroler Target


Sekarang Anda dapat membuka file HEX yang akan anda download ke
program memori mikrokontroler. Pilih FileOpen Device File, lalu pilih file anda.
Gunakan Browse dan pilih Open pada file yang ingin anda download.

Citra Lab
72

Pemrograman AVR

Gambar 8.5 Membuka File HEX Yang Akan Didownload


Setelah Anda membuka file HEX, Anda dapat melakukan proses download
dengan cara pilih CommandWrite All. Untuk membaca isi memori program, Anda
dapat memilih CommandRead All.

Gambar 8.6 Melakukan Proses Download File HEX

Citra Lab
73

Pemrograman AVR

Perintah-perintah dalam PonyProg2000 juga dapat diakses melalui toolbar


yang ada dibagian atas tampilan software ini.

Gambar 8.7 Toolbar Pada PonyProg2000

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.

Gambar 9.1 Skema Rangkaian LCD dan Keypad 4x4


;* Description:Test program with At90S2313 AVR RISC Processor,
;* LCD disply using 4-wire interface and 4x4 keypad.
;* Based on Serasidis Program (http://www.serasidis.gr)
;*
;*
;* LCD rs pin connected to PD6
;* LCD r/w pin connected to PD5
;* LCD e pin connected to PD4
;* D4-D7 FROM LCD IS CONNECTED TO PORTD PD0-PD3
;* The 4x4 keypad is connected to PortB pins (PB0-PB7)
;* PB0, PB1,PB2, PB3 inputs, PB4, PB5, PB6, PB7 outputs
;*
;*
;* This source is free, for all of you.
;*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
.nolist
.include 2313def.inc
.List

; Define chip particulars

;* * * * * Global register variables


.def
wreg =R16
; General use working register
.def
timeout=R17
; Timeout value passed to subroutine
.def
lcsdstat=R18
; LCD busy/wait sstatus
.def
longtime=R19
; Long time for powerup
.def
temp =R2
.def
test =R21
; test register
Citra Lab
75

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

ldi temp, RAMEND


SPL, temp

; Init Stack Pointer

longdelay
temp, 0b11110000

; Delay some time


; PB0, 1, 2, 3inputs,

PB4,

5,

6,

DDRB,temp
temp, 0b00001111 ; enable internal pull-ups on PB0-PB4
PORTB, temp
lcdinit

; Initialize LCD module


again: ldi monads, $30
ldi
decades, $30
rcall lcdclr
; Clear the LCD
ldi
wreg, line1
; Set address to line 1
rcall lcdcmd
ldi
ZH,High(2*message1); Type the message1
ldi
ZL, Low(2*message1); to the LCD
rcall loadbyte
ldi
wreg, line2
; Set address to line 2
rcall lcdcmd
ldi
ZH,High(2*message2); Type the message2
ldi
ZL, Low(2*message2); to the LCD
rcall loadbyte
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ;
Check all keys (1 -16).
; The comments from the first 4 keys are the same with all other
keys.
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
check_keys:
ldi
temp, col1
; Enable column1
out
PORTB,temp
rcall delay
key1:
rjmp
ldi
rjmp
key2:
rjmp
ldi
rjmp
key3:

sbic PINB, PB0


key2
monades, $31
disp_no_of_key
sbic PINB, PB1
key2
monades, $32
disp_no_of_key
sbic PINB, PB2

; Pressed key No1 ?


; if Not, check next key
; if yes. . .
; goto type it to LCD
; Pressed key No2 ?
; if Not, check next key
; if yes. . .
; goto type it to LCD
; Pressed key No3 ?

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

; if Not, check next key


; if yes. . .
; goto type it to LCD
; Pressed key No4 ?
; if Not, check next key
; if yes. . .
; goto type it to LCD

key5:
out
rcall
sbic
rjmp
ldi
rjmp

ldi
temp, col2
PORTB, temp
delay
PINB, PB0
key6
monades, $35
disp_no_of_key

; Disable the first column. . .


; and enable the second

key6:
rjmp
ldi
rjmp

sbic PINB, PB1


key7
monades, $36
disp_no_of_key

; Pressed key No6 ?


; if Not. . .
;

key7:
rjmp
ldi
rjmp

sbic PINB, PB2


key8
monades, $37
disp_no_of_key

; Pressed key No7 ?


; if Not. . .
;

key8:
rjmp
ldi
rjmp

sbic PINB, PB3


key9
monades, $38
disp_no_of_key

; Pressed key No8 ?


; if Not. . .
;

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

sbic PINB, PB1


key11
monades, $30
decades, $31
disp_no_of_key

; Pressed key No10 ?


; if Not. . .
;

key11:
rjmp
ldi
ldi
rjmp

sbic PINB, PB2


key12
monades, $31
decades, $31
disp_no_of_key

; Pressed key No11 ?


; if Not. . .
;

key12:
rjmp
ldi
ldi
rjmp

sbic PINB, PB3


key13
monades, $32
decades, $31
disp_no_of_key

; Pressed key No12 ?


; if Not. . .
;

key13:
ldi
temp,col4
out
PORTB, temp
rcall delay

; Pressed key No5 ?


; if Not. . .
;

; Pressed key No9 ?


; if Not. . .
;

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

; Pressed key No103?


; if Not. . .
;

key15:
rjmp
ldi
ldi
rjmp

sbic PINB, PB2


key16
monades, $35
decades, $31
disp_no_of_key

; Pressed key No15 ?


; if Not. . .
;

key16:
rjmp
ldi
ldi
rjmp

sbic PINB, PB3


check_keys
monades, $36
decades, $31
disp_no_of_key

; Pressed key No16 ?


; if Not. . .
;

; Pressed key No14 ?


; if Not. . .
;

;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; 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

; Setup port pins

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

; Pull all pins low


; All pins are outputs

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

; Wait at least 15 ms at power up rcall

; Toggle enable line


; Wait at least 4.1 ms
; Function set
; Toggle enable line
; Wait at least100 us
; Function set
; Toggle enable line
; Function set, 4line interface
; Toggle enable line
; Make 4 data lines inputs

; At this point, the normal 4 wire command routine can be used


ldi
font
rcall
ldi
rcall
ldi
rcall
ret

wreg, 0b00100000
lcdcmd
wreg, 0b00001100
lcdcmd
wreg, 0b00000110
lcdcmd

; Function set, 4 wire, 2 line, 5x7


; Display on, cursor off, blink off
; Address increment, no scrolling

; Wait for LCD to go unbusy


lcdwait:
ldi
wreg, 0xF0
;
out
DDRD, wreg
sbi
PORTD, lcdrw
;
cbi
PORTD, lcde
;
waitloop:
sbi
PORTD, lcde
;
cbi
PORTD, lcde
in
lcdstat, PIND
;
sbi
PORTD, lcde
;
cbi
PORTD, lcde
sbrc lcdstat, 3
;
rjmp waitloop
ret

Make 4 data Lines inputs


Set r/w pin to read
Set register select to command
Toggle enable line
Read busy flag
Toggle enable line
Loop until done

; Send command in wreg to LCD


lcdcmd:
mov
test, wreg
rcall lcdwait
ldi
wreg, 0xFF
Citra Lab
79

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

; Toggle enable line


; Strip off upper bits
; Put on port
; Toggle enable line
; Make 4 data Lines inputs

; Send character data in wreg to LCD


lcdput:
mov
test, wreg
; Save character
rcall lcdwait
; Wait for LCD to de ready
ldi
wreg, 0xFF
; Make all port D pins outputs
out
DDRD, wreg
mov
wreg, test
; Get character back
mov
test, wreg
; save another copy
swap wreg
; Get upper nibble
anto wreg, 0x0F
; Strip off upper bits
out
PORTD, wreg
; Put on port
sbi
PORTD,lcdrs
; Register select set for dat
sbi
PORTD,lcde
; Toggle enable line
cbi
PORTD,icde
mov
wreg, test
; Recall character
anto wreg, 0x0F
; Strip off upper bits
out
PORTD,wreg
; Put on port
sbi
PORTD,lcdrs
; Register select set for dat
sbi
PORTD,lcde
; Toggle enable line
cbi
PORTD,icde
ldi
wreg, 0xF0
; Make 4 data Lines inputs
out
DDRD, wreg
ret
longdelay:
ldi
longtime, 180
ldi
timeout, 256
puwait:
rcall delay
dec
longtime
brne puwait
ret

;
;

;* * * * * Delay n*64 ms using timer 0, delay time passed in


timeout delay:
ldi
test, 64
cagain:
dec
test, 64
brne cagain
dec
timeout
brne delay
ret
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Citra Lab
80

Pemrograman AVR

loadbyte:
;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
lpm
tst
breq

; Load byte from program memory into r0


r0
return

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

9.2 PC Serial Communication


.include "2313def.inc"
.org 0x0000
.def rx = r16
.def tx = r17
.def reg1 = r18
.def reg2 = r19
.def sregister = r20
ldi
reg1,25 ;25 untuk kristal 4Mhz dan 51 untuk 8 mhz
out
UBRR,reg1
;BOUDRATE
ldi
reg1,(1<<RXEN)
ldi
reg2,(1<<TXEN)
;ENABLE RX
or
reg1,reg2
out
UCR,reg1
ldi
reg2,0b11111111
out
DDRB,reg2
out
DDRD,reg2
rjmp start
start:
sbis USR,RXC
rjmp start
in
rx,UDR
cpi
rx,$41
brbs 1,led0on
cpi
rx,$42
brbs 1,led1on
cpi
rx,$43
Citra Lab
81

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

Timer/Counter1 - Counter Register Low Byte

$2B ($4B)

OCR1AH

Timer/Counter1 - Compare Register High Byte

$2A ($4A)

OCR1AL

$25 ($45)

ICRIH

Timer/Counter (8-bits)

Timer/Counter1 - Counter Register High Byte

Timer/Counter1 - Compare Register Low Byte


Timer/Counter1 - Input Capture Register High Byte

Citra Lab
84

Pemrograman AVR

$24 ($44)

ICRIL

$21 ($41)

WDTCR

Timer/Counter1 - Input Capture Register Low Byte

$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

EEPROM Addres Register


EEPROM Data Register

EEMWE

EEWE

EERE

PORTB7

PORTB6

PORTB5

PORTB4

PORTB3

PORTB2

PORTB1

PORTB0

UART I/O Data Register

UART Baund Rate Register


ACD

ACO

ACI

Citra Lab
85

ACIE

Anda mungkin juga menyukai