Anda di halaman 1dari 50

MODUl Pemrograman

Mikrokontroler AVR (ATMega16)


dengan Code Vision AVR

HENDRA ARI WINARNO


YUDA INDRA KURNIAWAN
DEDI NUR CIPTO

2011

0
Modul Pemrograman Mikrokontroler AVR (ATMega16)
dengan Code Vision AVR

Daftar Isi
1. Pengenalan Mikrokontroller .........................................................................................................
2. Pengetahuan Dasar Mikrokontroler AVR .....................................................................................
2.1. Pendahuluan ..........................................................................................................................
2.2. Memilih AVR “yang benar” .................................................................................................
2.3. Ada apa dengan Mikrokontroler AVR ATMega16? ..............................................................
2.3.1. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16 ................................................
2.3.2. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 ...............................
2.3.3. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16 ............................
3. Penulisan program .....................................................................................................................
3.1. Langkah-langkah penulisan program...................................................................................
4. Latihan Tahap-I ..........................................................................................................................
4.1. Percobaan-1: LED nyala-mati .............................................................................................
4.2. Percobaan-2: LED nyala kanan-kiri ....................................................................................
4.3. Percobaan-3: LED nyala sesuai bit ......................................................................................
5. Latihan Tahap-II ........................................................................................................................
5.1. Percobaan-4: pushbutton 1 ..................................................................................................
5.2. Percobaan-5: pushbutton 2 ..................................................................................................
5.3. Percobaan-6: pushbutton 3 ..................................................................................................
6. Latihan Tahap-III .......................................................................................................................
6.1. Percobaan-7: gerak motor DC .............................................................................................
6.2. Percobaan-8: motor DC kanan-kiri .....................................................................................
6.3. Percobaan-9: motor DC dengan pushbutton.........................................................................
7. Latihan Tahap-IV ..........................................................................................................................
7.1. Percobaan-10: seven segment ...............................................................................................
7.2. Percobaan-11: penampil dengan LCD ..................................................................................
7.3. Percobaan-12: LCD geser kanan-kiri ....................................................................................
8. Latihan Tahap-V ...........................................................................................................................
8.1. Percobaan-13: aplikasi ADC .................................................................................................

1
Pengenalan Mikrokontroller

1. Apakah Mikrokontroler itu?


Jika kita bicara tentang Mikrokontroler, maka tidak terlepas dari pengertian atau definisi tentang
Komputer itu sendiri, mengapa? Ada kesamaan-kesamaan antara Mikrokontroler dengan
Komputer (atau Mikrokomputer), antara lain:

• Sama-sama memiliki unit pengolah pusat atau yang lebih dikenal dengan CPU {Central
Processing Unit),
• CPU tersebut sama-sama menjalankan program dari suatu lokasi atau tempat, biasanya dari
ROM (Read Only Memory)1 atau RAM (Random Access Memory)2;
• Sama-sama memiliki RAM yang digunakan untuk menyimpan data-data sementara atau
yang lebih dikenal dengan variabel-variabel;
• Sama-sama memiliki beberapa luaran dan masukan (I/O) yang digunakan untuk melakukan
komunikasi timbal-balik dengan dunia luar, melalui sensor (masukan) dan aktuator (luaran),
perhatikan bagan yang ditunjukkan pada Gambar 1.

Gambar 1. Bagan masukan, pemrosesan hingga luaran

Lantas apa yang membedakan antara Mikrokontroler dengan Komputer atau Mikrokomputer?
Begitu mungkin pertanyaan yang ada di benak kita, saat kita membaca beberapa daftar kesamaan
yang sudah saya tuliskan tersebut. Sama sekali berbeda, itu jawaban yang saya berikan kepada
Anda:

Mikrokontroler adalah versi mini dan biasanya digunakan untuk aplikasi khusus dari
Mikrokomputer atau Komputer!

2
Berikut saya berikan kembali daftar kesamaan yang pernah dikemukakan sebelumnya dengan
menekankan pada perbedaan antara Mikrokontroler dan Mikrokomputer:

• CPU pada sebuah Komputer berada eksternal dalam suatu sistem, sampai saat ini kecepatan
operasionalnya sudah mencapai lebih dari 2,5 GHz, sedangkan CPU pada Mikrokontroler
berada didalam (internal) sebuah chip, kecepatan kerja atau operasionalnya masih cukup
rendah, dalam orde MHz (misalnya, 24 MHz, 40 MHz dan lain sebagainya). Kecepatan yang
relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler.
• Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal
dengan BIOS (Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau
menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak
awal menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask
ROM atau Flash PEROM atau Flash ROM). Sifat memori program dalam mikrokontroler
ini non-volatile, artinya tetap akan tersimpan walaupun tidak diberi catu daya.
• RAM pada mikrokomputer bisa mencapai ukuran sekian GByte dan bisa di-upgrade ke
ukuran yang lebih besar dan berlokasi di luar CPU-nya, sedangkan RAM pada
mikrokontroler ada di dalam chip dan kapasitasnya rendah, misalnya 128 byte, 256 byte dan
seterusnya dan ukuran yang relatif kecil inipun dirasa cukup untuk aplikasi-aplikasi
mikrokontroler.
• Keluaran dan masukan (I/O) pada mikrokomputer jauh lebih kompleks dibandingkan
dengan mikrokontroler, yang jauh lebih sederhana, selain itu, pada mikrokontroler akses
keluaran dan masukan bisa per bit.
• Jika diamati lebih lanjut, bisa dikatakan bahwa Mikrokomputer atau Komputer merupakan
komputer serbaguna atau general purpose computer, bisa dimanfaatkan untuk berbagai
macam aplikasi (atau perangkat lunak). Sedangkan mikrokontroler adalah special purpose
computer atau komputer untuk tujuan khusus, hanya satu macam aplikasi saja.

3
Perhatikan Gambar 2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.

Gambar 2. Diagram Blok mikrokontroler (yang) disederhanakan

ALU (Arithmetic Logic Unit), terdiri dari Instruction Decoder, Accumulator dan Control Logic,
sebagaimana ditunjukkan pada Gambar 2, merupakan Otak-nya mikrokontroler yang
bersangkutan. Jantungnya berasal dari detak OSC (lihat pada Gambar 2 sebelah kiri atas).
Sedangkan di sekeliling ‘Otak’ terdapat berbagai macam periferal seperti SFR (Special Function
Register) yang bertugas menyimpan data-data sementara selama proses berlangsung). Instruction
Decoder bertugas menerjemahkan setiap instruksi yang ada di dalam Program Memory (hasil dari
pemrograman yang kita buat sebelumnya). Hasil penerjemahan tersebut merupakan suatu operasi
yang harus dikerjakan oleh ALU (Arithmetic Logic Unit), dengan bantuan memori sementara
”Accumulator” yang kemudian menghasilkan sinyal-sinyal kontrol ke seluruh periferal yang
terkait melalui Control Logic.

Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara,
sedangkan SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O
dari mikrokontroler yang bersangkutan dan sebagian lain berhubungan dengan berbagai macam
operasional mikrokontroler.

ADC atau Analog to Digital Converter (tidak setiap mikrokontroler memiliki ADC internal),

4
ADC ini digunakan untuk mengubah data-data analog menjadi digital untuk diolah atau diproses
lebih lanjut. Atmega16 memiliki ADC internal sebanyak 8 pin dan berada pada port A.

Timer atau Counter digunakan sebagai pewaktu atau pencacah, sebagai pewaktu fungsinya seperti
sebuah jam digital dan bisa diatur cara kerjanya. Sedangkan pencacah lebih digunakan sebagai
penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa
dalam satu detik dan lain sebagainya. Biasanya sebuah mikrokontroler bisa memiliki lebih dari 1
timer.

EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak
mendapatkan sumber listrik/daya) dan port-port I/O untuk masukan/keluaran, untuk melakukan
komunikasi dengan periferal eksternal mikrokontroler seperti sensor dan aktuator.

5
Pengetahuan Dasar Mikrokontroler AVR

2.1. Pendahuluan
Keluarga Mikrokontroler AVR merupakan mikrokontroler dengan arsitektur modern. Perhatikan
Gambar 3, Atmel membuat 5 (lima) macam atau jenis mikrokontroler AVR, yaitu:

• TinyAVR
Mikrokontroler (kecil, hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk
menyimpan program hingga 16K Bytes, dilengkapi SRAM dan EEPROM 512 Bytes.
• MegaAVR
Mikrokontroler dengan unjuk-kerja tinggi, dilengkapi Pengali Perangkat keras (Hardware
Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K
Bytes dan SRAM 8K Bytes.
• AVR XMEGA
Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan
unjuk-kerja, sistem Event dan DMA yang ditingkatkan, serta merupakan pengembangan
keluarga AVR untuk pasar low power dan high performance (daya rendah dan
unjuk-kerja tinggi).
• AVR32 UC3
Unjuk-kerja tinggi, mikrokontroler flash AVR32 32-bit daya rendah. Memiliki flash
hingga 512 KByte dan SRAM 128 KByte.
• AVR32 AP7
Unjuk-kerja tinggi, prosesor aplikasi AVR32 32-bit daya rendah, memiliki SRAM hingga
32 KByte.

6
Gambar 3. Jenis-jenis Mikrokontroler Atmel

Yang paling banyak dijumpai di Indonesia adalah tinyAVR dan megaAVR, itupun masih kalah
populer dengan keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR.

Perbedaan jenis-jenis tersebut terletak dari fasilitas, atau lebih dikenal dengan fitur-fiturnya.
Jenis TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas dan sekaligus
fitur-fiturnya juga terbatas dibandingkan yang megaAVR. Semua mikrokontroler AVR
memiliki set instruksi {assembly) dan organisasi memori yang sama, dengan demikian
berpindah-pindah (walaupun tidak disarankan) antar mikrokontroler AVR tidak masalah.
Beberapa mikrokontroler AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC,
pengali perangkat keras, UART, USART dan lain sebagainya.

2.2. Memilih AVR “yang benar”


Baik tinyAVR, megaAVR, maupun XMEGA AVR (AVR32 pengecualian karena masuk ke
mikrokontroler 32-bit) semuanya memiliki unjuk-kerja yang sama saja, tetapi dengan
“kompleksitas” atau fasilitas yang berbeda-beda, ibaratnya begini: banyak fasilitas dan fitur =
megaAVR, fitur atau fasilitas terbatas = TinyAVR.

7
2.3. Ada apa dengan Mikrokontroler AVR ATMega16?
Dalam modul ini memang sengaja menggunakan mikrokontroler AVR ATMega16 karena
fitur-fitur yang dibutuhkan. Tentu saja Anda bisa menggunakan tipe AVR lainnya, apakah yang
40 pin atau yang kurang dari itu, bisa ATMega88, ATMega16, ATMegal28, ATMega8535,
ATMegal68 dan lain sebagainya.

2.3.1. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16

Berikut ini ringkasan berbagai macam fitur-fitur untuk Mikrokontroler AVR ATMega16 :

• Mikrokontroler AVR 8-bit daya-rendah dengan unjuk-kerja tinggi.


• Arsitektur RISC tingkat lanjut

- 131 Instruksi yang ampuh - Hampir semuanya dieksekusi dalam satu detak (dock)
saja
- 32 x 8 General Purpose Working Registers
- Operasi statis penuh
- Throughput hingga 16 MIPS pada 16 MHz
- Pengali On-chip 2-cycle

• High Endurance Non-volatile Memory segments


- 16K Bytes of In-System Self-programmable Flash program memory
- 512 Bytes EEPROM
- 1K Byte Internal SRAM
- Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
- Data retention: 20 years at 85°C/100 years at 25°C
- Optional Boot Code Section with Independent
Lock Bits In-System Programming by On-chip
Boot Program True Read-While-Write Operation
- Programming Lock for Software Security
• Antarmuka ITAG (IEEE std. 1149.1 Compliant)
- Boundary-scan Capabilities According to the ITAG Standard
- Extensive On-chip Debug Support
- Programming of Flash, EEPROM, Fuses, and Lock Bits through the ITAG
Interface
• Fitur-fitur periferal
- Dua Pewaktu/Pencacah 8-bit dengan Praskalar dan Mode Pembanding terpisah.
- Sebuah Pewaktu/Pencacah 16-bit Timer/Counter Dengan Praskalar, Mode
Pembanding dan Capture yang terpisah.
- Pencacah Real Time dengan Osilator terpisah
- Empat kanal PWM
- 8-kanal, 10-bit ADC
■ 8 Single-ended Channels
■ 7 Differential Channels in TQFP Package Only
■ 2 Differential Channels with Programmable Gain at lx, lOx, or 200x
- Byte-oriented Two-wire Serial Interface
- Programmable Serial USART

8
- Master/Slave SPI Serial Interface
- Pewaktu Watchdog yang bisa diprogram dengan Osilator On-chip yang terpisah
- Komparator Analog On-chip
• Fitur-fitur Mikrokontroler khusus
- Reset saat Power-on dan Deteksi Brown-out yang bisa diprogram
- Internal Calibrated RC Oscillator
- Sumber interupsi Eksternal dan INternal
- Enam Mode Sleep: Idle, ADC Noise Reduction, Power-save, Power-down,
Standby and Extended Standby
• I/O and Packages
- 32 Programmable I/O Lines
- 40-pin PDIP, 44-lead TQFP, and 44-pad QFN/MLF
• Tegangan kerja
- 2.7 - 5.5V untuk Atmega16L
- 4.5 - 5.5V untuk Atmega16
• Kecepatan (frekuensi dock)
- 0 - 8 MHz untuk Atmega16L
- 0 - 16 MHz untuk Atmega16
• Konsumsi daya pada 1 MHz, 3V, 25°C for AtmegalóL
- Aktif: 1.1 mA
- Idle Mode: 0.35 mA
- Mode Power-down: < 1 µA

9
2.3.2. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16

Pada Gambar 4 dan 5 ditunjukkan diagram pin, masing-masing, untuk Mikrokontroler AVR
ATMega16 tipe PDIP dan TQFP/MLF atau dikenal sebagai SMD.

Gambar 4. Diagram Pin Mikrokontroler AVR ATMega16 tipe PDIP

Gambar 5. Diagram Pin Mikrokontroler AVR ATMega16 tipe SMD

10
Pada Gambar 6 dan 7 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16,
perhatikan begitu banyaknya fitur-fitur dalam diagram blok tersebut.

2.3.3. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16

Berikut kita jelaskan secara singkat fungsi dari masing-masing PIN pada Mikrokontroler AVR
ATMega16.

Vcc Masukan tegangan catu daya

GND Ground

Port A (PA7..PA0) Port A berfungsi sebagai masukan analog ke ADC internal pada
mikrokontroler ATMega16, selain itu juga berfungsi sebagai port
I/O dwi-arah 8-bit, jika ADC-nya tidak digunakan. Masing-masing
pin menyediakan resistor pull-up internal yang bisa diaktifkan
untuk masing-masing bit.

Port B (PB7..PB0) Port B berfungsi sebagai sebagai port I/O dwi-arah


8-bit.Masing-masing pin menyediakan resistor pull-up
internal yang bisa diaktifkan untuk masing-masing bit. Port B
juga memiliki berbagai macam fungsi alternatif, sebagaimana
ditunjukkan pada Tabel 1

Port C (PC7..PC0) Port C berfungsi sebagai sebagai port I/O dwi-arah


8-bit.Masing-masing pin menyediakan resistor pull-up
internal yang bisa diaktifkan untuk masing-masing bit.Port C
juga digunakan sebagai antarmuka JTAG, sebagaimana

ditunjukkan pada Tabel 2.

Port D (PD7..PC0) Port D berfungsi sebagai sebagai port I/O dwi-arah


8-bit.Masing-masing pin menyediakan resistor pull-up internal
yang bisa diaktifkan untuk masing-masing bit. Port D juga

11
memiliki berbagai macam fungsi alternatif, sebagaimana
ditunjukkan pada Tabel 3

/RESET Masukan Reset. Level rendah pada pin ini selama lebih dari lama
waktu minimum yang ditentukan akan menyebabkan reset,
walaupun clock tidak dijalankan.

XTAL 1 Masukan ke penguat osilator terbalik (inverting) dan masukan ke


rangkaian clock internal.

XTAL 2 Keluaran dari penguat osilator terbalik.

AVCC Merupakan masukan tegangan catu daya untuk Port A sebagai


ADC, biasanya dihubungkan ke Vcc, walaupun ADC-nya tidak
digunakan. Jika ADC digunakan sebaiknya dihubungkan ke Vcc
melalui tapis lolos-bawah (low-pass filter).

AREF Merupakan tegangan referensi untuk ADC

12
Gambar 6. Diagram blok mikrokontroller AVR ATMega16 – Bagian I

Gambar 7. Diagram blok Mikrokontroler AVR ATMega16 – Bagian II

13
Pada Tabel 1, 2 dan 3 ditunjukkan masing-masing alternatif fungsi dari Port B, Port C dan Port D.
Tabel 1. Alternatif fungsi PORT B

Port Pin Alternate Functlons


PB7 SCK (SPI Bus Serial Clock)
PB6 MÍSO (SPI Bus Master Input/Slave Output)
PB5 MOSI (SPI Bus Master Output/Slave Input)

PB4 SS (SPI Slave Select Input)


AIN1 (Analog cnmparatnr Negative input)
PB3 OC0 (Timer/Counter0 Output Compare Match Output)

AlNO (Analog Comparator Positive Input)


PB2
INT2 (External Interupt2 Input)
PB1 TI (Timer/Counter1 External Counter Input)
TO (Tlmer/Counter External Counter Input)
PBO
XCK (Usart External Clock Input/Output)

Tabel 2. Alternatif fungsi PORT C

Port Pin Alternative function


PC 7 TOSC 2 (Timer Oscillator PIN 2)
PC 6 TOSC 1 (Timer Oscillator PIN 1)
PC 5 TDI (JTAG Test Data In)
PC 4 TDO (JTAG Test Data Out)
PC 3 TMS (JTAG Test Mode Select)
PC 2 TCK (JTAG Test Clock)
PC 1 SDA (two-wire serial bus data input/output Line)
PC 0 SCL (two-wire serial bus clock line)

Tabel 2. Alternatif fungsi PORT D

Port Pin Alternative Function


PD7 OC2 (Timer/Counter2 Output Compare Match Output)
PD6 ICP1 (Timer/Counter1 Input Capture Pin)
PD5 OC1A (Timer/Counter1 Output Compare Match Output)
PD4 OC1B (Timer/Counter1 Output Compare Match Output)
PD3 INT1 (External Interupt 1 Input)
PD2 INT0 (External Interupt 0 Input)
PD1 TXD (USART Output Pin)
PD0 RXD (USART Input Pin)

14
PENULISAN PROGRAM

Untuk mengisi program pada mikrokontroller ATMega 16 kita gunakan software CodeVision
AVR yang mendukung penulisan program dengan bahasa C. Penggunaan bahasa C disini dinilai
lebih mudah dibandingkan penggunaan bahasa assembly yang kerap digunakan oleh
mikrokontroller AT89…. (termasuk mikrokontroller keluarga MCS). bahasa C ini berisi
kode-kode perintah yang lebih mendekati kosakata bahasa manusia (khususnya bahasa inggris)
sedangkan bahasa assembly lebih condong pada kode-kode perintah tertentu (seringkali disebut
bahasa mesin).

3.1. Langkah-langkah penulisan program

Berikut akan disebutkan langkah-langkah penulisan pada program CodeVision AVR dan
mengisikannya pada mikrokontroller ATMega 16 :

1. Buka software CodeVision AVR

15
2. Jalankan program CodeVision, dengan tampilan pertama seperti di bawah ini.

3. Kemudian pilih menu File dan pilih New dengan tampilan seperti di bawah ini.

16
4. Pilih Project kemudian klik OK.

5. Jika ada tampilan seperti di bawah ini, klik tombol Yes

6. Tunggu sampai muncul jendela seperti di bawah dan lakukan pengaturan I/O yang akan
digunakan.

17
7. Generate dan Save pengaturan yang sudah dilakukan

8. Simpan File Source pada lokasi yang diinginkan

18
9. Simpan File Project pada lokasi yang diinginkan

10. Simpan File Cwp pada lokasi yang diinginkan

19
11. Nah…. lembar penulisan program akan ditampilkan seperti berikut

12. Setelah program selesai ditulis, buka menu Project dan pilih Configure

20
13. Kemudian lakukan Configure pengisian program ke mikrokontroller

21
14. Kemudian buka menu Project dan pilih Compile

15. Pastikan tidak ada kesalahan pada penulisan program kita

22
16. Langkah terakhir untuk download program ke mikrokontroller, buka menu Project dan
pilih Build

17. Sampai muncul jendela berikut, pilih Program the Chip dan tuggu sampai proses
download selesai.

23
LATIHAN TAHAP – I

Modul LED disini menggunakan 8 buah sehingga sesuai untuk aplikasi setiap port pada AVR
ATMega 16 yang kita gunakan.

(Percobaan 1) :

// mengaktifkan LED di port C nyala semua


#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;

24
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0xFF;
delay_ms(500);
};
}

//menonaktifkan LED di port C mati semua


#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;

25
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0x00;
delay_ms(500);
};
}

// Modifikasi LED di port C nyala-mati


#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;

26
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0xFF;
delay_ms(500);
PORTC=0x00;
delay_ms(500);

};
}

(Percobaan 2) :

// LED di port C nyala kanan-kiri


#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;

27
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0x01;
delay_ms(500);
PORTC=0x02;
delay_ms(500);
PORTC=0x04;
delay_ms(500);
PORTC=0x08;
delay_ms(500);
PORTC=0x10;
delay_ms(500);
PORTC=0x20;
delay_ms(500);
PORTC=0x40;
delay_ms(500);
PORTC=0x80;
delay_ms(500);
};
}

(Percobaan 3) :

// LED di port C nyala sesuai bit yang diinginkan


// misalkan contoh untuk menyalakan bit 0 dan 7 kemudian bit 1 dan 6
#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;

28
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0x81;
delay_ms(500);
PORTC=0x42;
delay_ms(500);
};
}

Banyak variasi-variasi yang bisa dilakukan dengan menggunakan LED 8 bit, silahkan
kembangkan variasi yang sudah ada pada contoh.

29
LATIHAN TAHAP – II

Aplikasi pushbutton pada industri tidak kalah penting, pushbutton biasa digunakan untuk
pengendalian awal sebelum otomatisasi dalam system kerja berjalan secara
keseluruhan.

(Percobaan 4) :

// pushbutton menyalakan LED sesuai bit yang ditekan


#include <mega16.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;

30
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=PINA;
};
}

(Percobaan 5) :

// pushbutton ditekan, akan menyalakan beberapa bit LED


#include <mega16.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;

31
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
if(PINA==0x01)
{
PORTC=0x18;
}
if(PINA==0x02)
{
PORTC=0x24;
}
if(PINA==0x04)
{
PORTC=0x42;
}
if(PINA==0x08)
{
PORTC=0x81;
}
};
}

(Percobaan 6) :
// pushbutton ditekan akan menyalakan LED kanan-kiri
#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;

32
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
if(PINA==0x01)
{
PORTC=0x01;
delay_ms(500);
PORTC=0x02;
delay_ms(500);
PORTC=0x04;
delay_ms(500);
PORTC=0x08;
delay_ms(500);
PORTC=0x10;
delay_ms(500);
PORTC=0x20;
delay_ms(500);
PORTC=0x40;
delay_ms(500);
PORTC=0x80;

33
delay_ms(500);
}
if(PINA==0x02)
{
PORTC=0x80;
delay_ms(500);
PORTC=0x40;
delay_ms(500);
PORTC=0x20;
delay_ms(500);
PORTC=0x10;
delay_ms(500);
PORTC=0x08;
delay_ms(500);
PORTC=0x04;
delay_ms(500);
PORTC=0x02;
delay_ms(500);
PORTC=0x01;
delay_ms(500); }
};
}

34
LATIHAN TAHAP – III

Motor yang digunakan disini adalah jenis motor DC dengan supply 5 Vdc.

(Percobaan 7) :

// mengaktifkan motor DC 1 dan 2


#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;

35
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0x05;
delay_ms(500);
};
}

(Percobaan 8) :

// mengaktifkan motor DC kanan-kiri


#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;

36
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
PORTC=0x06;
delay_ms(500);
};
}

(Percobaan 9)
// mengendalikan putaran motor menggunakan pushbutton
#include <mega16.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

37
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
if(PINA==0x10)
{
PORTC=0x00;
}
if(PINA==0x01)
{
PORTC=0x01;
}
if(PINA==0x02)
{
PORTC=0x02;
}
if(PINA==0x04)
{
PORTC=0x04;
}
if(PINA==0x08)
{
PORTC=0x08;
}
};
}

38
LATIHAN TAHAP – IV

Banyak yang beranggapan bahwa LCD (Liquid Crystal Display) dan Seven Segment hanyalah
sebagai media penampil saja, namun kedua jenis penampil ini tidak kalah penting karena setiap
kondisi yang ada saat akan diinformasikan melalui media ini sehingga bisa dilakukan tindakan
antisipasi jika terjadi kondisi yang tidak sesuai sistem.

(Percobaan 10) :

// penampil dengan 7-segment


#include <mega16.h>
#include <delay.h>
void main(void)
{
int data,sat,rat,pul;
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;

39
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
data=456;
sat = data %10;
pul = (data/10)% 10;
rat = data/100;
PORTC= 0X30 | rat;delay_ms(5);
PORTC= 0X50 | pul;delay_ms(5);
PORTC= 0X60 | sat;delay_ms(5);
};
}

(Percobaan 11) :
// menampilkan karakter pada LCD 16x2
#include <mega16.h>
#include <delay.h>
#asm
.equ __lcd_port=0x15 ;PORTC

40
#endasm
#include <lcd.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
while (1)
{
lcd_gotoxy(0,0);
lcd_putsf("Baris1.....");
lcd_gotoxy(6,1);
lcd_putsf("Baris2…..");
};
}

41
(Percobaan 12) :
// LCD geser kanan-kiri
#include <mega16.h>
#include <delay.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;

lcd_init(16);

while (1)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("geser kanan");

42
lcd_gotoxy(6,1);
lcd_putsf("geser kiri");
delay_ms(700);
lcd_clear();
lcd_gotoxy(3,0);
lcd_putsf("geser kanan");
lcd_gotoxy(3,1);
lcd_putsf("geser kiri");
delay_ms(700);
};
}

43
LATIHAN TAHAP – V

ADC merupakan salah satu perantaraan nilai analog untuk dapat terkonversi dalam

bentuk digital. Dengan menggunakan transduser, kita dapat menganalisa sinyal-sinyal analog

yang di akibatkan oleh temperatur, tekanan, kecepatan angin, berat benda dan lain-lain. Tanpa

menggunakan ADC ini mikrokontroller tidak dapat membaca data yang diberikan oleh sensor,

karena keluaran dari sensor ini adalah berupa sinyal analog sehingga perlu dilakukan konversi

sinyal supaya mikrokontroler dapat membaca data tersebut. Pada simulasi penggunaan ADC

disini, kita gunakan potensiometer (untuk menggantikan sensor) karena potensiometer dianggap

yang paling mudah kita rubah besarannya sesuai kebutuhan simulasi. Pada mikrokontroller

ATMega 16, pin ADC terdapat pada port A0 - A7.

44
(Percobaan 13)

// aplikasi ADC untuk output LED geser kanan-kiri


#include <mega16.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
int potensio1,hasil;
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;

45
ADCSRA=0x84;
while (1)
{
read_adc(0);
potensio1=read_adc(0);
hasil=potensio1*0.1474609375;
if(potensio1<200)
{
PORTC=0x01;
delay_ms(500);
PORTC=0x02;
delay_ms(500);
PORTC=0x04;
delay_ms(500);
PORTC=0x08;
delay_ms(500);
PORTC=0x10;
delay_ms(500);
PORTC=0x20;
delay_ms(500);
PORTC=0x40;
delay_ms(500);
PORTC=0x80;
delay_ms(500);
}
else
{
PORTC=0x80;
delay_ms(500);
PORTC=0x40;
delay_ms(500);
PORTC=0x20;
delay_ms(500);
PORTC=0x10;
delay_ms(500);
PORTC=0x08;
delay_ms(500);
PORTC=0x04;
delay_ms(500);
PORTC=0x02;
delay_ms(500);
PORTC=0x01;
delay_ms(500);
}
};
}

46
(Percobaan 14) :
// aplikasi sensor (pada ADC) mngendalikan motor putar kanan-kiri
#include <mega16.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void kiri1(void)
{
PORTC=0x01;
delay_ms(10);
}
void kanan1(void)
{
PORTC=0x02;
delay_ms(10);
}
void kiri2(void)
{
PORTC=0x04;
delay_ms(10);
}
void kanan2(void)
{
PORTC=0x08;
delay_ms(10);
}
int potensio1,potensio2,hasil1,hasil2;
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

47
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
while (1)
{
read_adc(0);
potensio1=read_adc(0);
hasil1=potensio1*0.1474609375;
if (hasil1<60)
{
kiri1();
}
else
{
kanan1();
}
read_adc(1);
potensio2=read_adc(1);
hasil2=potensio2*0.1474609375;
if (hasil2<60)
{
kiri2();
}
else
{
kanan2();
}
};
}

48
REFERENSI

Rachmad Setiawan, ”Teknik Akuisisi Data”, Graha Ilmu, 2008


Lingga Wardhana, ”Belajar Sendiri Mikrokontroler AVR seri ATMEGA 8535”, ANDI, 2006
http://www.klikdisini.com/embedded/Tutorial_Pemprograman_Mikrokontroller_v1.0
http://www.max-tron.com/Training_Microcontroller_for_Beginner

49

Anda mungkin juga menyukai