modul bahasa c

48
Modul Pelatihan Robot Line Follower Berbasis Mikrokontroler LSO – Robotika Fakultas Teknik Universitas Muhammadiyah Malang

Upload: ali-end

Post on 26-Nov-2015

171 views

Category:

Documents


9 download

TRANSCRIPT

  • Modul Pelatihan

    Robot Line Follower

    Berbasis Mikrokontroler

    LSO Robotika

    Fakultas Teknik

    Universitas Muhammadiyah Malang

  • i

    Preface

    Judul Asli : Modul Robot Line Follower Berbasis Mikrokontroler

    Penulis : Novendra Setyawan

    Pengawas : Khusnul Hidayat, S.T.

    Penata Grafis & Editor : Aulia Arif Wardana

    Copyright LSO Robotika

    Fakultas Teknik

    Universitas Muhammadiyah Malang

    2012

    Modul ini dibuat sebagai salah satu program dan tujuan LSO Robotika dalam

    hal Bakti Pendidikan. Hak cipta dilindungi undang - undang. Barang siapa

    memperbanyak atau menjiplak modul ini, harus seizin LSO Robotika FT UMM.

    Modul ini bersifat bebas untuk dipergunakan atau diperbanyak, tapi tidak untuk

    diperjual belikan oleh umum.

    Website : lso-robotika.umm.ac.id

    Email : [email protected]

    Diterbitkan sendiri oleh : LSO - Robotika FT UMM, 2012

    Tingkatan : Dasar Menengah

    Terimakasih,

    Regards LSO Robotika FT UMM

  • ii

    Pendahuluan

    Bismillahirrahmanirrahim,

    Puji syukur kita panjatkan kehadirat Allah Yang Maha Esa atas segala

    rahmat dan karunia-Nya sehingga Modul Pelatihan Robot Line Follower Berbasis

    Mikrokontroler dapat diwujudkan. Modul ini dikemas sebagai pegangan bagi

    peserta didik dalam pelatihan robot yang di selenggarakan oleh LSO-Robotika FT

    UMM. Modul ini memiliki peran strategis dalam perkembangan belajar dan

    mengajar pada satu pelatihan, serta merupakan petunjuk praktis agar peserta

    didik lebih mandiri dalam belajar.

    Modul ini adalah bukti komitmen kami dalam hal Bakti pada Pendidikan,

    melalui pengalaman kami di bidang robotika kami turut andil untuk membagi ilmu

    dan mengajarkan ilmu yang kami dapat kepada peserta didik / peserta

    pelatihan. Akhirnya dengan ini kami mengharapkan Modul Pelatihan ini dapat

    dijadikan petunjuk dan dipergunakan dengan sebaik-baiknya.

    Salam Robotika,

    LSO-Robotika FT UMM.

  • iii

    Daftar Isi

    Preface ....................................................................................... i

    Pendahuluan ............................................................................. ii

    Daftar Isi ...................................................................................... iii

    Pengenalan Bahasa C ........................................................... 1

    I/O (Input dan Output) ........................................................... 11

    LCD ........................................................................................... 22

    ADC (Analog Digital Converter) ........................................... 29

    PWM (Pulse Width Modulation) ............................................. 36

  • Robotics Team

    University of Muhammadiyah Malang

    Bakti Pendidikan

  • 1

    Pengenalan Bahasa C

    Bahasa C tidak mengenal penulisan dalam kolom, yang ia kenal hanya

    penulisan di tiap barisnya. Namun demikian, untuk mempermudah pembacaan

    program dan untuk keperluan dokumentasi, sebaiknya penulisan bahasa C diatur

    sedemikian rupa sehingga mudah dan enak dibaca.

    Berikut contoh penulisan Program Bahasa C:

    #include

    #include

    main ()

    {

    }

    Pengarah Praprosesor

    Contoh pengarahan praprosesor dalam penulisan diatas adalah

    #include. Pengarah praprosesor ini dipakai untuk membaca file yang

    dipakai sebagai header atau library. Contohnya adalah #include

    , mega8535.h adalah penunjuk praprosesor yang mengarahkan

    menuju file header atau library pada AT Mega 8535. File-file ini mempunyai ciri

    yaitu namanya diakhiri dengan ekstensi .h .

    Fungsi Penulisan

    Dalam penulisan bahasa C selalu berbentuk sebuah Fungsi contohnya adalah

    main ( )

    {

    ;

    ;

    }

  • 2

    Contoh diatas adalah fungsi utama pada program bahasa C. Tanda ( { )

    adalah tanda untuk mengawali bagan atau tubuh program, sedangkan tanda ( }

    ) adalah tanda akhir dari tubuh program .

    Tanda ( ) pada Main ( ) merupakan tanda yang berisikan sebuah argument

    atau sebuah variabel nilai yang disertakan dalam tubuh program. Dalam

    penulisan pernyatan dalam bahasa C harus diahiri dengan tanda ( ; ).

    Tipe Data

    Tipe data merupakan bagian program yang paling penting karena tipe data

    mempengaruhi setiap instruksi yang akan dilaksanakan oleh computer. Misalnya

    saja 5 dibagi 2 bisa saja menghasilkan hasil yang berbeda tergantung tipe

    datanya. Jika 5 dan 2 bertipe integer maka akan menghasilkan nilai 2, namun jika

    keduanya bertipe float maka akan menghasilkan nilai 2.5000000. Pemilihan tipe

    data yang tepat akan membuat proses operasi data menjadi lebih efisien dan

    efektif.

    No Tipe Data Ukuran Jangkauan

    1 Char 1 Byte -128 s/d 127

    2 Unsigned char 1 byte 0 s/d 255

    3 Int 2 Byte -32768 s/d 32767

    4 Unsigned int 2 byte 0 s/d 65535

    5 Long Int 4 byte -2147483648 s/d 2147483648

    6 Unsigned Long int 4 byte 0 s/d 4294967296

    7 Float 4 byte -3.4E-38 s/d 3.4E+38

    8 Double 8 byte 1.7E-308 s/d 1.7E+308

    9 Long Double 10 byte 3.4E-4932 s/d 1.1E+4932

  • 3

    Deklarasi

    Deklarasi Variabel

    Variabel adalah suatu pengenal (identifier) yang digunakan untuk mewakili

    suatu nilai tertentu di dalam proses program. Bentuk umum pendeklarasian

    suatu variable adalah : Nama_tipe nama_variabel;

    Contoh :

    int x; // Deklarasi x bertipe integer

    Dengan demikian x merupakan sebuah variabel dengan tipe data integer.

    Jadi jangkauan nilai x dari -32768 s/d 32767.

    Deklarasi Konstanta

    Konstanta merupakan suatu nilai yang tidak dapat diubah selama proses

    program berlangsung. Dalam bahasa C konstanta dideklarasikan

    menggunakan preprocessor #define.

    Contohnya :

    #define PHI 3.14

    (atau)

    #define nim 0111500382

    Deklarasi Fungsi

    Fungsi merupakan bagian yang terpisah dari program dan dapat diaktifkan

    atau dipanggil di manapun di dalam program. Fungsi dalam bahasa C ada yang

    sudah disediakan sebagai fungsi pustaka seperti printf(), scanf(), getch()

    dan untuk menggunakannya tidak perlu dideklarasikan.

    Fungsi yang perlu dideklarasikan terlebih dahulu adalah fungsi yang dibuat

    oleh programmer. Bentuk umum deklarasi sebuah fungsi adalah :

    Tipe_fungsi nama_fungsi(parameter_fungsi);

  • 4

    Contohnya :

    float luas_lingkaran(int jari);

    void tampil();

    int tambah(int x, int y);

    Operator

    Operator merupakan suatu symbol atau tanda yang digunakan sebagai

    perintah dalam eksekusi program.

    No Operator Arti Contoh

    1 + Penjumlahan X=A+B

    2 - Pengurangan X=A-B

    3 / Pembagian X=A/B

    4 * Perkalian X=A*B

    5 < Kurang Dari A= Lebih dari sama

    dengan

    A>=B

    9 == Sama Dengan A==B

    10 != Tidak Sama Dengan A!=B

    11 && Dan Jika A && B (Operand And)

    12 || Atau Jika A|| B (Operand Or)

    13 ! Not !A (Menyatakan Bukan A)

    14 ++ Penjumlahan 1 X++ memilki arti (X=X+1)

    15 -- Pengurangan 1 X-- memilki arti (X=X-1)

    Operator Bitwise (MANIPULASI PER BIT)

    Operator bitwise digunakan untuk memanipulasi bit-bit dari nilai data yang ada

    di memori. Operator bitwise dalam bahasa C di SDCC adalah sebagai berikut :

  • 5

    > 2 ; // 0x03 digeser kekanan 2 bit hasilnya ditampung di

    datanya

    Atau

    A >> = 1 // Isi variabel A digeser ke kanan 1 bit hasilnya

    // kembali disimpan di A

    & : Bitwise AND

    Contoh:

    Hasil = 0x03 & 0x31;

    Operasinya

    0x03 = 00000011

    0x31 = 00110001

    ________________________________________________

    Hasil 0x01 = 00000001

    | : Bitwise OR

    Contoh:

    Hasil = 0x05 | 0x31;

    Operasinya

    0x01 = 00000001

    0x31 = 00110001

    ________________________________________________

  • 6

    Hasil 0x01 = 00110001

    ^ : Bitwise XOR (exclusive OR)

    Contoh:

    Hasil = 0x02 ^ 0xFA;

    Operasinya

    0x02 = 00000010

    0xFA= 11111010

    ________________________________________________

    Hasil 0x01 = 11111000

    ~ : Bitwise NOT

    Contoh:

    Hasil = ~ 0x31;

    0x31 = 00110001

    Hasil=~0x31 = 11001110 atau Hasil = 11001110

    Struktur Kondisi

    If

    Struktur if dibentuk dari pernyataan if dan sering digunakan untuk menyeleksi

    suatu kondisi tunggal. Bila proses yang diseleksi terpenuhi atau bernilai benar,

    maka pernyataan yang ada di dalam blok if akan diproses dan dikerjakan.

    Bentuk umum struktur kondisi if adalah :

    if(kondisi){

    pernyataan};

    Contoh:

    if(X

  • 7

    Dalam struktur kondisi if.....else minimal terdapat dua pernyataan. Jika kondisi

    yang diperiksa bernilai benar atau terpenuhi maka pernyataan pertama yang

    dilaksanakan dan jika kondisi yang diperiksa bernilai salah maka pernyataan

    yang kedua yang dilaksanakan. Bentuk umumnya adalah sebagai berikut :

    if(kondisi){

    pernyataan-1};

    else{

    pernyataan-2};

    Contoh:

    if(X

  • 8

    case n : pernyataan-n;break;

    default : pernyataan-m;}

    Contoh:

    switch(A)

    {

    case 0: X=X+1;break; //Jika A=0 maka X=X+1 Dieksekusi dan

    mengecek kondisi lagi

    case 1: X=X+2;break; //Jika A=1 maka X=X+2 Dieksekusi dan

    mengecek kondisi lagi

    case 2: X=X+3;break; //Jika A=2 maka X=X+3 Dieksekusi dan

    mengecek kondisi lagi

    case 3: X=X+4;break; //Jika A=3 maka X=X+4 Dieksekusi dan

    mengecek kondisi lagi

    case 4: X=X+5;break; //Jika A=4 maka X=X+5 Dieksekusi dan

    mengecek kondisi lagi

    case 5: X=X+6;break; //Jika A=5 maka X=X+6 Dieksekusi dan

    mengecek kondisi lagi

    default: X=X+0;break; //Jika A tidak sama dengan 0,1,2,3,4,5

    maka X=X+0

    } //Dieksekusi dan mengecek kondisi lagi

    While

    Perulangan WHILE banyak digunakan pada program yang terstruktur.

    Perulangan ini banyak digunakan bila jumlah perulangannya belum diketahui.

    Proses perulangan akan terus berlanjut selama kondisinya bernilai benar (true)

    dan akan berhenti bila kondisinya bernilai salah.

    Bentuk umum dari struktur kondisi ini adalah:

    While (ekspresi)

    {

    Pernyataan_1

    Pernyataan_2

    }

  • 9

    Contoh :

    While(A

  • 10

    perulangan for tampaknya lebih efisien karena susunannya lebih simpel dan

    sederhana.

    Bentuk umum perulangan for adalah sebagai berikut :

    for(inisialisasi; syarat; penambahan){

    pernyataan;}

    Contoh:

    for(A=10;A>=0;A--){ // nilai A=10 dan akan dikurangi 1 hingga A>=0

    X=A+1;} // nilai X akan sama dengan nilai A+1

  • 11

    I/O (Input/Output)

    Pada bab ini akan membahas tentang fungsi mikrokontroler sebagai input

    maupun output. Pada ic mikrokontroler terdapat beberpa kaki ic (pin/port pada

    ic) yang dapat digunakan sebagai inputan maupun outputan. Contohnya pada

    mikrokontroler berjenis AVR pada tipe AT-Mega 8 mempunyai 23 port sebagai I/O.

    Berikut adalah gambar konfigurasi pin pada ic AT-Mega 8

    Dari gambar diatas 23 pin I/O adalah PC0-PC5, PB0-PB7,dan PD0-PD7. Pada

    penggunanya sebagai I/O terdapat suatu istilah dalam configurasi atau settingan

    yang harus di ketahui khususnya dalam pemrogram menggunakan Code Vision

    AVR. Istilah itu adalah PORTX.N dan DDRX.N. Maksud dari PORTX.N adalah X

    menandakan Abjad dan N adalah menandakan pin. Misalkan PORTB.7 maka itu

    menunjukan PB7 pada gambar diatas, hal itu juga berlaku pada DDRX.N.

  • 12

    DDRX.N adalah suatu konfigurasi yang menyatakan apakah suatu PORTX.N

    sebagai inputan atau outputan. Jika dalam pengaplikasianya DDRB.0 = 1 maka

    PB0 disetting sebagai outputan, sebaliknya jika DDRB.0 = 0 maka PB0 disetting

    sebagai inputan. Jika menggunakan CVAVR penyettingan ini juga bisa disetting

    langsung pada dialog box berikut:

    dari gambar tersebut kita dapat mensetting PORTA dari bit ke 0 sampai bit ke 7

    pada tanda panah diatas. Gambar diatas menunjukan sebuah setingan dimana

    PORTA bit 0- bit 7 diseting sebagai inputan.

    Pada I/O , PORTX.N digunakan sebagai pernyataan apakah sebuah pin dalam

    ic berlogikan 0 (mengeluarkan 0 volt) atau berlogika 1 (mengeluarkan 3-5volt).

    Misalkan PORTA.1=1; maka pada pin PA1 akan mengeluarkan tegangan 3-5 volt.

    Sebaliknya jika PORTA.1=0; maka PA1 akan berlogika 0 dan mengeluarkan

    tegangan 0 volt.

  • 13

    Latihan 1

    Pada latihan 1 kita akan menyalakan led secara bergantian. Langkah-

    langkah yang harus kita jalankan adalah:

    Setelah membuka program CVAVR pada PC click File kemudian New.

    Pada kotak dialog berikut klik project lalu OK dan OK kembali pada printah

    selanjutnya.

    Setelah itu kita setting jenis mikro yang kita gunakan pada kotak dialog

    berikut dengan AT-Mega 8

  • 14

    Setelah itu kita setting pin yang digunakas sebagai Output pada kotak

    dialog Ports

  • 15

    Setting PORTB Sebagai output semua.

    Setelah itu kita klik Program, generate program and save, dan kita ketik

    nama file (project) pada kotak dialog.

    Berikut adalah contoh listing program penyalaan led

    #include

    #include

    void main(void)

    {

    int a;

    PORTB=0x00;

    DDRB=0xFF;

    while (1)

    {

    for(a=0;a

  • 16

    Cara kerja program :

    Pada progam ini kita akan menyalakan led secara bergantian. Untuk itu

    diperlukan pendeklarasian register untuk mikrokontroler AT-Mega 8

    dan delay . Setelah itu langsung kepada main program. Padamain

    program terdapan inisialisasi dimana sebuah variabel a diinisialisasikan dengan

    tipe data integer yang berarti bernilai antara -32768 s/d 32767.

    Setelah itu ada inisialisasi selanjutnya yaitu PORTB=0x00; yang berarti pada saat

    awal program berjalan semua pin yang ada pada PORTB berlogika 0. Setelah

    menginisialisasi nilai awal PORTB, kemudian kita inisialisasi PORTB sebagai outputan

    dengan memberikan nilai pada DDRB=0xFF; yang berarti semua pin pada PORTB

    adalah outputan.

    Pada program ini terdapat suatu fungsi perulangan dalam while (1) yang berarti

    melakukan suatu pernyataan yang terus berulang tanpa ada sarat untuk

    berhenti. Selanjutnya adalah fungsi dalam for(a=0;a

  • 17

    Program itu dapat kita simulasikan pada aplikasi program Proteus dengan

    gambar sebagai berikut.

    (Buka pada folder Rangkaian ISIS dengan nama Latihan 1)

    Latihan 2

    Pada latihan 2 kita akan menyalakan beberapa led dengan sebuah inputan

    berupa push button, dengan langkah langkah sebagai berikut.

    Setelah membuka program CVAVR pada PC, click File kemudian New.

    Pada kotak dialog berikut klik project lalu OK dan OK kembali pada printah

    selanjutnya.

  • 18

    Setelah itu kita setting jenis mikro yang kita gunakan pada kotak dialog

    berikut dengan AT-Mega 8

  • 19

    Setelah itu kita setting pin yang digunakas sebagai Output pada kotak

    dialog Ports

    Setting PORTB Sebagai output semua.

    Setting PINC.0 dan PINC.1 Sebagai input.

    Setelah itu kita klik Program, generate program and save, dan kita ketik

    nama file (project) pada kotak dialog.

    Berikut adalah contoh listing program

    #include

    #include

  • 20

    #define tombol_1 PINC.0

    #define tombol_2 PINC.1

    void main(void)

    {

    int a;

    PORTB=0x00;

    DDRB=0xFF;

    PORTC=0x03;

    DDRC=0x00;

    while(10)

    {

    delay_ms(10);

    if(!tombol_1){

    PORTB=0xFF;

    }

    else if(!tombol_2){

    for(a=0;a

  • 21

    Pada perulangan While(1) terdapat fungsi if else dimana pada fungsi

    if yang pertama jika kita tekan tombol_1 maka akan menghasilkan logic 0 pada

    PINC.0 dan jika kondisi itu terpenuhi maka terdapan pernyataan yang akan di

    eksekusi yaitu PORTB=0xFF; yang berarti akan memberi outputan 1 kepada

    semua pin pada PORTB. Kemudia pada fungsi if yang ke dua terdapat sebuah

    kondisi dimana jika tombol_2 ditekan maka akan memberikan logic 0 pada

    PINC.1 dan jika itu terpenuhi maka akan meng eksekusi pernyataan yang sama

    pada latihan 1. Jika semua kondisi itu tidak terpenuhi maka akan mengeksekusi

    pernyataan PORTB=0, yang akan mematikan semua led.

    Program itu dapat disimulasikan pada aplikasi program Proteus dengan

    gambar sebagai berikut.

    (Buka pada folder Rangkaian ISIS dengan nama Latihan 2)

  • 22

    LCD

    Pada bab ini akan dibahas tentang bagaimana menggunakan LCD dan

    konfigurasi untuk menggunakanya. LCD yang biasa digunakan pada

    mikrokontroler adalah LCD modul type M1632. Modul tersebut memiliki berdimensi

    16x2 yang berarti 16 baris karakter dan memiliki 2 kolom, jadi dapat menampilkan .

    Dalam penggunaanya LCD modul M1632 memiliki konfigurasi sebagai berikut.

    Pin 1 (Vss)

    Vss merupakan pin sambungan untuk satu daya 0 volt.

    Pin 2 (Vdd)

    Vdd meupakan sambungan catudaya 5 volt

    Pin 3 (Vee)

    Merupakan pin kontrol Vcc yang digunakan untuk mengatur kontras display.

    Pin 4 (RS)

    Merupakan register select (RS), masukan yang pertama dari tiga command

    control input. Dengan membuat RS menjadi high, data karakter dapat

    ditransfer dari dan menuju modulnya.

    Pin 5 (R/W)

    Read/Write (R/W). Untuk memfungsikan sebagai perintah Write maka R/W

    low atau menulis karakter ke modul.

  • 23

    Pin 6 (Enable)

    Enable (E), input ini digunakan untuk transfer aktual dari perintahperintah

    atau karakter antara modul dengan hubungan data.

    Pin 7 Pin 14 (Data)

    Pin 7 sampai 14 adalah delapan jalur data (D0 D7) dimana data dapat

    ditransfer ke dan dari display.

    Pin 15 dan Pin 16

    Pin 15 atau A (+) mempunyai level DC +5 V berfungsi sebagai LED backlight +

    sedangkan pin 16 yaitu K (-) memiliki level 0 V

    Rangkaian interface antara LCD dan mikrokontroler adalah sebagai berikut.

    Pemrograman LCD

    Dalam pemrograman LCD menggunakan CVAVR terdapat beberapa istilah

    yang harus diketahui yaitu

    lcd_gotoxy (x,y)

    Berfungsi memberikan letak kordinat untuk menuliskan suatu karakter.

    Misalkan lcd_gotoxy(0,1) maka suatu karakter akan ditulis mulai baris ke 0

    dan kolom 1.

  • 24

    lcd_putsf (karakter yang ingin ditulis)

    Perintah ini digunakan untuk menuliskan pada lcd. Contoh penggunanya

    adalah

    lcd_gotoxy(0,0); //karakter dimulai pada baris ke 0 dan

    kolom ke 0

    lcd_putsf(WS robotika UMM) //menuliskan karakter tersebut

    pada LCD

    lcd_sprintf (lcd_buffer,%i,nilai variabel yang ingin di tampilkan)

    Perintah ini digunakan untuk menampilkan suatu variabel yang berubah

    ubah. Contohnya adalah sebagai berikut

    lcd_gotoxy(0,0); //karakter dimulai pada baris ke 0 dan

    kolom ke 0

    sprintf(lcd_buffer,"%6i",kecepatan_ki); //variabel disimpan

    dalam array lcd_buffer

    lcd_puts(lcd_buffer); //menampilkan isi karakter dalam

    lcd_buffer

    ftoa(nilai variabel yang ingin di tampilkan,berapa ditampilkan,lcd_buffer)

    ftoa adalah salah satu fungsi dalam menampilkan suatu variabel yang

    bernilai desimal dengan type data float. Dalam fungsi ini dapat

    menampilkan suatu variabel dengan nilai bebrapa digit dibelakang

    koma. Contoh penggunaan ftoa :

    lcd_gotoxy(0,1); //karakter dimulai pada baris ke 0 dan

    kolom ke 1

    ftoa(jarak_bawah,1,lcd_buffer); // menyimpan variabel dalam

    array

    lcd_puts(lcd_buffer); //menampilkan isi karakter dalam

    lcd_buffer

  • 25

    Latihan 3

    Pada latihan ini kita akan menampilkan suatu karakter atau kalimat dalam lcd

    dengan langkah langkah sebagai berikut :

    Setelah membuka program CVAVR pada PC, click File kemudian New.

    Pada kotak dialog berikut klik project lalu OK dan OK kembali pada printah

    selanjutnya.

  • 26

    Setelah itu kita setting jenis mikro yang kita gunakan pada kotak dialog

    berikut dengan AT-Mega 8

    Pada kotak dialog Alphanumeric LCD kita setting konfigurasi untuk lcd

    Pada kotak dialog Alphanumeric LCD kita check list untuk Enable

    Alphanumeric LCD support

    Pada characters/line kita ganti dengan 16 (karena modul lcd 16x2)

    Setelah itu konfigurasikan port pada mikrokontroler dengan lcd.

  • 27

    Setelah itu kita klik Program, generate program and save, dan kita ketik

    nama file (project) pada kotak dialog.

    Berikut adalah contoh listing program

    #include

    #include // file header untuk lcd

    void main(void)

    {

    // Alphanumeric LCD initialization

    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD

    menu:

    // RS - PORTD Bit 0

    // RD - PORTD Bit 1

    // EN - PORTD Bit 2

    // D4 - PORTD Bit 4

    // D5 - PORTD Bit 5

    // D6 - PORTD Bit 6

    // D7 - PORTD Bit 7

    // Characters/line: 16

    lcd_init(16); //lcd 16 karakter

  • 28

    lcd_gotoxy(4,0); // karakter dimulai pada baris ke 4 dan

    kolom ke 0

    lcd_putsf("Novendra") ; // menuliskan karakter pada lcd

    lcd_gotoxy(0,1); //karakter dimulai pada baris ke 0 dan

    kolom ke 1

    lcd_putsf("Teknik Elektro") ; // menuliskan karakter pada

    lcd

    }

    (Buka pada folder contoh program dengan nama Latihan 3)

    Program itu dapat disimulasikan pada aplikasi program Proteus dengan

    gambar sebagai berikut

    (Buka pada folder Rangkaian ISIS dengan nama Latihan 3)

  • 29

    ADC (Analog Digital Converter)

    ADC atau Analog Digital Converter adalah salah satu fitur mikrokontroler untuk

    mengkonversikan besaran fisis khususnya tegangan dalam bentuk digital berupa

    nilai biner. Dalam penerapanya ADC sering digunakan untuk interface terhadap

    sensor sensor yang memberi outputan berupa nilai tegangan.

    ADC AT Mega 8

    Pada AT Mega 8 terdapat 6 pin untuk ADC yang memiliki fidelitas 10 bit yang

    dapat digunakan dalam fidelitas 8 bit. Dalam mode penggunaanya hal hal

    yang perlu diperhatikan adalah tegangan reffrensi yang digunakan, prescaler

    (jumlah pencacah), dan mode operasi.

    Untuk menggunakan ADC terdapat beberapa register yang harus dipelajari

    diantaranya.

    ADMUX (ADC Multiplexer Selection Register)

    Konfigurasi register ADMUX adalah sebagai berikut

    REFS1 REFS0 ADLAR MUX3 MUX2 MUX1 MUX0

    1. REFS1 REFS0

    Merupakan bit pengatur tegangan referensi ADC ATMega8535. Memeiliki

    Nilai Awal 00 sehingga referensi tegangan berasal dari pin AREF. Detail nilai

    yang lain dapat dilihat pada tabel berikut

    REFS1 REFS0 Mode tegangan Refrensi

    0 0 Tegangan dari AREF

    0 1 Tegangan dari AVCC

    1 0 Tidak digunakan

    1 1 Tegangan internal 2.56 Volt

  • 30

    2. ADLAR

    Merupakan bit pemilih mode data keluaran ADC. Bernilai awal 0, sehingga

    2 bit tertinggi data hasil konversinya berada di register ADCH dan 8 bit

    sisanya berada di register ADCL, seperti dalam tabel 9.3. Apabila bernilai 1,

    maka hasilnya pada tabel berikut

    ADLAR=0

    - - - - - - ADC9 ADC8

    ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0

    ADLAR=1

    ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2

    ADC1 ADC0 - - - - - -

    3. MUX3 MUX0

    Merupakan bit pemilih saluran pembacaan ADC. Bernilai awal 00000. Untuk

    mode single ended input, MUX[4..0] bernilai dari 00000 hingga 00111,

    konfigurasinya dalam tabel berikut

  • 31

    ADCSRA

    Merupakan register 8 bit yang berfungsi melakukan manajemen sinyal kontrol

    dan status dari ADC yang memiliki susunan dalam tabel berikut

    ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0

    4. ADEN merupakan bit pengatur aktivasi ADC. Bernilai awal 0. Jika bernilai 1,

    maka ADC aktif.

    5. ADSC merupakan bit penanda mulainya konversi ADC. Bernilai awal 0

    selama konversi ADC akan bernilai 1, sedangkan jika konversi selesai, akan

    bernilai 0.

    6. ADATE merupakan bit pengatur aktivasi picu otomatis operasi ADC. Bernilai

    awal 0, jika bernilai1 maka konversi ADC akan dimulai pada saat transisi

    positif dari sinyal picu yang diplih. Pemiliha sinyal picu menggunakan bit

    ADTS pada register SFIOR.

    7. ADIF merupakan bit penanda akhir suatu konversi ADC. Bernilai awal 0. Jika

    bernilai 1, maka konversi ADC pada saluran telah selesai dan data siap

    diakses.

    8. ADIE merupakan bit pengatur aktivasi interupsi yang berhubungan dengan

    akhir konversi ADC. Bernilai awal 0. Jika berniali 1 dan jika konversi ADC telah

    selesai, sebuah interupsi akan dieksekusi.

    9. ADPS[2..0] merupakan bit pengatur clock ADC. Bernilai awal 000. Detail nilai

    bit dalam tabel berikut

    ADPS2 ADPS1 ADPS0 Prescaler

    0 0 0 2

    0 0 1 2

    0 1 0 4

    0 1 1 8

    1 0 0 16

    1 0 1 32

    1 1 0 64

  • 32

    1 1 1 128

    Latihan 4

    Menampilkan ADC yang didapat dari tegangan pada VR (potensio meter) pada

    LCD. Untuk dapat melakukanya diperlukan langkah langkah sebagai berikut

    Setelah membuka program CVAVR pada PC, click File kemudian New.

    Kemudian pilih Project dan click OK. Setelah itu click yes dan OK kembali.

    Setting LCD 16x2 pada PORTD bit 0 bit 7.

    Setelah itu kita setting pada kotak dialog ADC

    Enable-kan ADC dengan menchecklist pada ADC Enable

    Lalu checklist pada Use 8 bit untuk menggunakanya dengan fidelitas 8 bit.

    Gunakan AREF pin sebagai tegangan refrensi ADC.

    Lalu gunakan frequensi paling rendah untuk Prescaler tinggi yaitu 128.

  • 33

    Setelah itu kita klik Program, generate program and save, dan kita ketik

    nama file (project) pada kotak dialog.

    Berikut adalah contoh listing program

    #include

    #include

    #include

    #include

    #define ADC_VREF_TYPE 0x20

    unsigned char read_adc(unsigned char adc_input) //fungsi

    pembacan ADC

    {

    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

    delay_us(10);// Delay needed for the stabilization of the

    ADC input voltage

    ADCSRA|=0x40;// Start the AD conversion

    while ((ADCSRA & 0x10)==0);// Wait for the AD conversion to

    complete

    ADCSRA|=0x10;

    return ADCH;

    }

    unsigned char potensio; //inisialisasi potensio 8

    bit dengan nilai max 255

    char lcd_buffer[16]; //inisialisasi array untuk lcd

    void main(void)

    {

  • 34

    // ADC initialization

    // ADC Clock frequency: 31,250 kHz

    // ADC Voltage Reference: AREF pin

    // Only the 8 most significant bits of

    // the AD conversion result are used

    ADMUX=ADC_VREF_TYPE & 0xff; //register ADMUX

    ADCSRA=0x87; //register ADCSRA

    lcd_init(16);

    while (1)

    {

    potensio=read_adc(0); //membaca tegangan potensio pada

    pin ADC 0

    lcd_gotoxy(0,0); // kordinat ADC pada baris 0 dan

    kolom 0

    sprintf(lcd_buffer,"ADC=%3i",potensio); // menyimpan

    variabel ke array

    lcd_puts(lcd_buffer); //menuliskan array lcd_buffer

    pada LCD

    }

    }

    (Buka pada folder Contoh Program dengan nama Latihan 4)

    Cara kerja Program :

    Pada listing program fungsi read_adc ( ) adalah fungsi yang sudah terbentuk

    pada CVAVR pada saat kita mengenablekan ADC. Dari itu kita hanya

    memanggil fungsi tersebut dan menggunakan variabel potensio dengan type

    data unsigned char sebagai variabel yang akan ditampilkan pada LCD

    dengan 3 digit nilai

  • 35

    Listing program tersebut dapat disimulasikan pada rangkaian berikut

    (Buka pada folder Rangkaian ISIS dengan nama Latihan 4)

    Pada rangkaian ini kita harus menghubungkan tegangan yang sama dengan

    tegangan pada inputan ADC dengan AREF dan AVCC yang memiliki tegangan

    max 5 volt.

  • 36

    PWM (Pulse Width Modulation)

    PWM (Pulse Width Modulation) dapat digunakan untuk mengatur kecepatan

    motor, yaitu dengan cara mengatur lebar pulsa (waktu ON) dari tegangan

    sumbernya (tegangan DC). Perbandingan antara waktu ON dan waktu OFF

    disebut duty cycle (siklus kerja). Semakin besar siklus kerjanya, akan semakin besar

    pula keluaran yang dihasilkan, sehingga kecepatan motor akan semakin besar.

    Pembangkitan sinyal PWM dengan mikrokontroler memiliki beberapa keuntungan,

    seperti teknik pemrograman yang sederhana, dan rangkaian listrik menjadi

    sederhana.

    Pada penggunaanya terdapat beberapa register yang harus dipahami, yaitu

    diantaranya :

    1. Timer/Counter Control Register (TCCR), untuk menentukan mode PWM.

    2. Timer/Counter Register (TCNT), digunakan untuk menentukan modulasi

    frekuensinya.

    3. Output Compare Register (OCR), untuk menentukan nilai siklus kerjanya.

    Mode PWM yang akan dibahas adalah mode Fast PWM, karena dalam

    perancangan sistem robot ini menggunakan mode Fast PWM. Pada mode Fast

    PWM, semakin besar nilai OCR, maka akan semakin besar pula siklus kerja yang

    dihasilkan. Keluaran PWM akan berlogika tinggi setelah nilai TOP tercapai sampai

    nilai OCR tercapai dan kemudian akan berlogika rendah sampai nilai TOP

    tercapai kembali.

    Dalam menggunakan PWM untuk mengendalikan motor DC, maka diperlukan

    sebuah driver motor sebagai pendukung modulasi. Pada kali ini dalam

    pengaturannya menggunakan driver motor dual h-bridge yang sudah terintegrasi

    dalam satu IC L298 yang memiliki konvigurasi sebagai berikut

  • 37

    Pada konfigurasi L298 yang harus diperhatikan adalah sebagai berikut :

    1. In 1- In 2 dan In3- In4 control pengendali arah putar Out 1 - Out 2 dan Out 3 -

    Out 4 (CW/CCW).

    In 1 In 2 Arah putar Motor

    0 0 Stop

    0 1 CW (clock wise)

    1 0 CCW(conter clock

    wise)

    1 1 Stop

    2. ENA dan ENB merupakan pin pengendali kecepatan dengan PWM .ENA

    untuk OUT 1-OUT2 dan ENB untuk OUT 3-OUT 4. Kedu pin tersebut

    dihubungkan pada OC1A dan OC1B yang merupakan pin keluaran PWM

    dari AT-Mega 8.

    Latihan 5

    Pada latihan 5 kita akan mengontrol motor DC dengan menggunakan potensio

    yang dimasukan dalam PIN ADC.Untuk menggunakan PWM dalam AT-Mega 8

    dengan menggunakan CVAVR diperlukan langkah langkah sebagai berikut

    Setelah membuka program CVAVR pada PC, click File kemudian New.

    Kemudian pilih Project dan click OK. Setelah itu click yes dan OK kembali.

  • 38

    Setting PORTB sebagai Output Semua

    Setelah itu kita setting pada kotak dialog ADC

    Enable-kan ADC dengan menchecklist pada ADC Enable

    Lalu checklist pada Use 8 bit untuk menggunakanya dengan fidelitas 8 bit.

    Gunakan AREF pin sebagai tegangan refrensi ADC.

    Lalu gunakan frequensi paling rendah untuk Prescaler tinggi yaitu 128.

  • 39

    Lalu kita setting PWM pada kotak dialog Timers

    Pilih clock source dengan system clock dan menggunakan clock dengan

    freq menengah

    Pilih Mode dengan Mode Fast PWM top=0x00FF yang berarti 8 bit PWM.

    Untuk mengeluarkat PWM pada OUTA pilih Non-Inv (non inverting PWM)

    PWM dengan glombang non pembalik. Jika ingin mengeluarkan 2 PWM

    sekaligus maka lakukan hal yang sama pada OUTB

    Checklist pada Timer1 Overflow untuk mendapatkan nilai PWM yang baik.

    Setelah itu kita klik Program, generate program and save, dan kita ketik

    nama file (project) pada kotak dialog.

  • 40

    Berikut adalah contoh listing program

    #include

    #include

    #include

    unsigned char PWM;

    #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 baca_PWM(){

    if(PWM>=0 && PWM255){

    PWM=255;}

    }

    else{

    PORTB.3=1;

    PORTB.4=0 ;

    PWM=PWM-128;

    PWM=PWM*2;

    if(PWM>255){

    PWM=255;}

  • 41

    }

    }

    interrupt [TIM1_OVF] void timer1_ovf_isr(void)

    {

    baca_PWM();

    OCR1A=PWM; //Pemberian Nilai PWM yang akan dikeluarkan

    pada pin OC1A

    }

    void main(void)

    {

    PORTB=0x00;

    DDRB=0xff;

    PORTC=0x00;

    DDRC=0x00;

    PORTD=0x00;

    DDRD=0x00;

    TCCR1A=0x81; //register untuk pengaturan PWM

    TCCR1B=0x0B; //register untuk pengaturan PWM

    TCNT1H=0x00;

    TCNT1L=0x00;

    ICR1H=0x00;

    ICR1L=0x00;

    OCR1AH=0x00;

    OCR1AL=0x00;

    OCR1BH=0x00;

    OCR1BL=0x00;

    TIMSK=0x04;

    ADMUX=ADC_VREF_TYPE & 0xff;

    ADCSRA=0x87;

    #asm("sei")

    while (1)

    {

  • 42

    PWM=read_adc(0); //Pembacaan adc sebagai input

    pengaturan kecepatan motor

    }

    }

    Cara Kerja Program :

    Pada contoh program diatas motor diatur dengan inputan berupa sebuah

    potensio (VR) dimana jika potensio berputar kekanan maka motor maju dan

    jika potensio berputar kekiri motor mundur. Pemberian PWM dilakukan pada

    interupt agar update nilai PWM lebih baik.

    Pada awal mula program adalah membaca ADC pada looping While(1) yang

    diwakili dengan Variabel PWM. Setelah itu diolah nilai ADC, untuk nilai antara 0-

    127 motor berputar kearah maju dengan kecepatan PWM yang sama dengan

    dua kali lipat nilai ADC. Begitu pula sebaliknya, pada nilai 128-255 motor

    berputar mundur dengan nilai PWM yang memiliki persaman sebagai berikut :

    PWM=PWM-128;

    PWM=PWM*2;

    Pada persamaan tersebut jika nilai ADC full 255 maka nilai PWM akan sama

    dengan PWM=(255-128)x 2= 254 dan saat ADC /Potensio di tengah maka nilai

    PWM akan sama dengan PWM=(128-128)x 2= 0.

  • LSO Robotika

    Fakultas Teknik

    Universitas Muhammadiyah Malang