mikrokontroler.fix 2012

53
PRAKTIKUM III PEMROGRAMAN MIKROKONTROLER ATMEGA8535 I. Tujuan Percobaan 1. Mengenal Mikrokontroler AVR ATMega8535 serta mengetahui dan memahami prinsip kerja mikrokontroler 2. Mengenal dan menguasai pemrograman mikrokontroler AVR ATMega 8535 dengan menggunakan software Code Vision AVR 3. Mengetahui dan membuat aplikasi mikrokontroler sebagai pusat kontrol suatu sistem II. Alat dan Bahan Satu unit PC dengan dilengkapi software Code Vision AVR dan Proteus III. Dasar Teori 1. Bahasa Pemrograman C Sebelum kita memprogram mikrokontroller maka terlebih dahulu kita harus mengenal dulu bahasa pemrograman yang akan kita pakai untuk membuat program pada mikrokontroller tersebut, disini kita akan menggunakan bahasa pemrograman C.

Upload: srinyta-siregar

Post on 19-Jan-2016

5 views

Category:

Documents


0 download

DESCRIPTION

enjoy for reading

TRANSCRIPT

Page 1: Mikrokontroler.fix 2012

PRAKTIKUM III

PEMROGRAMAN MIKROKONTROLER

ATMEGA8535

I. Tujuan Percobaan

1. Mengenal Mikrokontroler AVR ATMega8535 serta mengetahui dan

memahami prinsip kerja mikrokontroler

2. Mengenal dan menguasai pemrograman mikrokontroler AVR ATMega

8535 dengan menggunakan software Code Vision AVR

3. Mengetahui dan membuat aplikasi mikrokontroler sebagai pusat kontrol

suatu sistem

II. Alat dan Bahan

Satu unit PC dengan dilengkapi software Code Vision AVR dan Proteus

III. Dasar Teori

1. Bahasa Pemrograman C

Sebelum kita memprogram mikrokontroller maka terlebih dahulu kita harus

mengenal dulu bahasa pemrograman yang akan kita pakai untuk membuat

program pada mikrokontroller tersebut, disini kita akan menggunakan bahasa

pemrograman C.

Bahasa C tidak jauh ubah nya dengan bahasa pemrograman yang lain, hanya ada

beberapa sintaks dan cara penulisan nya sedikit berbeda. Bahasa C ditulis dengan

memperhatikan struktur sebagai berikut :

a. Bagian Komentar

Komentar digunakan untuk memberi keterangan pada program agar

mudah dibaca dan akan diabaikan oleh kompiler. Komentar yang ditulis

tidak akan mempengaruhi besar nya program karena ketika kita compile

program tersebut komentar tidak akan di ikut sertakan.

Page 2: Mikrokontroler.fix 2012

Cara penulisan komentar pada bahasa C ada 2 cara :

1. /*................*/ cara ini di gunakan untuk menulis komentar bentuk

paragraf

2. // untuk komentar bentuk per baris (sebelum enter)

Contoh :

1. /* ini adalah komentar, dari tanda “/*”(tanda petik tidak disertakan)

sampai diakhiri dengan tanda “*/” maka apa yang ada didalam nya

adalah sebuah komentar */

2. // ini juga komentar

b. Bagian preprocessor

Preprocessor #include biasanya digunakan untuk menyertakan file

header(.h) atau file library. File include berguna untuk memberitahu

kompiler agar membaca file yang di include kan lebih dahulu agar

mengenali definisi – definisi yang diguanakn dalam program agar tidak

dianggap error.

Cara penulisan :

# include <.......> untuk lokasi standar file yang telah di setting oelh tools

biasanya pada folder include atau folder dir compiler

#include “.......” untuk lokasi file yang kita tentukan sendiri

File header io.h adalah file yang berisi segala informasi/definisi tentang

register – resister fungsi khusus (SFR) dan bit – bit atau pin

mikrokontroller.

Preprocessor #define diguanakan untuk mendefinisikan konstanta atau

makro

Cara penulisan :

#define hidup 1

Contoh diatas berarti setiap muncul hidup akan diganti dengan 1.

Page 3: Mikrokontroler.fix 2012

c. Bagian deklarasi variabel global

Dalam bahasa C terdapat 2 variabel yang bisa kita gunakan ada yang

Global dan ada juga yang lokal. Variabel global dideklarasikan diluar

semua fungsi termasuk fungsi utama dan letaknya wajib diatas. Sifat

variabel global yaitu dapat di akses ( dibaca/ditulis) oleh semua pernyataan

(statement) dalam program. Sedangkan variabel lokal dideklarasikan

didalam fungsi dan variabel ini hanya bisa digunakan di dalam fungsi

tersebut.

Cara penulisan :

TipeDATA namaVariabel;

Int angka_bulat;

d. Prototype fungsi

Berguna untuk mendeklarasikan fungsi yang ditulis dibawah fungsi main.

Jika kimembuat fungsi diatas main maka kita tidak usah mendeklarasikan

nya lagi.

Cara penulisan :

TipeDaTAnamaFUngsi(tipedata,,,,,,,,);

Atau

TipeDATA namaFungsi(tipedata namaparameter,,,,,,);

Tipe data didepan nama fungsi adalah tipe data nilai balik(output) fungsi.

Tipe data didepan naa parameter adlah tipe dataa parameter (input) fungsi.

e. Bagian fungsi utama/main

Fungsi utama adalah fungsi pertama yang akan dieksekusi dengan urutan

dari atas ke bawah dan akan melompat bergantung dengan intruksi

lompatan “goto” atau intruksi pemanggilan fungsi lain atau interuosi jika

interupsi di aktifkan.

Cara penulisan :

Pemanggilan fungsi lain dalam fungsi utama,

Page 4: Mikrokontroler.fix 2012

NAMA_Fungsi();

Fungsi nilai balik tanpa paramter,

VAriabelPENAMPUNG=Nama_Fungsi();

Untuk fungsi dengan nilai balik dan menggunakan parameter,

VariabelPenampung = NamaFungsi(Variabel_atau_konstanta, ..... , .....);

f. Bagian subprogram/fungsi

Fungsi yang telah di protype kan ditulis dibawah fungsi “main”. Prototype

fungsi berguna untuk memudahkan programmer daam penulisan program

yang besar. Jika kita membuat banyak fungsi dan tanpa kita prototype kan

maka harus ditulis diatas fungsi “main” dan ini menyulitkan untuk dibaca

dan diperbarui sehingga kita butuh prototype fungsi..

JEnis – jenis Tipedata

a. Void

Jika memerluka tipe data yang tidak mempunyai isi/nilai biasanya untuk

fungsi yang tidak mempunyai nilai balik atau fungsi 0 fungsi yang tidak

mempunyai paramter.

b. Char/signed char

Jika bilangan yang kita pakai/kita gunakan antara -128 sd 127

c. Unsigned char

Jika bilangan yang kita pakai anatara 0 sd 255

d. Int/signed int

Jika bilangan yang kita pakai anatara -32768 sd 32767

e. Unsigned int

Jika bilangan antara 0 sd 65535

f. Long/signed long

Jika bilangan anatara -2.147.483.648 sd 4/294.976.295

g. Float

Jika bilangan yang kita pakai adalah bilangan pecahan atau berkoma.

Page 5: Mikrokontroler.fix 2012

Kontrol Alir Program

Untuk mencerdaskan sebuah program, maka diperlukan sebuah algoritama

dimana terdiri dari berbagai pengendali ali program.

1. Pengendali bersyarat

a. If(.....){.....}

Digunakan untuk mengecek satu kondisi untuk satu blok jawaban

Cara penulisan :

If(benar_atau_salah)

{eksekusi_perintah_ini_jika_benar};

Flowchart :

b. If(.....){....} else {....}

Digunakan untuk mengcek satu kondisi untuk 2 blok jawaban

Cara penulisan :

If(Pernyataan_ini)

{maka_blok_ini}

Else

{eksekusi_ini_jika_tidak_memenuhi};

c. If(...){....}else if(......){......} else {....};

Digunakan untuk mengecek beberapa kondisi.

d. While(....){.....}

Digunakan untuk perulang/looping/iterasi jika kondisi yang di uji

bernilai benar.

Cara penulisan :

Page 6: Mikrokontroler.fix 2012

While (uji_kebenaran){selama_benar_maka_perintah_ini_dijalankan};

e. Do{.....}while(...)

Perbedaan dengan while adalah blok dieksekusi dulu baru di uji, hal

ini dapat terjadi kemungkinan yang diuji salah namun blok tetap di

eksekusi.

Cara penulisan :

Do{jalankan_blok_ini_selama_benar}while(uji_kebenran);

f. For(....;.....;...){...}

Digunakan untuk perulangan/loopinh/iterasi dengan kondisi yang

saudah ditentukan.

For(kondisi_awal;uji_kondisi;aksi_jika_benar)

{eksekusi_perintah_ini};

g. Switch

Digunakan untuk menguji satu variabel dengan beberpa jawaban.

Cara penulisan :

Switch(variabel_diuji)

{

Case _konstanta : pernyataan1; break;

Case _konstanta : pernyataan2; break;

Case _konstanta : pernyataan3; break;

Case _konstanta : pernyataan4; break;

Default : _penyataan_jika_dalam_case_tidak_ada;

}

Operator Aritmatik

Binary Operator Keterangan Contoh

+ Penambahan A=b+c

- Pengurangan A=b-c

* Perkalian A=b*c

Page 7: Mikrokontroler.fix 2012

/ Pembagian A=b/c

% Modulus A=b%c

Operator penugasan

Untuk memasukkan nilai kedalam suatu variabel

Penugasan Arti Contoh Keterangan

= Penugasan hasil A = 6+y -

+= Penugasan + A += 6 A = A +6

-= Penugasan - A -= 6 A = A – 6

*= Penugasan * A *=6 A = A * 6

/= Penugasan / A /= 6 A = A/6

%= Penugasan % A %= 6 A = A%6

<<= Penugasan << A <<= 6 A = A<<6

>>= Penugasan >> A >>= 6 A = A>>6

Operator relasional

Untuk menguji benar atau tidaknya hubuungan dua operand, jika hubungan benar

maka akan menghasilkan 1 dan jika salah 0

Operator Operasi Contoh

== Sama dengan If(A==6){A++}

Page 8: Mikrokontroler.fix 2012

!= Tidak sama dengan If(A!=6){A++}

> Lebih besar If(A>6){A++}

< Lebih kecil If(A<6){A++}

>= Lebih besar sama dengan If(A>=6){A++}

<= Lebih kecil sama dengan If(A<=6){A++}

Operator Bit

Untuk mengoperasikan anatar bit

Operator Operasi

& Meng and kan tiap pasangan bit

| Meng or kan tiap pasangan bit

^ Meng –exor kan tiap pasangan bit dan menghasilkan 1 jika

keduanya berbeda isi, dan 0 untuk yang lain.

~ Membalik isi tiap bit

>> Menggeser bit kekanan

<< Menggeser bit kekiri

Operasi logika Dasar

A B A&B A|B A^B ~B

0 0 0 0 0 1

0 1 0 1 1 0

1 0 0 1 1 1

Page 9: Mikrokontroler.fix 2012

1 1 1 1 0 0

Operator logika

Operator Operasi

&& Meng- and kan antar operand

|| Meng- or kan antar operand

! Not

Contoh :

Asal Ekspresi uji Hasil

A = 6 ((A>=4)&&(A<=10)) True

A = 12 ((A==4)||(A==5)) False

2. Penulisan Bahasa C pada Mikrokontoller

Untuk membuat program kita harus memahami dulu hardware yang kita gunakan.

Untuk

pelatihan kali ini kita akan menggunakan Mikrokontroller ATMega 8535 sebagai

chip kontroller nya.

Deskripsi Hardware

Page 10: Mikrokontroler.fix 2012

Mikrokontroler ATMEGA 8535 ini merupakan salah satu jenis dari

mikrokontroler keluarga AVR.

Gambar 2.4 Konfigurasi Pin mikrokontroler ATMEGA8535

Konfigurasi pin ATMega8535 bisa dilihat pada gambar 2.1. Dari gambar

tersebut dapat dijelaskan secara fungsional konfigurasi pin ATMEGA8535

sebagai berikut:

1. VCC merupakan pin yang berfungsi sebagai pin masukan tegangan untuk

mikrokontroler.

2. GND merupakan pin ground untuk mikrokontroler.

3. Port A (PA0..PA7) merupakan pin I/O dan pin masukan ADC.

4. Port B (PB0..PB7) merupakan pin I/O dan pin fungsi khusus, yaitu

Timer/Counter, interupsi, dan ISP.

5. Port C (PC0..PC7) merupakan pin I/O dan pin fungsi khusus, yaitu I2C,

dan Timer Oscillator.

6. Port D (PD0..PD7) merupakan pin I/O dan pin fungsi khusus, yaitu

7. RESET merupakan pin yang digunakan untuk me-reset mikrokontroler.

8. XTAL1 dan XTAL2 merupakan pin masukan clock eksternal.

9. AVCC merupakan pin masukan tegangan untuk ADC.

Page 11: Mikrokontroler.fix 2012

10. AREF merupakan pin masukan tegangan referensi ADC.

Timer/Counter pada Mikrokontroler

Pada mikrokontroler keluarga AVR terdapat salah satu fasilitas yaitu

timer/counter. Pada tugas akhir ini, fasilitas timer/counterdigunakan pada sensor

ultrasonik dan driver pengontrol motor servo.

Pada mikrokontrolerATMEGA8535terdapat 3 buahtimer/counter antara

laintimer/counter0,timer/counter1 dan timer/counter2, sedangkan pada

ATTiny2313 hanya terdapat timer/counter0 dan timer/counter1 saja.

Timer/Counter pada mikrokontrolerdilengkapidenganclockprescaler

(pemilihclock yang masukketimer/counter) hingga 10-bit (1024).

Timer/counter0memilikikesamaandengantimer/counter2, dimana

keduanyadapatmencacahsumber pulsa/clockbaikdaridalamchip

(timer)ataupundariluar chip (counter)dengankapasitas 8-bit atau 256 cacahan.

Sedangkan yang membedakankeduanyadengantimer/counter1

dikarenakantimer/counter1 dapatmencacahsumber pulsa/clockbaikdaridalam chip

(timer) ataupundariluar chip (counter) dengankapasitas 16-bit atau 65535

cacahan.

Pada timer/counterterdapat beberapa jenis register yang berperan penting

dalam proses kerja timer/countertersebut pada tugas akhir ini. Register-register

tersebut terdiri dari Timer/CounterRegister (TCNT), Outout Compare Register

(OCR), Timer/Counter Control Register (TCCR), dan Timer/Counter Interupt

Mask Register (TIMSK).

- Timer/CounterRegister (TCNT)

Register ini bertugas menghitung pulsa yang masuk ke dalam

timer/counter. Pada registerTCNT0dan register TCNT2, kapasitasnya adalah

8-bit atau 255 hitungan, sedangkan register TCNT1 memiliki kapasitas

sebesar 16 bit atau 65535 hitungan. Setelah mencapai hitungan maksimal

maka akan kembali ke nol.

Page 12: Mikrokontroler.fix 2012

- Outout Compare Register (OCR)

Register ini bertugas sebagai register pembanding yang bisa kita

tentukan besarnya sesuai dengan kebutuhan. Dalam praktiknya, pada saat

register TCNT mencacah maka otomatis oleh CPU akan dibandingkan

dengan isi dari register OCR secara kontinyu dan jika isi dari register TCNT

sama dengan register OCR maka akan terjadi Compare Match yang dapat

dimanfaatkan untuk mengeksekusi interupsi.

- Timer/Counter Control Register (TCCR)

Pada register ini terdapat beberapa register lagi yang bertugas

menentukan besar prescaler yang digunakan, mode yang digunakan pada

timer/counter, dan mengaktifkan output dari compare match.

- Timer/Counter Interupt Mask Register (TIMSK)

Pada register ini terdapat register TOIE (T/Co Overflow Interrupt

Enable) dan register OCIE (Output Compare Match Interrupt Enable).

Register TOIE berfungsi untuk mengaktifkan interupsi agar dapat digunakan

pada saat terjadi overflow, sedangkan register OCIE berfungsi untuk

mengaktifkan interupsi agar dapat digunakan pada saat terjadi compare

match.

Jenismodetimer yang digunakan untuk pelatihan ini antara lainmode

normal overflow dan mode normal compare match. Mode normal overflow

digunakan untuk pengukuran jarak pada sensor ultrasonik sedangkan mode

normal compare match digunakan pada pengontrol motor servo.

Modenormal overflow

DalammodeiniregisterpencacahTCNTxbekerja secara normal

mencacah/menghitungkeatas ataucounting-uphinggamencapai batas

maksimalnyakemudiankembalilagimenghitungdari batas awalnyaatau

yang disebutoverflow.

Setiapterjadioverflowdapatdimanfaatkanuntukmengeksekusiinterupsitimer

-x overflowjikainterupsitersebutdiaktifkan.

Page 13: Mikrokontroler.fix 2012

Batas/nilaiawaldariTCNTxtidakharusselaludimulaidari 0 tapi bisa

ditentukanberapapunsesuaidengankebutuhan.

Mode normal compare match

Dalammodeiniregister TCNT bekerjasepertimode normal overflow,

tapiketikaregisterOCRxkitaberinilai dan saatTCNTx =

OCRxmakaakanterjadicompare match. Setiapterjadinyacompare

matchdapatdimanfaatkanuntukmengeksekusiinterupsitimer-x compare

match. Ketikaterjadicompare match, register TCNT

akanmenghitungmulaidari 0 dan hinggaterjadicompare matchlagi.

Program Compiler

Porgram compiler yang kita gunakan pada pelatihan ini adalah Code Vision AVR

CodeVisionAVR

CodeVisionAVRmerupakansalahsatujenis program yang

dapatdigunakanuntukmemprogram semua jenis mikrokontroler dari keluarga

AVR. Programini menggunakanbahasa C sebagaibahasapemrogramannya.

Page 14: Mikrokontroler.fix 2012

InterfaceCodeVisionAVR

Gambar di atas menunjukkan jendela interface dari program

CodeVisionAVR, dimana pada interface tersebut terbagi dalam beberapa bagian

yaitu toolbar, messages, navigator dan jendela tempat penulisan program.

CodeVisionAVRmenyediakan suatu fasilitas yang bernama Code Wizard

AVR, dimana fasilitas ini mempermudah dalam pemilihan jenis mikrokontroler,

serta pengaktifan fasilitas-fasilitas dari mikrokontroler seperti timer, LCD,

input/output, external IRQ, dan lain-lainnya. Gambar di

bawahinimenunjukkanfasilitas dari Code Wizard AVR.

Code Wizard AVR

Keterangan tool pada toolbar CodeVisionAVR dapat dilihat pada tabel berikut :

Page 15: Mikrokontroler.fix 2012

Keterangantool pada toolbarCodeVisionAVR

Icon Nama Fungsi

Create New File Membuat file baru

Open File Menbuka file

Print File Mencetak file

Run the

CodeWizardAVR

Menjalankan fasilitas CodeWizardAVR

Check Syntax Memeriksa kesalahan penulisan bahasa

pemrograman

Run the Chip

Programmer

Menjalankan fasilitas Chip Programmer

Make the Project Men-download program ke mikrokontroler

Port sebagai input/output digital

ATmega8535 mempunyai empat buah port yang bernama PortA, PortB, PortC,

dan PortD.

Keempat port tersebut merupakan jalur bi-directional dengan pilihan internal pull-

up.

Tiap port mempunyai tiga buah register bit, yaitu DDxn, PORTxn, dan PINxn.

Huruf ‘x’

Page 16: Mikrokontroler.fix 2012

mewakili nama huruf dari port sedangkan huruf ‘n’ mewakili nomor bit. Bit

DDxn terdapat pada I/O address DDRx, bit PORTxn terdapat pada I/O address

PORTx, dan bit PINxn

terdapat pada I/O address PINx.

Bit DDxn dalam regiter DDRx (Data Direction Register) menentukan arah pin.

Bila DDxn

diset 1 maka Px berfungsi sebagai pin output. Bila DDxn diset 0 maka Px

berfungsi sebagai

pin input.

Bila PORTxn diset 1 pada saat pin terkonfigurasi sebagai pin input, maka resistor

pull-up

akan diaktifkan. Untuk mematikan resistor pull-up, PORTxn harus diset 0 atau pin

dikonfigurasi sebagai pin output. Pin port adalah tri-state setelah kondisi reset.

Bila PORTxn diset 1 pada saat pin terkonfigurasi sebagai pin output maka pin

port akan

berlogika 1. Dan bila PORTxn diset 0 pada saat pin terkonfigurasi sebagai pin

output maka

pin port akan berlogika 0.

Saat mengubah kondisi port dari kondisi tri-state (DDxn=0, PORTxn=0) ke

kondisi output

high (DDxn=1, PORTxn=1) maka harus ada kondisi peralihan apakah itu kondisi

pull-up

enabled (DDxn=0, PORTxn=1)atau kondisi output low (DDxn=1, PORTxn=0).

Biasanya,

Page 17: Mikrokontroler.fix 2012

kondisi pull-up enabled dapat diterima sepenuhnya, selama lingkungan impedansi

tinggi tidak

memperhatikan perbedaan antara sebuah strong high driver dengan sebuah pull-

up. Jika ini

bukan suatu masalah, maka bit PUD pada register SFIOR dapat diset 1 untuk

mematikan

semua pull-up dalam semua port.

Peralihan dari kondisi input dengan pull-up ke kondisi output low juga

menimbulkan masalah

yang sama. Kita harus menggunakan kondisi tri-state (DDxn=0, PORTxn=0) atau

kondisi

output high (DDxn=1, PORTxn=0) sebagai kondisi transisi.

Lebih detil mengenai port ini dapat dilihat pada manual datasheet dari IC

ATmega8535.

Bit 2 – PUD : Pull-up Disable

Page 18: Mikrokontroler.fix 2012

Bila bit diset bernilai 1 maka pull-up pada port I/O akan dimatikan walaupun

register DDxn

dan PORTxn dikonfigurasikan untuk menyalakan pull-up (DDxn=0, PORTxn=1).

Rutin-rutin standar

Pada software CodeVisionAVR telah disediakan beberapa rutin standar yang

dapat langsung

digunakan. Anda dapat melihat lebih detil pada manual dari CodeVisionAVR.

Beberapa

contoh fungsi yang telah disediakan antara lain adalah:

Fungsi LCD

Berada pada header lcd.h yang harus di-include-kan sebelum digunakan. Sebelum

melakukan

include terlebih dahulu disebutkan pada port mana LCD akan diletakkan. Hal ini

juga dapat

dengan mudah dilakukan dengan menggunakan CodeWizardAVR.

/* modul LCD dihubungkan dengan PORTC */

#asm

.equ __lcd_port=0x15

#endasm

/* sekarang fungsi LCD dapat di-include*/

#include <lcd.h>

Page 19: Mikrokontroler.fix 2012

Fungsi-fungsi untuk mengakses LCD diantaranya adalah :

• unsigned char lcd_init(unsigned char lcd_columns)

Untuk menginisialisasi modul LCD, menghapus layar dan meletakkan posisi

karakter pada baris ke-0 kolom ke-0. Jumlah kolom pada LCD harus disebutkan

(misal, 16). Kursor tidak ditampakkan. Nilai yang dikembalikan adalah 1 bila

modul LCD terdeteksi, dan bernilai 0 bila tidak terdapat modul LCD. Fungsi ini

harus dipanggil pertama kali sebelum menggunakan fungsi yang lain.

• void lcd_clear(void)

Menghapus layar LCD dan meletakkan posisi karakter pada baris ke-0 kolom ke-

0.

• void lcd_gotoxy(unsigned char x, unsigned char y)

Meletakkan posisi karakter pada kolom ke-x baris ke-y. Nomor baris dan kolom

dimulai dari nol.

• void lcd_putchar(char c)

Menampilkan karakter c pada LCD.

• void lcd_puts(char *str)

Menampilkan string yang disimpan pada SRAM pada LCD.

Fungsi Delay

Menghasilkan delay dalam program-C. Berada pada header delay.h yang harus

di-include-

kan sebelum digunakan. Sebelum memanggil fungsi, interrupsi harus dimatikan

terlebih

Page 20: Mikrokontroler.fix 2012

dahulu, bila tidak maka delay akan lebih lama dari yang diharapkan. Juga sangat

penting

untuk menyebutkan frekuensi clock chip IC AVR yang digunakan pada menu

Project-

Configure-C Compiler-Code Generation.

Fungsi delay yang disediakan adalah:

• void delay_us(unsigned int n)

menghasilkan delay selama n µ-detik, n adalah nilai konstan

• void delay_ms(unsigned int n)

menghasilkan delay selama n mili-detik, n adalah nilai konstan

Kedua fungsi tersebut secara otomatis akan me-reset watchdog-timer setiap 1

milidetik

dengan mengaktifkan instruksi wdr.

Fungsi ADC

ADC (Analog to Digital Converter) ini adalah salah satu fitur yang di miliki oleh

AVR yang berguna sebagai input dari data analog yagn di convert langsung oleh

mikrokontroler menjadi cata digital dan langsung dapat diolah.

Cara mengaktifkan ADC :

Pada wizard code vision, kita bisa langsung mengaktifkn ADC.

- Pilih ADC

- Pilih/ centang ADC enabled : ini digunakan untuk mengaktifkan ADC kita

- Centang Use 8 bits : fitur ini jika kita menggunakan data 8 bit

Page 21: Mikrokontroler.fix 2012

-

Kode berikut akan otomatis tampil setelah kita mengtur nya dari wizard tadi.

Untuk memanggil fungsi ADC maka kita memakai code sebagai berikut :

Data = read_adc(0);

3. Motor dan Sensor

Untuk menjalankan sebuah robot tentu kita membutuhkan yang nama

nya driver motor untuk itu kita akan belajar bagaimana memprogram motor

menggunakan timer dan tanpa timer.

Program motor tanpa timer :

- Buka code vision

- Pilih new – project

- Pilih jenis Chip

Page 22: Mikrokontroler.fix 2012

- Pilih Port D sebagai Output

-

- Setelah itu pilih generate – save and exit

- Setelah langkah diatas beres, sekarang kita definisikan dulu letak port

untuk motor kita

#define kanan1 PORTD.0

#define kanan2 PORTD.1

#define kiri1 PORTD.2

#define kiri2 PORTD.3

Tulis kode berikut :

void maju()

{kanan1=1;

kanan2=0;

kiri1=1;

Page 23: Mikrokontroler.fix 2012

kiri2=0;

}

void mundur()

{kanan1=0;

kanan2=1;

kiri1=0;

kiri2=1;

}

Untuk belok kekanan dan kekiri salah satu roda mundur atau bisa juga kita

buat salah satu roda berhenti.

Roda mundur :

void kanan()

{kanan1=0;

kanan2=1;

kiri1=1;

kiri2=0;

}

void kiri()

{kanan1=1;

kanan2=0;

kiri1=1;

Page 24: Mikrokontroler.fix 2012

kiri2=0;

}

Hayo .... untuk roda berhenti salah satu gimana???

Temukan cara nya... silahkan...

Untuk berhenti :

void stop()

{kanan1=1;

kanan2=1;

kiri1=1;

kiri2=1;

}

Atau bisa juga :

void stop()

{kanan1=0;

kanan2=0;

kiri1=0;

kiri2=0;

}

Sekarang temukan perbedaan nya????

Hehehehehhe

Page 25: Mikrokontroler.fix 2012

Skrang kita buat program menggunakan timer agar kita bisa mengatur

kecepatan dari motor. Sebelum kita mulai, maka kita harus mengetahui dulu

bahwa kecepatan motor itu dari 0 – 255 sesuai dengan variabel yg kita

gunakan yaitu unsigned char.

Setelah itu lakukan perintah dibawah ini :

#define ka1 PORTD.0

#define ka2 PORTD.1

#define ki1 PORTD.2

#define ki2 PORTD.3

Setelah mendefinisikan letak input dan output, definisikan motor kanan dan kiri,

lalu definisikan arah maju dan mundur

#define kanan 1

#define kiri 0

#define maju 1

Page 26: Mikrokontroler.fix 2012

#define mundur 0

Membuat Program PWM Algoritma :

1. Tentukan motor (kanan / kiri)

2. Pilih arah (maju / mundur)

3. Jika maju in1 = 1 dan in2 =0

4. Jika mundur in1 = 0 dan in = 1

Flowchart

Sintaks :

start

Motor Kanan/KiriUnsigned char Motor, arah,

kecepatan

If

Kanan = 1

Maju

Mundur

Arah

Kiri

IfIn 1 = 0In 2 =1

In 1 = 1In 2 =0

Out motor

OCR1A/BPWM

Page 27: Mikrokontroler.fix 2012

Void roda(unsigned char motor, unsigned char arah, unsigned char pwm)

If(motor = 1)

{if(arah=1)

{in1=1;

In2=0;}

Else

{in1=0;

In2=1;}

OCR1A = pwm;

}

Else

{if(arah=1)

{in1=1;

In2=0;}

Else

{in1=0;

In2=1;}

OCR1B = pwm;

}

Program ini nanti nya dipanggil dengan cara :

roda(kanan, maju, 200);

Page 28: Mikrokontroler.fix 2012

roda(kiri, maju, 200);

Pemrograman Motor servo

- Sama seperti motor DC tadi port yang digunakan masih tetap port D

dengan kondisi sebagai output.

- Kemudian definisikan port servo nya, varibel nya dan buat fungsi servo

sebagai berikut.

#define servo PORTD.0

// Declare your global variables here

unsigned char i, j;

void servo1(unsigned char data)

{

unsigned char i, j;

for(i=1;i<=40;i++)

{

servo=1;

for(j=1;j<=data;j++)

delay_us(10);

servo=0;

delay_ms(10);

}

}

Page 29: Mikrokontroler.fix 2012

- Setelah itu kita masuk keprogram utama untuk memanggil fungsi servo

tersebut secara sudut. Berikut code nya :

void servo_jalan()

{servo1(0);//sudut 0 adalah sudut awal servo

delay_ms(500);//delay untuk waktu yang akan ditempuh selama sudut 0

servo1(20);

delay_ms(500);

servo1(40);

delay_ms(500);

servo1(60);

delay_ms(500);

servo1(80);

delay_ms(500);

servo1(100);

delay_ms(500);

servo1(120);

delay_ms(500);

servo1(130);

delay_ms(500);

servo1(150);

delay_ms(500);

Page 30: Mikrokontroler.fix 2012

servo1(170);

delay_ms(500);

servo1(190);

delay_ms(500);

servo1(210);

delay_ms(500);

servo1(240);

delay_ms(500);

servo1(270);

delay_ms(500);

}*

setelah kita beres dengan motor maka kita akan beralih dengan pemanggilan indra

dari rrobot yaitu sensor.

Ok deh kalo ada yang mau ngopi atau makan kue boleh...

Hehehehehe

Program LCD

- Setting wizard LCD sebagai berikut

Page 31: Mikrokontroler.fix 2012

- Setelah lcd kita setting pada wizard maka otomatis akan muncul kode –

kode untuk lcd.

- Seakarang kita sudah bisa memanggil fungsi lcd pada program utama.

Kode nya sebagai berikut :

lcd_gotoxy(0,0);

lcd_putsf("coba");

- Sekarang kita buat tulisan LCD berjalan dengan algoritma, charachter

setiap lcd bergeser 1 bit atau 1 posisi kekanan dan kekiri.

- Tuliskan kode fungsi sebagai berikut :

void kiri()

{ for (x=0; x<=15; x++)

{ lcd_clear();

lcd_gotoxy(x,0);

lcd_putsf("AK");

delay_ms(500);

} // menggeser dari kiri ke kanan dengan delay 0.5

}

void kanan()

Page 32: Mikrokontroler.fix 2012

{for (x=15; x>=0; x--)

{

lcd_clear();

lcd_gotoxy(x,0);

lcd_putsf("AK");

delay_ms(500);

}

// menggeser dari kanan ke kiri dengan delay 0.5 detik

}

- Sekarang panggil fungsi – fungsi ini pada fungsi utama.

4. Mensimulasikan rangkaian berbasis mikrokontroler dengan proteus

PROTEUS adalah salah satu software simulator rangkaiandanjugapcb

designer terbaik di dunia. PROTEUS merupakan software yang

dibuatolehlabcenter electronics.Dengan menggunakan PROTEUS kita dapat

mengetahui cara kerja rangkaian berbasis mikrokontroler dengan

mensimulasikannya. PROTEUS juga memudahkan kita dalam membuat simulasi

rangkaian ataupun mendesign PCB dikarenakan memiliki banyak sekali

perpustakaan(library) komponendidalamnya. PROTEUS terdiriatasdua software

dalamsatupaket, yaitu ISIS dan ARES.ISIS digunakansebagai simulator rangkaian

listrik sedangkan ARES digunakan untuk mendesign layout PCB.

SIMULASI RANGKAIAN ADC DENGAN TAMPILAN LCD

1. Jalankan ISIS PROTEUS maka akan muncul tampilan lembar kerja seperti

dibawah

Page 33: Mikrokontroler.fix 2012

2. Disamping kiri lembar kerja terdapat beberapa toolbar yang berfungsi

menampilkan komponen hingga alat ukur

3.

4. Klik toolbar component mode pada PROTEUS

5. Setelah itu klik perintah pick from libraries

Component mode

Page 34: Mikrokontroler.fix 2012

6. Akan muncultampilan yang memunculkans eluruh komponen yang ada

pada ISIS

7. Lalubuatrangkaiansepertidibawahini

Page 35: Mikrokontroler.fix 2012

8. Setelah selesai membuat rangkaian seperti diatas kita dapat memasukkan

program yang telah kita buat dengan cara mendouble klik gamba

rmikrokontroler. Lalu akan muncul tampilan sepertidi bawahini.

9. Kita hanya tinggal memasukkan file berekstensi .hex pada program file

Page 36: Mikrokontroler.fix 2012

Contoh program ADC 10 bit :

/*****************************************************

This program was produced by the

CodeWizardAVR V2.03.9 Standard

Automatic Program Generator

© Copyright 1998-2008 PavelHaiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

Project :

Version :

Date : 3/1/2012

Author :dedek

Company :unsri

Comments:

Chip type : ATmega8535

Program type : Application

AVR Core Clock frequency: 11.059200 MHz

Memory model : Small

External RAM size : 0

Data Stack size : 128

*****************************************************/

#include <mega8535.h>

#include <delay.h>

#include <stdlib.h>

#define ADC_VREF_TYPE 0x00

Page 37: Mikrokontroler.fix 2012

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Read the AD conversion result

int i;

char temp[10];

unsignedintread_adc(unsigned char adc_input)

{

ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

// Delay needed for the stabilization of the ADC input voltage

delay_us(10);

// Start the AD conversion

ADCSRA|=0x40;

// Wait for the AD conversion to complete

while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

return ADCW;

}

// Declare your global variables here

void main(void)

{

// Declare your local variables here

// Input/Output Ports initialization

// Port A initialization

Page 38: Mikrokontroler.fix 2012

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In

Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T

State0=T

PORTA=0x00;

DDRA=0x00;

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In

Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T

State0=T

PORTB=0x00;

DDRB=0x00;

// Port C initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In

Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T

State0=T

PORTC=0x00;

DDRC=0x00;

// Port D initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In

Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T

State0=T

PORTD=0x00;

DDRD=0xff;

Page 39: Mikrokontroler.fix 2012

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

Page 40: Mikrokontroler.fix 2012

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0x00;

MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

// ADC initialization

// ADC Clock frequency: 345.600 kHz

// ADC Voltage Reference: AREF pin

// ADC High Speed Mode: Off

// ADC Auto Trigger Source: None

ADMUX=ADC_VREF_TYPE & 0xff;

Page 41: Mikrokontroler.fix 2012

ADCSRA=0x85;

SFIOR&=0xEF;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

i=read_adc(0);

lcd_clear();

lcd_gotoxy(0,0);

itoa(i,temp);

lcd_puts(temp);

delay_ms(10);

};

}

Dari contoh program diatas maka akan didapat pembacaan nilai ADC pada

simulasi seperti gambar dibawah. Dengan mengubah besar nilai referensi

tegangan pada potensio meter maka nilai ADC yang terbaca juga akan

berubah.

Page 42: Mikrokontroler.fix 2012

Gambar 1

Gambar 2

Page 43: Mikrokontroler.fix 2012