Tutorial Mikrokontroler PDF
Tutorial Mikrokontroler PDF
0
Tutorial Pemrograman Mikrokontroler AVR
dengan WinAVR GCC (ATMega16/32/8535)
http://klikdisini.com/embedded
oleh
Agfianto Eko Putra (agfi68@gmail.com) dan Dhani Nugraha (dhan_t46@yahoo.com)
Dapatkan ebook ini gratis di http://klikdisini.com/embedded
FREE EBOOK!!
Jika Anda merasa ebook ini bermanfaat silahkan mendistribusikan ebook ini dengan
GRATIS di website Anda atau dimana saja, selama tidak merubah isi yang ada di e-book
ini. Terima kasih
Daftar Isi
1.
2.
Pemroses
sensor cahaya
sensor suhu
sensor
tekanan, dll
uC AT89
uC AVR
uC PIC16F, dll
Luaran-luaran
aktuator motor
relay
speaker, dll
1
2
Berikut saya berikan kembali daftar kesamaan yang pernah kemukakan sebelumnya dengan
menekankan pada perbedaan antara Mikrokontroler dan Mikrokomputer:
CPU pada sebuah Komputer berada eksternal dalam suatu sistem, sampai saat ini kecepatan
operasionalnya sudah mencapai lebih dari 2,5 GHz, sedangkan CPU pada Mikrokontroler
berada didalam (internal) sebuah chip, kecepatan kerja atau operasionalnya masih cukup
rendah, dalam orde MHz (misalnya, 24 MHz, 40 MHz dan lain sebagainya). Kecepatan yang
relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler.
Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal
dengan BIOS (Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau
menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak awal
menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask ROM
atau Flash PEROM atau Flash ROM). Sifat memori program dalam mikrokontroler ini nonvolatile, artinya tetap akan tersimpan walaupun tidak diberi catu daya.
RAM pada mikrokomputer bisa mencapai ukuran sekian GByte dan bisa di-upgrade ke
ukuran yang lebih besar dan berlokasi di luar CPU-nya, sedangkan RAM pada
mikrokontroler ada di dalam chip dan kapasitasnya rendah, misalnya 128 byte, 256 byte dan
seterusnya dan ukuran yang relatif kecil inipun dirasa cukup untuk aplikasi-aplikasi
mikrokontroler.
Luaran dan masukan (I/O) pada mikrokomputer jauh lebih kompleks dibandingkan dengan
mikrokontroler, yang jauh lebih sederhana, selain itu, pada mikrokontroler akses keluaran dan
masukan bisa per bit.
Jika diamati lebih lanjut, bisa dikatakan bahwa Mikrokomputer atau Komputer merupakan
komputer serbaguna atau general purpose computer, bisa dimanfaatkan untuk berbagai
macam aplikasi (atau perangkat lunak). Sedangkan mikrokontroler adalah special purpose
computer atau komputer untuk tujuan khusus, hanya satu macam aplikasi saja.
Perhatikan Gambar 2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.
ALU, Instruction Decoder, Accumulator dan Control Logic, sebagaimana ditunjukkan pada
Gambar 1.2, merupakan Otak-nya mikrokontroler yang bersangkutan. Jantungnya berasal dari detak
OSC (lihat pada Gambar 1.2 sebelah kiri atas). Sedangkan di sekeliling Otak terdapat berbagai
macam periferal seperti SFR (Special Function Register) yang bertugas menyimpan data-data
sementara selama proses berlangsung). Instruction Decoder bertugas menerjemahkan setiap
instruksi yang ada di dalam Program Memory (hasil dari pemrograman yang kita buat sebelumnya).
Hasil penerjemahan tersebut merupakan suatu operasi yang harus dikerjakan oleh ALU (Arithmetic
Logic Unit), mungkin dengan bantuan memori sementara Accumulator yang kemudian
menghasilkan sinyal-sinyal kontrol ke seluruh periferal yang terkait melalui Control Logic.
Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara, sedangkan
SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O dari
mikrokontroler yang bersangkutan dan sebagian lain berhubungan dengan berbagai macam
operasional mikrokontroler.
ADC atau Analog to Digital Converter (tidak setiap mikrokontroler memiliki ADC internal),
digunakan untuk mengubah data-data analog menjadi digital untuk diolah atau diproses lebih lanjut.
Timer atau Counter digunakan sebagai pewaktu atau pencacah, sebagai pewaktu fungsinya seperti
sebuah jam digital dan bisa diatur cara kerjanya. Sedangkan pencacah lebih digunakan sebagai
penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa
dalam satu detik dan lain sebagainya. Biasanya sebuah mikrokontroler bisa memiliki lebihd dari 1
timer.
EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak mendapatkan
sumber listrik/daya) dan port-port I/O untuk masukan/luaran, untuk melakukan komunikasi dengan
periferal eksternal mikrokontroler seperti sensor dan aktuator.
o Tipe CISC atau Complex Instruction Set Computing yang lebih kaya instruksi tetapi
fasilitas internal secukupnya saja (seri AT89 memiliki 255 instruksi);
o Tipe RISC atau Reduced Instruction Set Computing yang justru lebih kaya fasilitas
internalnya tetapi jumlah instruksi secukupnya (seri PIC16F hanya ada sekitar 30-an
instruksi).
Pendahuluan
Keluarga Mikrokontroler AVR merupakan mikrokontroler dengan arsitektur modern (emang selama
ini ada yang kuno kali??). Perhatikan Gambar 3, Atmel membuat 5 (lima) macam atau jenis
mikrokontroler AVR, yaitu:
TinyAVR (tidak ada kaitannya ama mbak Tini yang jualan gudeg)
Mikrokontroler (mungil, hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk
menyimpan program hingga 16K Bytes, dilengkapi SRAM dan EEPROM 512 Bytes.
MegaAVR (nah yang ini sudah mulai banyak yang nulis bukunya)
Mikrokontroler dengan unjuk-kerja tinggi, dilengkapi Pengali Perangkat keras (Hardware
Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K Bytes
dan SRAM 8K Bytes.
AVR XMEGA
Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjukkerja, sistem Event dan DMA yang ditingkatkan, serta merupakan pengembangan keluarga
AVR untuk pasar low power dan high performance (daya rendah dan unjuk-kerja tinggi).
AVR32 UC3
Unjuk-kerja tinggi, mikrokontroler flash AVR32 32-bit daya rendah. Memiliki flash hingga
512 KByte dan SRAM 128 KByte.
AVR32 AP7
Unjuk-kerja tinggi, prosesor aplikasi AVR32 32-bit daya rendah, memiliki SRAM hingga 32
KByte.
Cuman yang populer di Indonesia adalah tinyAVR dan megaAVR, itupun masih kalah populer
dengan keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR.
Perbedaan jenis-jenis tersebut terletak dari fasilitas, atau lebih dikenal dengan fitur-fiturnya. Jenis
TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas (sedikit maksudnya) dan
sekaligus fitur-fiturnya juga terbatas dibandingkan yang megaAVR. Semua mikrokontroler AVR
memiliki set instruksi (assembly) dan organisasi memori yang sama, dengan demikian berpindahpindah (walaupun tidak disarankan) antar mikrokontroler AVR gak masalah dan mudah!
Beberapa mikrokontroler AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC,
pengali perangkat keras, UART, USART dan lain sebagainya. Bayangkan saja Anda punya
TinyAVR dan MegaAVR, kemudian telanjangi (maksudnya copotin) semua periferal-nya, nah Anda
akan memiliki AVR Core yang sama! Kayak membuang semua isi hamburger, maka Anda akan
mendapatkan rotinya doang yang sama
2.2.
Moralnya tidak peduli tinyAVR, megaAVR, XMEGA AVR (AVR32 pengecualian karena
masuk ke mikrokontroler 32-bit) semuanya memiliki unjuk-kerja yang sama saja, tetapi dengan
kompleksitas atau fasilitas yang berbeda-beda, ibaratnya begini: banyak fasilitas dan fitur =
megaAVR, fitur atau fasilitas terbatas = TinyAVR. Gitu aja kok repot
Untuk lebih jelasnya perhatikan keterangan singkat yang saya berikan berikut ini, berdasar informasi
resmi dari Atmel (http://www.atmel.com) dan maaf masih dalam bahasa Inggris (supaya
kelihatannya aura kecanggihannya, he he he...).
tinyAVR
o Optimized for simple applications requiring a small microcontroller.
o Great performance for cost effective devices.
o Fully featured with 10-bit ADCs and high speed PWMs onboard.
o Self-Programming Flash memory for maximum flexibility.
o debugWIRE On-Chip Debug and In-System Programming.
megaAVR
o Self-Programming Flash memory with boot block.
o High accuracy 10-bit A/D converters with up to x200 analog gain stage.
o USART, SPI and TWI(1) compliant serial interfaces.
o IEEE 1149.1 compliant JTAG interface on megaAVRs with 44 pins or more.
o On-Chip Debug through JTAG or debugWIRE interface.
AVR XMEGA
o picoPower technology for ultra low power consumption
o True 1.6 volt operation and CPU speed up to 32 MHz.
o Event System and DMA Controller.
o High speed, high resolution 12-bit ADC and DAC.
o Crypto engine, Timers/Counters and fast communication interfaces.
o Accurate and flexible Clock System with dynamic clock switching.
AVR32 UC3
o High CPU performance.
o Low power consumption.
o High data throughput.
o Low system cost.
o High reliability.
o Easy to use.
AVR32 AP7
o High CPU perfromance.
o Low power consumption.
o SIMD / DSP instructions.
o Instruction & data caches.
o Memory management unit.
o Built for embedded Linux
2.3.
O tidak apa-apa! Dalam buku saya ini memang sengaja menggunakan mikrokontroler AVR
ATMega16 karena fitur-fitur yang dibutuhkan. Tentu saja Anda bisa menggunakan tipe AVR
lainnya, apakah yang 40 pin atau yang kurang dari itu, bisa ATMega88, ATMega16, ATMega128,
ATMega8535, ATMega168 dan lain sebagainya.
Jika Anda bingung dengan istilah-istilah pada fitur-fitur ini silahkan merujuk ke datasheet aslinya, sehingga fokus
pada buku ini tidak melulu pada datasheet...
Pada Gambar 6 dan 7 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16, perhatikan
begitu banyaknya fitur-fitur dalam diagram blok tersebut, sebagaimana juga sudah saya kutipkan
pada bagian sebelumnya.
Port B (PB7..PB0)
Port C (PC7..PC0)
Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.
Port D (PD7..PD0)
/RESET
XTAL1
XTAL2
AVCC
AREF
Port D berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masingmasing pin menyediakan resistor pull-up internal yang bisa
diaktifkan untuk masing-masing bit.
Port D juga memiliki berbagai macam fungsi alternatif,
sebagaimana ditunjukkan pada Tabel 1.3
Masukan Reset. Level rendah pada pin ini selama lebih dari lama
waktu minimum yang ditentukan akan menyebabkan reset,
walaupun clock tidak dijalankan.
Masukan ke penguat osilator terbalik (inverting) dan masukan ke
rangkaian clock internal.
Luaran dari penguat osilator terbalik
Merupakan masukan tegangan catu daya untuk Port A sebagai
ADC, biasanya dihubungkan ke Vcc, walaupun ADC-nya tidak
digunakan. Jika ADC digunakan sebaiknya dihubungkan ke Vcc
melalui tapis lolos-bawah (low-pass filter).
Merupakan tegangan referensi untuk ADC
3.1.
// Opsional
// Opsional
[global variables]
[functions]
// Opsional
// Opsional
int main(void)
// Program Utama
{
[Deklarasi local variable/constant]
[Isi Program Utama]
}
Keterangan:
Opsional artinya boleh ditulis boleh tidak, menyesuaikan kebutuhan tuliskan pustaka apa
saja yang digunakan dan lain sebagainya
Penulisan variabel dilakukan di awal agar aman bisa digunakan sepanjang program, demikian
juga dengan deklarasi fungsi-fungsi yang terlibat
Silahkan ikuti (baca) terus tutorial ini untuk melihat contoh-contoh program di bagian lain
tutorial ini.
3.2.
3.3.
Konstanta adalah memori penyimpanan data yang nilainya tidak dapat diubah. Penulisan :
const [nama] = [nilai];
3.4.
Pernyataan
Statement atau pernyataan adalah setiap operasi dalam pemrograman, harus diakhiri dengan [;] atau
[}]. Pernyataan tidak akan dieksekusi bila diawali dengan tanda [//] untuk satu baris. Lebih dari 1
baris gunakan pasangan [/*] dan [*/]. Pernyataan yang tidak dieksekusi disebut juga komentar.
Contoh:
suhu=adc/255*100; //contoh rumus perhitungan suhu
3.5.
Fungsi
Function atau fungsi adalah bagian program yang dapat dipanggil oleh program utama.
Penulisan :
[tipe data hasil] [nama function]([tipe data input 1],[tipe data input 2])
{
[pernyataan_1];
[pernyataan_2];
...
}
3.6.
[statement1];
[statement2];
...
}
else
{
[statement3];
[statement4];
...
}
for : digunakan untuk pengulangan dengan jumlah yang sudah diketahui berapa kali diulang.
for ( [nilai awal] ; [syarat] ; [operasi nilai] )
{
[statement1];
[statement2];
...
}
while: digunakan untuk pengulangan (looping) jika dan sealama memenuhi suatu kondisi masih
dipenuhi (pengulangan selama benar
while ( [persyaratan] )
{
[statement1];
[statement2];
...
}
do while: digunakan untuk pengulangan jika dan selama memenuhi syarat tertentu, namun min 1 kali
do
{
[statement1];
[statement2];
...
}
while ([persyaratan])
3.7.
Operator Logika
AND:
NOT:
OR :
&&
!
||
AND:
OR :
XOR :
Shift right:
Shift left :
&
|
^
>>
<<
Biner
>=
Lebih kecil/besar:
< , >
<=
3.8.
Operasi Aritmetika
Operator
+, -, *, /
+=, -=, *=, /=
%
++, --
Keterangan
Tambah, kurang, kali dan bagi
Nilai di sebelah kiri operator ditambah,
dikurangi, dikali atau dibagi dengan nilai di
sebelah kanan operator.
Sisa pembagian
Ditambah 1 (increment) atau dikurangi satu
(decrement)
Contoh:
a = 5 * 6 + 2 / 2 1
hasilnya 30
a *= 5
jika nilai awal a=30, maka hasilnya 150
a += 3
jika nilai awal a=30, maka hasilnya 33
a++
jika nilai awal a=5, maka hasilnya 6
a-jika nilai awal a=5, maka hasilnya 4, dst
3.9.
Apa itu Pengulangan terus-menerus atau infinite looping? Yaitu suatu pengulangan atau kalang
(loop) yang dilakuka terus-menerus tanpa batas, hingga rangkaian tidak lagi mendapatkan sumber
catu daya.
Yang perlu Anda ingat, bahwa kode-kode program yang dijalankan, dalam kaidah Bahasa C, adalah
yang ada di fungsi utama atau main, seperti contoh berikut...
void main()
{
// pernyataan-pernyataan program
}
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 16
Program akan dijalankan berurutan dari atas ke bawah dan program tersebut hanya akan dijalankan
sekali saja. Jika menggunakan infinite loop (ada yang mengatakan sebagai pengulangan tak-hingga
atau kalang tak-hingga, gak masalah, artinya sama saja kok), maka program yang ada di dalam
pengulangan tersebut akan dijalankan berulang-ulang terus-menerus, contoh...
void main()
{
// pernyataan-pernyataan program
while (1);
// infinite loop
{
// pernyataan2
}
}
Untuk keluar dari infinite looping gunakan perintah break;
Mengapa terjadi Infinite Looping ?? Perhatikan pada contoh tersebut, pernyataan atau instruksi
while (1) menyatakan bahwa kondisi SELALU BENAR, sehingga selalu dilakukan pengulangan
terus-menerus! Coba bedakan dengan contoh berikut...
void main()
{
// pernyataan-pernyataan program
while (index<5);
// infinite loop
{
// pernyataan2
Index += 1;
}
}
Program di dalam kurung kurawa setelah instruksi while (index<5) akan dijalankan selama nilai dari
index kurang dari 5, index merupakan variabel sehingga nilainya bisa berubah. Nah, jika index lebih
dari atau sama dengan 5, maka pengulangan dihentikan.
http://www.atmel.com
Unduh WinAVR GCC di
7
Pengertian simulasi disini adalah simulasi dalam tingkat register bukan simulasi dengan piranti (device). Jika Anda
menginginkan simulasi dengan rangkain dan piranti, gunakan free software lainnya yaitu VMLAB yang bisa diunduh
di http://amctools.com/download.htm (versi terbaru saat ebook ini ditulis adalah v3.15)
6
yang lain. Gambar 8 adalah contoh tampilan utama dari AVR Studio 4.0 saat pertama kali Anda
jalankan.
Gambar 10. Halaman 2 kotak dialog wizard saat dipilih AVR GCC
Simpan berkas (program) Anda dengan Ctrl+S atau pilih menu File
Save. Kemudian lakukan
kompilasi (tekan F7), jika tidak ada kesalahan akan ditampilkan laporan seperti contoh berikut...
Wow! Anda sudah berhasil membuat program mikrokontroler AVR Anda yang pertama, selamat ya!
Luar biasa!
Lha terus habis gini ngapain? Oya, Anda langsung bisa mensimulasikan-nya (Ctrl+Shift+Alt+F5)
dengan AVR Studio 4 (perhatikan Gambar 13) atau men-download-kan hex-nya ke board
mikrokontroler AVR Anda8.
Untuk urusan mendownload program (HEX) ke mikrokontroler silahkan merujuk ke artikel saya yang terkait di ??, dan
ikuti diskusi-nya.
Untuk keperlua tersebut, AVR memiliki beberapa register yang terkait, yaitu DDRx, PORTx dan
PINx9, berikut penjelasan masing-masing...
Tanda x diganti dengan A, B, C atau D menyesuaikan dengan pin masukan/luaran yang digunakan.
5.1.
Register DDRx
Digunakan untuk menentukan apakah sebuah pin pada sebuat PORT (A, B, C atau D) sebagai
masukan atau luaran atau disebut sebagai arah (direction) dari pin yang bersangkutan:
Berikan logika 1 (satu) pada bit yang terkait agar dijadikan sebagai luaran atau output.
Berikan logika 0 (nol) pada bit yang terkait agar dijadikan sebagai masukan atau input.
Misal PORTA semua bit akan digunakan sebagai masukan, maka untuk mengaturnya kita gunakan
perintah...
DDRA= 0x00; //seluruh pin-pin pada Port A digunakan sebagai input
Misalnya lagi, PORTA.0 akan dijadikan masukan sedangkan PORTA.2 sampai PORTA.7 akan
digunakan sebagai luaran, maka perintahnya...
DDRA= 0xFE;
Perhatikan
0xFE (heksa) = 0b11111110 (biner), perhatikan baik-baik konversi biner ini, setiap bit
nilai biner mewakili Pin-Pin pada PortA.
5.2.
Register PORTx
Sebagaimana dijelaskan sebelumnya, jika sebuah PORT, semua atau sebagian, dikonfigurasi sebagai
masukan, maka register ini berfungsi sebagai penentu apakah kondisi pin yang terkait di-pullup atau
Floating. Begitu juga jika dikonfigurasi sebagai luaran, maka register ini menentukan kondisi pin
yang terkait terbaca HIGH atau LOW. Untuk memahami hal ini, perhatikan Gambar 14.
5.3.
Register PINx
Digunakan untuk membaca masukan pada pin yang bersangkutan, akan dijelaskan pada contoh
program di halaman-halaman berikutnya.
6. Latihan Tahap-I
6.1.
Percobaan pertama ini menggunakan rangkaian yang ditunjukkan pada Gambar 16 10, sedangkan
contoh penempatan LED dan pushbutton (percobaan-3) pada AVR Trainer v2.0 ditunjukkan pada
Gambar 17.
Gambar 17. Penempatan LED dan Pushbutton pada AVR Trainer v2.0
10
Gambar AVR Trainer v2.0 selengkapnya ada di cover dari ebook ini!
Penjelasan:
Baris 1 4 merupakan deklarasi untuk definisi kristal yang digunakan, yaitu 11.0592MHz11. Pustaka
apa saja yang digunakan (baris 2 dan 3) dan alias untuk PORTB sebagai led (baris 4);
Baris 7- 10 merupakan subrutin untuk inisialisasi PORTB sebagai luaran (baris 9). Perhatikan bahwa
DDRB diberi logika 1 semua (=0xFF atau 255 desimal);
Program utama ditunjukkan pada baris 13 23, diawali dengan inisialisasi port (baris 15), kemudian
dilakukan pengulangan tak-hingga (baris 16);
Yang dilakukan adalah menyalakan LED, dengan cara memberikan logika 1 (baris 18), kemudian
melakukan penundaan 1 detik (baris 19), kemudian mematikan LED dengan logika 0 (baris 20) dan
diakhiri dengan penundaan 1 detik (baris 21);
Demikian seterusnya, LED akan berkedip-kedip dengan tundaan 1 detik.
6.2.
Masih menggunakan rangkaian yang sama seperti sebelumnya, sekarang buzzer juga akan
dibunyikan, penempatan buzzer pada AVR Trainer v2.0 dtinjukkan pada Gambar 18. Gambar
keseluruhan dari AVR Trainer v2.0 bisa dilihat di cover ebook ini.
11
Silahkan membaca artikel saya yang menjelaskan tentang masalah sistem clock pada mikrokontroler AVR di
http://agfi.staff.ugm.ac.id/blog/index.php/2009/12/mengenal-system-clock-pada-mikrokontroler-avr/
Penjelasan:
Baris 2 5 sama seperti penjelasan pada percobaan-1;
Baris 8 dan 9 digunakan untuk mendeklarasikan suatu instruksi untuk memberikan nilai pada
PORTA.7 dengan nilai logika 1 (baris 8) dan logika 0 (baris 9);
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 27
Selebihnya adalah program utama (baris 19 31), silahkan Anda pelajari dengan seksama.
6.3.
Kali ini menggunakan rangkaian pushbutton yang terhubung ke PORTB (ditunjukkan pada Gambar
15. Ada 2 tombol, satu untuk menyalakan LED dan yang .lain untuk mematikan LED, berikut listing
programnya...
Penjelasan:
Baris 1 - 4 sudah jelas khan? Belum? Ya monggo, silahkan lihat dulu atau baca lagi penjelasan dari
percobaan-percobaan sebelumnya, jika sudah paham silahkan kembali lagi kesini...
Baris 6 8 digunakan untuk mendeklarasikan 3 macam alias, yaitu tombol, satu dan dua. Jika
Anda perhatikan, khusus tombol didefinisikan sebagai register PIND, sebagaimana janji saya
sebelumnya register PINx saya jelaskan disini, yaitu digunakan untuk membaca masukan. Artinya
untuk memberikan luaran melalui register PORTx sedangkan untuk membaca masukan gunakan
register PINx;
Perhatikan sekarang pada rutin init_devices() yang berbeda dengan sebelumnya (baris 11 18):
o DDRB=255 sama seperti sebelumnya, PORTB semuanya dijadikan sebaga saluran luaran;
o PORTD.2 dan PORTD.3 digunakan sebagai saluran masukan, sehingga harus diberi logika
0, caranya bagaimana? Anda bisa langsung memberikan instruksi DDRD = 0b00001100
atau DDRB = 0x0C;
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 28
DDRD &= ~(1<<2) untuk PORTD.2 (tanda ~ artinya NOT), dan DDRD &= ~(1<<3) untuk
PORTD.3, perhatikan masing-masing baris 14 dan 15;
o Karena rangkaian pushbutton menggunakan konfgurasi active low12, maka kedua pin tersebut
diaktifkan pullup-nya, menggunakan instruksi masing-masing PORTD |= (1<<2) untuk
PORTD.2 dan PORTD |= (1<<3) untuk PORTD.3, perhatikan baris 16 dan 17.
Program utama dimulai dari baris 20 hingga 29:
o Diawali dengan inisialisasi device pada 22;
o Dilanjutkan dengan mematikan semuan led, baris 23;
o Yang diulang-ulang terus menerus menggunakan instruksi for (;;) {..}, sebagaimana
dituliskan pada baris 24 hingga 28, adalah proses memeriksa apakah tombol yang
dihubungkan ke PIND.2 ditekan? Atau justru tombol di PIND.3 yang ditekan:
Jika tombol yang ada di PIND.2 ditekan maka led dinyalakan semua (baris 26),
sebaliknya
Jika tombol yang ada di PIND.3 ditekan maka led dimatikan semua (baris 27)!
o
Mudah bukan?
12
Kok tidak boleh berisi 0x00 atau semua bit pada TCCR1B nol semua? Coba perhatikan Tabel 1.
Sumber clock bisa berasal dari internal mulai dari prescaler 1 hingga 1024 atau bisa juga dari sumber
eksternal, semua bisa diatur sesuai atau mengikuti aturan pada Tabel 1.
Apa nilai praskalar itu? Timer1 (juga timer/counter lainnya) membutuhkan sumber detak atau
clock source. Biasanya sumber detak yang biasa kita pakai berasal dari XTAL. Besarnya maksimum
sama dengan XTAL yang digunakan dan minimum XTAL/1024. Nah nilai pembagi atau 1024 inilah yang disebur nilai praskalar atau prescaler.
Apa yang terjadi jika semua bit di TCCR1B nol semua? Artinya bit 0, 1 dan 2 juga nol semua,
perhatikan Gambar 19, itu artinya CS12=0, CS11=0 dan CS10=0 dan itu menurut Tabel 1 No clock
source (Timer/Counter stopped) Timer berhenti bekerja! Atau tidak bekerja!!
Tabel 1. Konfigurasi sumber clock atau detak pada TCCR1B
Tiga bit (CS12, CS11 dan CS10) ini dulu yang kita perhatikan...
Okey! Register TCNT1 merupakan register pencacah, artinya nilai di dalamnya akan dinaikkan
setiap kali ada pemicu, bisa tepi naik atau tepi turun. Jika sumbernya dari dalam (internal)
pencacahan dilakukan pada saat tepi naik. Register ini akan mencacah naik dari 0x0000 sampai nilai
max 0xFFFF kemudian di-reset kembali lagi ke 0x0000.
Overflow (melimpah) terjadi saat kondisi dari 0xFFFF ke 0x0000, sehingga mengakibatkan bit
TOV1 pada register TIFR akan di-set (diberi logika 1). Kondisi overflow juga bisa digunakan untuk
menjalankan interrupsi.
Register TIMSK, yang ditunjukkan pada Gambar 21, merupakan register tempat pengaturan
interupsi overflow dari Timer/Counter1 yang ingin diaktifkan atau tidak. Dengan memberikan logika
1 pada bit TOIE1 (bit-2 pada TIMSK), maka interupsi Timer/Counter1 aktif dengan catatan bit
interupsi global diaktifkan (bit-7 di register Status SREG, perhatikan Gambar 22).
Perhatikan juga bit-bit lain yang berkaitan dengan masing-masing Timer:
Timer/Counter-0: OCIE0 dan TOIE0 masing-masing bit 1 dan 0;
Timer/Counter-1: TICIE1, OCIE1A, OCIE1B dan TOIE1 masing-masing bit 5, 4, 3 dan
2;
Timer/Counter-2: OCIE2 dan TOIE2 masing-masing bit 7 dan 6;
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 31
Hanya saya tuliskan yang terkait saja, selengkapnya silahkan merujuk datasheet ATMega16.
7.1.
Menyalakan dan mematikan LED pada PORTB dengan jeda 1 detik menggunakan Timer1. Bedakan
dengan Percobaan-1 dan 2 yang hanya menggunakan fungsi delay yang sama sekali tidak
menggunakan fasilitas Timer/Counter.
Okey, sekarang kita cari dulu nilai TCNT1-nya...
Nilai XTAL-nya 11,0592MHz atau 11.059.200Hz;
Nilai praskalarnya 1024;
Waktu yang diinginkan 1 detik, maka
Gunakan TCNT1 = (1+0xFFFF) - (waktu *( XTAL / prescaler) ), jadi...
TCNT1
=
=
=
=
=
(1+65535)-(1detik * (11059200/1024))
65536 - (1detik*10800)
65536-10800
54736
(desimal)
D5D0
(heksadesimal)
Alternatif lain, Anda bisa menggunakan programnya AVR Timer yang bisa diunduh melalui website
http://www.techideas.co.nz. Langkah-langkah penggunakan program ini kita jelaskan berikut:
1. Setelah mengunduh program AVR Timer dari http://www.techideas.co.nz, langkah selanjutnya adalah
menjalankan AVRTimer1Clac.exe untuk perhitungan atau kalkulasi Timer1;
2. Lakukan pengisian beberapa nilai sebagaimana ditunjukkan pada Gambar 23, menyesuaikan dengan
kebutuhan yang telah kita tetapkan tadi:
a. Frekuensi kristal: 11,0592MHz atau ditulis 11.059.200 Hz;
b. Pilih nilai prescale sebesar 1024;
c. Isikan Timer1 Interrupts per second (berapa kali interupsi/detik) sebesar 1 kali;
d. Perhatikan hasilnya (Gambar 24).
Listing programnya...
Penjelasan:
Program ini pada dasarnya sama seperti percobaan-1, hanya saja sekarang tundaan atau jeda
menggunakan fasiltas Timer1 yang ada di ATMega16;
Cukup saya jelaskan saja subrutin delay1detik(), yang lainnya sama seperti penjelasan percobaanpercobaan sebelumnya:
o Baris-15 merupakan pengisian register TCCR1B agar digunakan nilai prescale sebesar 1024,
artinya nilai kristal 11,0592MHz dibagi dengan 1024, sekaligus mengaktifkan Timer1;
o Baris-16 memberikan nilai awal pada TCNT1 sesuai dengan perhitungan atau kalkulasi yang
telah dilakukan sebelumnya, yaitu mengisi dengan nilai awal 54.736 (desimal) atau 0xD5D0
(heksadesimal);
o Baris-17 menunggu hingga terjadi overflow ini merupakan proses pooling bukan interupsi;
o Jika sudah terjadi overflow atau melimpah, maka flag TOV1 di-reset (baris 18) dan Timer1
dimatikan (baris 19).
Gampang tho!?
7.2.
Okey sekarang saya tunjukkan contoh lainnya menggunakan Timer2 dan penggunaan
AVRTimer2Calc ditunjukkan pada Gambar 25. Untuk 10 milidetik diisi 100 kali interupsi per detik.
Baris 16 digunakan untuk menunggu terjadinya ......................21 pada Timer2, kemudian bit
overflow tersebut direset (baris-17).
14
Jawaban: 2 (dua)
Jawaban: delay1detik()
16
Jawaban: 100 (seratus)
17
Jawaban: 8 (delapan)
18
Jawaban: 1024
19
Jawaban = 94
20
Jawaban = 148 (seratus empat puluh delapan)
15
Timer2 kemudian dihentikan dengan memberi nilai .........22 pada register TCCR2.
7.3.
21
22
Jawaban: overflow
Jawaban: 0 (nol) atau 0x00
Penjelasan:
Silahkan tulis beberapa paragraf yang menjelaskan program ini mengikuti kaidah-kaidah
yang sudah dijelaskan sebelumnya...
8. Komunikasi Serial
Komunikasi serial pada mikrokontroler AVR menggunakan fasilitas USART singkatan dari
Universal Syncronous and Asyncronous Receiver Transmitter sangat handal dan berguna dalam
berbagai aplikasi yang berhubungan antarmuka komunikasi serial dengan PC atau sesama
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 38
mikrokontroler AVR atau bahkan mikrokontroler lain yang memiliki fasilitas komunikasi serial,
misalnya program pemantauan suhu ruangan sekaligus pengontrolan AC atau kipas menggunakan
antarmuka program PC Visual Basic atau Delphi, dan lain-lain.
Jalur komunikasi serial pada mikrokontroler AVR ATMega16/32/8515 terdapat pada pin PORTD.0
(RXD) dan PORTD.1 (TXD), perhatikan pin-pin yang terkait pada Gambar 4 dan 5. Diagram
bloknya ditunjukkan pada Gambar 28.
Pembahasan komunikasi serial USART dipisahkan menjadi 3 bagian yaitu Penghasil detak (clock
generator), Mengirim data (Data Transmit) dan Menerima data (Data Receive).
8.1.
Penghasil detak atau Clock Generator tergantung pada mode data transfer, yaitu terdapat 4 (empat)
mode penghasil detak, yaitu:
Normal asynchronous;
Double Speed asynchronous;
Master synchronous, dan
Slave synchronous.
Pada Gambar 29 ditunjukkan diagram blok logik penghasil detak yang terkait dengan beberapa
register seperti UBRR (16-bit: UBRRL dan UBRRH) dan lain-lain.
Gambar 29. Diagram blok logik penghasil detak untuk komunikasi serial
Kebanyakan yang digunakan adalah Asynchronous Internal Clock Generator. Register penentuan
baudrate atau kecepatan komunikasi serial atau UBRR digunakan dimana nilai yang diberikan
adalah untuk down-counter. Setiap kali nilai down-counter mendekati nol, maka sebuah clock
dibangkitkan.
Anda bisa menghitung berapa nilai UBRR yang sesuai dengan baudrate yang diinginkan mengacu
pada osilator atau kristal yang digunakan oleh mikrokontroler menggunakan persamaan
BAUD = fclk/(16(UBRR+1))
Persamaan ini digunakan untuk Asynchronous Normal Mode, jika menggunakan mode Double
Speed Asynchronous, maka persamaan yang digunakan adalah
BAUD = fclk/(8(UBRR+1))
Informasi detil tentang clock generator ini bisa dilihat di datasheet AVR ATMega16. Anda bisa juga
memanfaatkan website http://www.wormfood.net/avrbaudcalc.php untuk menghitung secara online.
Misalkan digunakan frekuensi osilator untuk mikrokontroler sebesar 8 MHz (atau 8.000.000 Hz) dan
baudrate yang diinginkan adalah 9600, setelah dihitung menggunakan persamaan diatas diperoleh
nilai UBRR sebesar 51,083333333, kita bulatkan menjadi 51. Dengan nilai UBRR =51, maka nilai
seseungguhnya dari baudrate adalah 9615 (bukan 9600), jika dibagi dengan 9600 diperoleh 1.0016
dan karena itu error-nya adalah 0.16%. Dengan error tersebut USART masih dapat bekerja tetapi
tidak sempurna.
Anda bisa menggunakan AVR Assistant yang dibuat oleh Mike Henning (bisa Anda unduh program
tersebut di http://www.esnips.com/web/AtmelAVR), program ini juga bisa digunakan sebagai
alternatif dari AVR Timer Calculator yang telah dijelaskan sebelumnya. Tampilan awal ditunjukkan
pada Gambar 30.
Bagian kiri digunakan untuk mengatur baudrate, sedangkan bagian kanan digunakan untuk
mengatur Timer0, 1 dan 2 (jadi satu antarmukanya);
Contoh untuk baudrate 9600, dengan kristal 8MHz, hasil perhitungannya ditunjukkan pada
Gambar 31 kiri, sedangkan untuk kristal 7,372MHz ditunjukkan pada Gambar 31 kanan.
Perhatikan perbedaan error %-nya.
Gambar 31. Contoh penggunaan AVR Assistant v1.3 untuk dua frekuensi MPU berbeda
Untuk contoh pengaturan Timer1 agar menunda interupsi terjadi 100 kali per detik (seperti
kasus timer yang dijelaskan sebelumnya), dengan frekuensi kristal 11,059MHz, ditunjukkan
pada Gambar 32.
Untuk mengatasi ketidak-akuratan baudrate tersebut, biasanya digunakan kristal dengan frekuensi
7,372MHz atau 11,0592MHz. Perhatikan informasi selengkapnya untuk nilai UBRR di Tabel 3.
Tabel 3. Nilai-nilai UBRR dengan 8MHz, 7,372MHz dan 11,0592MHz23
Berikut adalah subrutin yang digunakan untuk menghitung nilai UBRR pada winAVR GCC
Variabel MYUBRR digunakan untuk menyimpan nilai UBRR setelah dilakukan perhitungan
sebagaimana ditunjukkan pada listing tersebut. Pemanggilannya menggunakan instruksi
initserial(MYUBRR);
23
8.2.
Pengirim USART atau UASRT Transmitter dapat diaktifkan dengan memberikan logika satu di bit
TXEN yang terdapat dalam register UCSRB pada bit-3, perhatikan register UCSRB yang
ditunjukkan pada Gambar 33.
Jika Anda menggunakna mode sinkron, maka pin XCK (PORTB.0) hanya boleh digunakan untuk
mengirimkan detak atau clock transmisi.
Berikut adalah subrutin yang digunakan untuk mengaktifkan UASRT Transmitter pada winAVR
GCC.
Penjelasan:
Perhatikan baris 12 (selain TXEN=1, sekaligus untuk mengakifkan UASRT Receiver di
RXEN=1).
Format datanya 8-bit data (lihat Tabel 4) dengan instruksi (3<<UCSZ0), 1-bit stop dengan
instruksi (1<<USBS).
Karena UCSRC menggunakan lokasi yang sama dengan UBBRH, maka URSEL harus
diberi logika 1 untuk mengakses UCSRC dengan instruksi (1<<URSEL).
Berikut adalah subrutin (b dan uart_putc()) yang digunakan untuk mengirimkan sebuah data
(karakter)
Penjelasan:
Pada subrutin pertama, uart_putc(), data dikirimkan dengan cara menuliskan sebuah kode
karakter ke register UDR, perhatikan Gambar 35, perhatikan baris 19;
Namun sebelum menuliskan atau mengisi register UDR, ditunggu dulu nilai bit UDRE (bit5) pada register UCSRA (Gambar 36) agar bernilai 1 (satu), maksudnya jika UDRE=1
berarti UDR-nya kosong dan siap mengirim data berikutnya, perhatikan baris 18;
8.3.
Untuk menerima data, USART Receiver dapat kita aktifkan dengan memberikan logika 1 pada bit
RXEN yang terdapat dalam register UCSRB, perhatikan kembali Gambar 33. Saat bit RXEN diberi
logika 1, artinya USART Reciever diaktifkan, dengan demikian pin RxD pada PORTD.0 hanya bisa
digunakan untuk penerimaan data pada komunikasi serial.
Berikut adalah cara yang digunakan untuk menerima data (karakter), ada di dalam program utama
(main()):
Untuk menerima data caranya mudah, yaitu dengan memeriksa apakah bit RXC (bit ke 7) pada
register UCSRA bernilai 1? Perhatikan Gambar 36 dan baris 50. Jika RXC bernilai 1 artinya UDR
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 46
berisi data yang diterima secara serial, sehingga setelah terdeteksi RXC=1, dilanjutkan dengan
menyalin isi UDR ke suatu variabel (pada contoh digunakan tempserial), sebagaimana ditunjukkan
pada baris 52.
8.4.
Percobaan komunikasi serial ini bertujuan menampilkan dua kalimat pembuka dan mengirim
kembali apapun yang diketikkan melalui terminal serial (hasil-nya ditunjukkan pada Gambar 37),
misalnya, jika diketik a, maka karakter a ini dikirim kembali ke serial, perhatikan baris 52 dan
53 pada listing program berikut:
Gambar 37. Ragkaian untuk komunikasi serial dan contoh running hasil aplikasi
Konektor komunikasi serial pada AVR Trainer Board v2.0 ditunjukkan pada Gambar 38.
Gambar 38. Koneksi serial RS232 pada AVR Trainer Board v2.0
24
http://klikdisini.com/pelatihanavr
Waktu minimal pelatihan, Anda juga bisa menambah jumlah jam jika masih merasa kurang tingkat lanjut!
Saya tersugesti, klo baca bukunya pak agfi, saya baru bisa paham... padahal saya juga uda punya
buku mikro yg lain, spt nya gak enak, klo gak baca punya pak agfi, aneh memang...
Teguh Budiman
Waduh, emang sip banget penjelasannya pak Agfi, salah satu yang saya kagumi dari pak Agfi
adalah kalo pak Agfi njelasin sesuatu pasti dengan ringkas, padat, berisi, to the point dan mudah di
mengerti.. saya juga senang baca buku-bukunya pak Agfi lho, nah.. itu adalah tanda-tanda dari
dosen, entrepreneur dan sekaligus penulis yang profesional..| salut dah buat pak Agfi.. Seandainya
sebagian besar dosen bisa aktif seperti pak Agfi, pasti Indonesia makin maju neh..
Herlambang (http://indomicron.co.cc)
Gambar 1.1
Baiklah, untuk percobaan, saya buka berkas baru dengan tampilan seperti Gambar 1.2. Tampak awal
dari diagram alir dan daftar pin dari mikrokontroler AVR ATmega32 yang saya gunakan sebagai
contoh kali ini.
Gambar 1.2
25
Pada saat ebook ini ditulis sudah tersedia versi 4.3.3.6, silahkan di-unduh di
http://www.4shared.com/file/kTQ_NYyL/Flowcode_AVR_Professional_4366.html dan jika suka silahkan dibeli.
Selanjutnya, singkat cerita saya buat sebuah diagram alir yang intinya menghidupan dan mematikan
LED pada PORTA secara bergantian dengan selang 500 milidetik atau 0,5 setik (perhatikan Gambar
1.3). Hasilnya LED akan berkedip-kedip dengan tundaan 500 milidetik (tampilan simulasi pada
Gambar 1.4).
Gambar 1.3
Gambar 1.5
Pada Gambar 1.5 keunikan terjadi karena inisialisasi PORTA yang seharusnya cukup sekali saja
dilakukan justru dilakukan pada tiap instruksi untuk mengirimkan nilai 0 (LED mati semua) dan 255
(LED hidup semua), perhatikan tanda panah pada Gambar 1.5. Mengapa tidak sekali saja yach?
Mungkin untuk jaga-jaga kali yaaa??
Gambar 1.6
Pada Gambar 1.6 terjadi pengulangan instruksi yang sama persis (lihat tanda panah), kenapa tidak
dibuat subrutin-nya skalian yach??
Kesimpulannya:
Enakan pake ASM atau Native C langsung untuk membuat program mikrokontroler AVR,
agar kita bisa langsung menulis kode-kode secara efisien dan efektif.
Bagaimana dengan BASCOM AVR? Boleh-boleh saja, cuman tetap harus hati-hati
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 54
Gambar 2.1
Kemudian kita kompail dan disimulasikan hasilnya (juga) bisa dilihat pada Gambar 2.1 tersebut.
Perhatikan bahwa tidak semua masukan PORT A kita buat berlogika 1, hanya A7, A5, A3 dan A1.
Hasilnya juga tidak semua LED pada PORT B menyala, hanya sesuai dengan PORT A saja, yaitu
B7, B5, B3 dan B1. Nah sekarang pertanyaannya:
Bagaimana dengan hasil kompilasi dalam bahasa C-nya (juga dalam bahasa ASM-nya)?
Berikut saya cuplik sebagian hasil kompilasi dalam bahasa C (baris 59-96), cukup yang utama dulu,
selebihnya Anda bisa mencermati bahwa di awal program C-nya merupakan inisialisasi variabel,
pemetaan mikrokontroler dan lain-lain. Perhatikan Gambar 2.2.
Gambar 2.2
Pada cuplikan listing tersebut saya sudah memberikan catatan. Bagaimana dengan Anda? Apa yang
dilakukan pada bagian inisialisasi, baris 76 dan 77? Instruksi MCUCSR = 000; digunakan untuk
mereset (memberikan logika 0) pada semua bit di register MCUCSR (MCU Control and Register),
perhatikan penjelasan pada Gambar 2.3. Sedangkan WDTCR = 010; digunakan untuk mematikan
watchdog, perhatikan penjelasan register WDTCR (Watchdog Control Register) di Gambar 2.4.
Langkah ini dilakukan oleh Flowcode AVR, menurut saya, untuk keamanan atau play safe saja.
Karena kemungkinan kompailer C yang digunakan tidak mematikan watchdog secara otomatis (ada
beberapa kompailer yang bisa melakukan-nya secara otomatis selama tidak secara eksplisit
dinyatakan penggunaan watchdog).
Listing program selebihnya adalah sesuai dengan yang diharapkan, baca masukan seperti pada baris
85, namun sebelumnya ada inisialisasi PORT A sebagai masukan, mengapa tidak langsung aja
DDRA = 000? Kok harus di-AND-kan segala dengan 0, khan hasilnya sama saja logika-0 khan?
Aneh? Kemudian dilanjutkan dengan mengirimkan isi variabel dari pembacaan PORT A ke PORTB,
lihat baris 91, yang sebelumnya (juga) diawali dengan inisialisasi PORT B sebagai luaran (nah kalo
ini caranya langsung).
Gambar 2.3
Gambar 2.4
Jika Anda berikan loop pada program, seperti pada Gambar 2.5, hasilnya juga sama saja, keunikan
juga terjadi lagi seperti saya jelaskan pada artikel sebelumnya26.
Gambar 2.5
26
27
Gambar 3.1
Gambar 3.2
Untuk fungsi FCD_LCDDisplay0_Start() listing programnya ditunjukkan pada Gambar 3.3. Apa
yang dilakukan oleh fungsi ini adalah melakukan inisialisasi tampilan LCD dengan antarmuka 4 bit
data (Flowcode 3 AVR hanya menyediakan antarmuka 4-bit data LCD walaupun bisa juga
digunakan rangkaian antarmuka 8-bit data LCD). Rangkaian yang digunakan menggunakan
pemetaan PORT dan pin LCD sebagai berikut:
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 59
#define
#define
#define
#define
#define
#define
LCD_2360334_BIT0
LCD_2360334_BIT1
LCD_2360334_BIT2
LCD_2360334_BIT3
LCD_2360334_RS
LCD_2360334_E
2
3
4
5
0
1
`
Gambar 3.3
Untuk fungsi FCD_LCDDisplay0_PrintString() listingnya ditunjukkan pada Gambar 3.4. Fungsi
ini digunakan untuk menampilkan string ke LCD pada posisi kursor saat itu. Fungsi ini
membutuhkan dua parameter, string yang akan ditampilkan dan jumlah karakter pada string tersebut.
Gambar 3.4
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 60
Gambar 3.5
Nah program utama ditunjukkan pada Gambar 3.6. Diawali dengan inisialisasi register MCUCSR
dan WDTCR pada baris 373 dan 374 (baca artikel saya sebelumnya28). Kemudian dilanjutkan
dengan melakukan inisialisasi LCD (baris 381) menggunakan fungsi FCD_LCDDisplay0_Start().
Diikuti dengan menampilkan string Halo Flowcode3 (baris 386, angka 14 merupakan jumlah
karakter pada string yang bersangkutan), menempatkan kursor pada baris kedua kolom pertama
(baris 391), menampilkan string by ATMega32 (baris 396) dan diakhiri dengan infinite-loop atau
kalang-takhingga (baris 399).
Jika Anda perhatikan baik-baik pada ketiga fungsi tersebut, maka bisa Anda temukan pemanggilan
fungsi lain yaitu LCD_2360334_RawSend(char nIn, char nMask), yang digunakan untuk
mengirimkan
satu
karakter.
Pendefinisian
fungsi
ini
ada
di
dalam
fungsi
FCD_LCDDisplay0_GetDefines().
Program selengkapnya bisa diunduh disini29.
28
29
Gambar 3.6
Kali ini kita akan belajar membuat program menggunakan Flowcode AVR30 untuk menghitung sapisapi kita yang masuk kandang. Caranya bagaimana? Kita gunakan sensor detektor sapi melalui
PORT A (yang disimulasikan menggunakan pushbutton) untuk mendeteksi sapi-sapi yang masuk ke
kandang. Sensor ini akan memicu proses perhitungan jumlah atau cacah sapi. Sementara ini hasil
perhitungan ditampilkan melalui LED pada PORT B, bisa juga melalui 7segmen biar keren, tapi itu
entar aja dech.
Silahkan membuat kerangka diagram alir menggunakan acuan Gambar 4.1. Pada blok Calculation
masih kita kosongkan
Okey, langkah selanjutnya lakukan klik-ganda pada blok Calculation, sehingga dimunculkan kotak
dialog yang ditunjukkan pada Gambar 4.2.
Ganti nama Calculation (pada Display Name) menjadi Total Sapi (tanpa tanda petik). Kemudian
lanjutkan menuliskan persamaan untuk menghitung total sapi sebagai berikut: TOTAL = TOTAL +
SAPI (pada bagian isian Calculations). Perhatikan Gambar 4.3.
30
Pada saat ebook ini ditulis sudah tersedia versi 4.3.3.6, silahkan di-unduh di
http://www.4shared.com/file/kTQ_NYyL/Flowcode_AVR_Professional_4366.html
Gambar 4.1
Gambar 4.2
Sensor detektor sapi disimulasikan menggunakan tombol tekan atau pushbutton yang dipasang pada
PORTA.0. Jika tombol ditekan maka akan menghasilkan nilai 1 yang kemudian disimpan ke dalam
variabel SAPI. Dengan demikian, penekanan tombol pada PORTA.0 akan menambah nilai TOTAL
sebesar 1. Jika tidak ditekan, ya artinya nilai pada variabel SAPI tetap 0 (nol) dan tidak merubah
nilai dari TOTAL, demikian seterusnya.
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 63
Klik Variables pada kotak dialog Calculations untuk mulai mendefinisikan variabel-variabel yang
terkait. Akan ditampilkan kotak dialog seperti pada Gambar 4.4.
Gambar 4.3
Gambar 4.4
Sekarang kita lanjutkan dengan mendefinisikan variabel-variabel yang terkait tersebut. Variabel yang
akan kita definisikan adalah TOTAL dan SAPI. Penggunaan kedua variabel ini sudah saya jelaskan
sebelumnya, jika belum paham silahkan ditengok lagi, nanti baru kembali lagi kesini
Klik pada tombol Add New Variable sehingga dimunculkan kotak dialog Create sebagaimana
ditunjukkan pada Gambar 4.5. Ketik SAPI (tanpa tanda petik) pada isian Name of New Variable
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 64
dan pilih Byte pada Variable Type, akhiri dengan klik Ok. Lakukan hal yang sama untuk variabel
TOTAL. Sehingga sekarang isi dari variabel kita seperti ditunjukkan pada Gambar 4.6.
Gambar 4.5
Gambar 4.6
Klik Close, kemudian kembali lagi ke kotak dialog Calculations dan akhiri dengan klik Ok. Hasil
dari diagram alir sampai tahap ini ditunjukkan pada Gambar 4.7.
Gambar 4.7
Sekarang saatnya mengatur pengulangan (loop). Klik pada blok Loop sehingga ditampilkan kotak
dialog seperti pada Gambar 4.8.
Gambar 4.8
Silahkan Anda cermati kotak dialog tersebut, Anda bisa memilih antara Loop While dengan Loop
Count. Pada isian Loop while, kita bisa mengisikan berbagai macam kondisi syarat pengulangan.
Misalnya, tertulis angka 1 pada kotak dialog tersebut, artinya dianggap selalu benar, sehingga
terjadilah pengulangan terus menerus (infinite loop). Atau Anda bisa mengisikan syarat-syarat
tertentu untuk pengulangan, misalnya cacah < 4, cacah = 0 dan lain sebagainya.
Perhatikan juga pilihan Test the loop at, yaitu Start dan End. Apakah pengujian dilakukan di awal
pengulangan (Start) atau diakhir (End)? Hal ini tentu saja berpengaruh terhadap jumlah
pengulangan yang terjadi.
Isian Loop Count merupakan bentuk pengulangan yang pasti, berapa kali dilakukan pengulangan,
Anda bisa mengisikan angka yang sesuai dengan kepentingan program.
Sementara ini biarkan isian seperti itu, klik saja Cancel untuk membatalkan.
Okey, kita lanjutkan dengan klik ganda pada blok Input, sehingga ditampilkan Gambar 4.9
(perhatikan 3 tanda panah-nya).
Gambar 4.9
Ubah Display name (panah teratas) menjadi Cek sensornya. Klik tombol Variables (sebelah
kanan panah tengah), klik pada variabel SAPI dan klik tombol Use Variable. Perhatikan isian Port
yang sudah terisi dengan PORT A dan ini sudah sesuai dengan program kita, so akhiri dengan klik
Ok.
Langkah selanjutnya adalah menentukan luaran melalui PORT B. Klik ganda pada blok Output.
Mirip dengan cara menentukan masukan sebagaimana sudah saya jelaskan. Klik tombol Variables,
pilih variabel TOTAL dengan cara yang sama seperti sebelumnya. Ganti isian Port menjadi PORT
B. Hasil akhir dari diagram alir ditunjukkan pada Gambar 4.10.
Gambar 4.10
Berikutnya adalah menambahkan tampilan LED pada Flowcode AVR untuk kepentingan simulasi.
Klik pada ikon LED (ada di sebelah kiri atas gambar LED berjejer miring). Maka pada Flowcode
AVR akan ditampilkan kotak LED, perhatikan (panah pada) Gambar 4.11.
Untuk menghubungkan LED ini dengan PORT B, klik pada panah kebawah di LED dan pilih
Component Connections, sehingga ditampilkan kotak dialog seperti Gambar 4.12. Gantilah
PORT A pada kotak dialog Component Connections.. tersebut dengan PORT B, bit 0 sampai
dengan 7 untuk masing-masing LED.
Sekarang tambahkan pushbutton pada Flowcode AVR dengan klik ikon Switch (di sebelah kanan
ikon LED yang telah Anda klik sebelumnya). Perhatikan Gambar 4.13.
Gambar 4.11
Gambar 4.12
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 69
Gambar 4.13
Kita atur Properties dari switch ini dengan klik tanda panah kebawah dan pilih Properties, sehingga
ditampilkan Gambar 4.14. Jumlah pushbutton cuman 1, ganti angka pada Number of switch menjadi
1 (perhatikan tanda panah yang terkait). Lanjutkan dengan klik pada Tab Switch label dan ketik
seperti pada Gambar 4.15.
Okey, tugas membuat program sudah selesai, hasil akhir dari tampilan Flowcode AVR ditunjukkan
pada Gambar 4.16.
Selanjutnya sudah bisa dilakukan simulasi. Klik Run (tanda panah pada Gambar 4.16) dan nikmati
hasilnya! Kenapa? Wow pencacahan dilakukan dengan sangat cepat, ketikan kli pada pushbutton
LED pada PORT B berubah secara cepat (sekali)! Bagaimana mengatasinya?
Sisipkan tundaan di dalam flowchart sebagaimana ditunjukkan pada Gambar 4.17. Kemudian
jalankan lagi simulasinya
Listing program utama (main()) dalam Bahasa C ditunjukkan pada Gambar 4.18
Terima kasih...!
Gambar 4.14
Gambar 4.15
Gambar 4.16
Gambar 4.17
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 72
Gambar 4.18
Gambar 5.1
Untuk kompilasi digunakan AVR Studio versi 4.0 (silahkan unduh GRATIS dari
http://www.atmel.com). Program kita awali dengan beberapa macam deklarasi, keterangan sengaja
saya masukkan dalam listing program untuk memudahkan pembelajaran langsung dari listingnya,
perhatikan instruksi yang diawali dengan . merupakan directive dari AVR Studio, bukan instruksi
assembly mikrokontroler AVR:
;-----------------------------------------;animasi LED berjalan dalam bahasa Assembly
;untuk mikrokontroler Atmel AVR ATMega32
;frekuensi kristal 7.3728MHz
;http://agfi.staff.ugm.ac.id
;-----------------------------------------.nolist ;bagian ini
.include "m32def.inc" ;tidak perlu ditampilkan dalam
.list
;berkas list
Ingat berkas m32def.inc kita sertakan (directive .include) karena akan digunakan pustaka
ATMega32 dalam program kita, tetapi tidak perlu disertakan dalam hasil berkas LIST-nya (hasil
kompilasi program) menggunakan directive .nolist dan .list.
Selanjutnya dilakukan inisialisasi awal:
;----------inisialisasi konstanta dan register
.equ led=0b01111111 ;portb-7 ON
.def temp=r16
;temp sebagai alias untuk R16
;====== program utama ====================
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 74
.cseg
.org 0000
Variabel LED digunakan untuk menyimpan data yang akan dikeluarkan melalui PORTA, awalnya
diisi 0b01111111, artinya LED-0 akan dinyalakan terlebih dahulu. Variabel TEMP digunakan
variabel alias untuk R16 (register-16), Anda boleh menggunakan nama alias apa saja, misalnya, tahu,
brokoli, wortel dan lain sebagainya (emang buat sayur yach? he he he)
Program diawali dengan mendeklarasikan segmen kode (.cseg) dan dimulai alamat00000 (.org) ini paling logis kita siapkan di alamat tersebut, silahkan saja kalo mo diganti dengan alamat
lain asalkan tidak konflik dengan kepentingan lainnya dalam program. Ragu-ragu? Ya sudah ikuti
saja pake alamat 00000, aman dech!
Selanjutnya kita lakukan INISIALISASI STACK:
;menyiapkan alamat SP - Stack Pointer
;harus dituliskan sebagai inisialisasi SP pada RCALL
;jika tidak dilakukan program akan macet!
ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp
Jika Anda lupa atau tidak melakukan inisialisasi stack, ada kemungkinan besar akan terjadi
kemacetan pada program, artinya program seakan-akan stuck. Jika Anda menggunakan simulator
semacam Proteus (yang pernah saya coba menggunakan Proteus 7.6 SP4), program akan berjalan
tanpa kesalahan, namun ketika dicobakan ke rangkaian sesungguhnya program akan berhenti (stuck).
Saran saya, ada baiknya tidak terlalu mengandalkan simulator mikrokontroler semacam Proteus,
usahakan untuk mencoba di dunia nyata, di rangkaian sesungguhnya. Berikut cuplikan program
untuk menginisialisasi stack di akhir ruang RAM (RAMEND).
Karena STACK pada ATMega32 ukuran 16bit atau 2byte, maka pengisian SP dilakukan dua kali
untuk SP Low atau SPL dan SP High atau SPH. Fungsi Low() dan High()masing-masing digunakan
untuk mendapatka bagian LOW atau HIGH dari variabelRAMEND yang suda tersimpan dalam
m32def.inc. Pengisian register pada AVR tidak bisa dilakukan langsung, dalam hal ini melalui
variabel TEMP baru kemudian dipindahkan ke SPL dan SPH. Hal ini berlaku juga untuk penjelasan
terkait berikut ini
Berikutnya, karena kita menggunakan mikrokontroler AVR, sudah wajib kita menentukan sebuah
PORT sebagai masukan atau luaran, jika masing-masing bit pada register DDRx diberi nilai 1
artinya sebagai luaran (jika 0 sebagai masukan). Karena digunakan PORTA maka digunakan
register DDRA (penulisan ke DDRA (out ddra,temp) tidak bisa langsung, sehingga digunakan
variabel TEMP (ldi temp,0b01111111)):
;----------- inisialisasi port--------------------ldi
temp,0b11111111 ;set semua bit register temp
out
ddra,temp
;tuliskan ke register DDRA
sec
putar:
out
rcall
ror
rjmp
Data disimpan terlebih dahulu di variabel TEMP (ldi temp,led), kemudian baru dikeluarkan ke
PORTA (out porta,temp), tidak bisa langsung dikirim ke PORTA. Untuk menggeser dan memutar bit
pada variabel TEMP digunakan instruksi ROR (Rotate Right Using Carry), karena melewati Carry
sedangkan Carry biasanya isinya 0 , maka harus diberi 1 dulu dengan instruksi SEC. Pengulangan
dilakukan dengan melompat kembali ke label putar menggunakan rjmp putar.
Bagian akhir dari program adalah subrutin penundaan sekitar 0.25detik (lihat pada listing program
lengkap). Kok bisa ya? Ya pake saja program AVR Delay Loop Generator, sebagaimana screen
shoot-nya ditunjukkan pada Gambar 5.2, silahkan unduh gratis di-sini31.
Memang menggunakan pengulangan register, penundaan 0.25 detik tidak akan akurat, tetapi
lumayan buat melakukan penundaan sesaat. Jika Anda ingin akurat, gunakan fasilitas Timer/Counter
pada mikrokontroler AVR yang bersangkutan.
Gambar 5.2
Program selengkapnya sebagai berikut (ingat akhiri program dengan .exit)
31
http://www.electronics-lab.com/downloads/cnt/fclick.php?fid=23
brne WGLOOP0
; ----------------------------; delaying 18 cycles:
ldi R17, $06
WGLOOP3: dec R17
brne WGLOOP3
; =============================
ret
; =============================
.exit
;akhir program
Sedangkan dalam Bahasa C Native (menggunakan AVR Studio 4 dan GCC) ditunjukkan lengkap
sebagai berikut:
//========================================
// animasi LED di PORTA
//=========================================
#include
#include
//pustaka DELAY untuk frek 1MHz
#define PORTLED
PORTB //penentuan alias untuk PORTB
#define DDRLED
DDRB
//penentuan alias untuk DDRB
int main (void)
{
unsigned char temp=0x80;
DDRLED=0xFF;
while(1){
PORTLED=temp;
_delay_ms(250);
temp=(temp<<7)|(temp>>1);}
return(0);
}
Silahkan Anda cermati perbedaan penulisan menggunakan Assembly dan Native C (gcc), untuk
urusan penundaah digunakan fungsi _delay_ms() yang sudah didefinisikan di berkas delay.h dan
berlaku untuk frekuensi operasional 1MHz. Sedangkan inisialisasi PORT sama seperti pada
Assembly. Yang mungkin Anda pertanyakan adalah pengganti perintah ROR yaitu menggunakan
instruksi
temp=(temp<<7)|(temp>>1);,
untuk ROL tinggal
Anda
ganti dengan
temp=(temp<<1)|(temp>>7); dan unsigned char temp=080; menjadi unsigned
char temp=001;.
Demikian penjelasan singkat saya tentang aplikasi animasi LED berjalan menggunakan bahasa
assembly dan C untuk mikrokontroler AVR ATMega32. Semoga bermanfaat dan sukses selalu untuk
Anda!
Gambar 6.1
Selanjutnya kita buat programnya dengan diagram alir yang ditunjukkan pada Gambar 6.2.
Gambar 6.2
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 79
portb,temp
pind,0
kiri
tunda
temp
kanan
out
sbis
rjmp
rcall
rol
portb,temp
pind,1
kanan
tunda
temp
kiri:
rjmp
kiri
;lagi!
; =============================
;
delay loop generator
;
2000000 cycles:
; ----------------------------; delaying 1999998 cycles:
tunda:
ldi R17, $12
WGLOOP0: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------; delaying 2 cycles:
nop
nop
ret
; =============================
.exit
;akhir program
Penjelasan:
Untuk penjelasan tentang inisialisasi stack dan rutin tundaan silahkan lihat artikel bonus-5;
Perhatikan blok inisialisasi PORT, untuk menentukan apakah suatu PORT digunakan
sebagai luaran atau masukan digunakan register DDRx, dengan x diisi A, B, C atau D
menyesuaikan dengan penggunaan port yang digunakan. Dalam kasus ini
digunakan DDRB dan DDRD, masing-masing untuk PORTB danPORTD. Logika 1 untuk
luaran, logika 0 untuk masukan.
Sekali lagi penulisan ke DDRx tidak bisa dilakukan langsung, artinya Anda tidak bisa
memberikan instruksi, misalnya, out ddrd,0b00000000 yang mengakibatkan adanya
kesalahan saat kompilasi. Gak percaya? Ya silahkan dicoba sendiri
Selanjutnya label KANAN dan KIRI digunakan untuk melakukan animasi LED sesuai
dengan pushbutton yang ditekan. Pada label KANAN, diawali dengan mengeluarkan data
TEMP ke PORTB, kemudian diikuti dengan instruksi SBISyang merupakan instruksi Skip
if Bit in I/O Register is Set, artinya abaikan instruksi berikutnya jika bit yang diperiksa
bernilai HIGH atau berlogika 1 . Karena yang diperiksa adalah PORTD.0, dan
konfigurasinya adalah aktif rendah (ditekan berarti HIGH), sehingga jika tidak ditekan
(dalam kondisi 1 atau SET), maka instruksi RJMP KIRI akan diabaikan, dan program
melanjutkan ke penundaan sesaat (RCALL TUNDA), melakukan rotasi bit ke kanan pada
TEMP (ROR TEMP) dan mengulang lagi (RJMP KANAN).
Hal di atas berlaku juga untuk label KIRI, demikian seterusnya.
http://klikdisini.com/pelatihanavr
Pak Agfi, salut buat jiwa technopreneur yang kuat dan inovatif. Saya bisa lihat di tulisan tulisan Bapak. Btw, saya sendiri juga sedang belajar untuk mengembangkan bidang
otomasi, esp. PLC dan SCADA
Handy (http://learnautomation.wordpress.com/)
btw,,saya sudah mempunyai buku mikon mas dah lama bgt,, thanx atas bukunya
mas,,saya jadi bisa memahami mikon,,saya juga sudah bisa membuat alat yg berbasis
mikon,,khususnya at89sxx
Ruby
32
Waktu minimal pelatihan, Anda juga bisa menambah jumlah jam jika masih merasa kurang tingkat lanjut!
33
34
http://www.esnips.com/doc/e2fdc2b1-84e6-4a54-a7dd-6b311894e1a4/isi_mcs51
http://www.esnips.com/doc/cef364e2-6759-462f-9303-4b99c62f7db0/mcs51_03
35
36
http://www.esnips.com/doc/c7a08a88-3662-4f33-b6d9-7f44d81f572f/isi_plc
http://www.esnips.com/doc/d2484bf8-0d3d-4234-a2e3-dab82aafa8e7/plc06
37
http://www.esnips.com/doc/d5dd6e60-4940-4d7b-b58d-dec153ba4ca7/isi_tap
http://www.esnips.com/doc/ddd17fc3-cc8f-4eff-b131-b838d9003e7f/tapis04
39
http://www.esnips.com/doc/4808c7b5-55f0-4838-a6e7-f0b3551b9c02/filters
38
40
http://www.4shared.com/network/search.jsp?searchmode=2&searchName=emu8086
http://www.esnips.com/doc/72832fb6-3e0f-485a-a403-720c02e34c06/program
42
http://agfi.staff.ugm.ac.id/pdf/daftar_isi_asm.pdf
43
http://agfi.staff.ugm.ac.id/pdf/sampel_asm03.pdf
41
44
45
http://www.esnips.com/doc/cec2661a-0c49-4e83-8bb5-f1840871a0a5/isi_mobot
http://www.esnips.com/doc/ebb66bc3-823e-4606-b124-3b4157b63185/mobot02
http://www.gavamedia.net/products-page/buku-baru/tip-dan-trikmikrokontroler-at89-dan-avr/