mikrokontroler.fix 2012
DESCRIPTION
enjoy for readingTRANSCRIPT
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.
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.
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,
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.
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 :
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
/ 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++}
!= 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
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
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.
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.
- 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.
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.
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 :
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’
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,
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
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>
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
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
-
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
- 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;
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;
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
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
#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
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);
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);
}
}
- 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);
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
- 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()
{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
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
6. Akan muncultampilan yang memunculkans eluruh komponen yang ada
pada ISIS
7. Lalubuatrangkaiansepertidibawahini
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
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
// 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
// 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;
// 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;
// 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;
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.
Gambar 1
Gambar 2