Anda di halaman 1dari 14

KURSUS ONLINE PEMROGRAMAN

MIKROKONTROLLER PIC 16F88

Modul 1: Struktur Program C.


Modul ini membahas struktur program C dan menunjukkan kepada Anda
bagaimana mengontrol input dan output port dari mikrokontroler.

Ulasan singkat mikrokontroler PIC16F88

Kursus mikrokontroler berisi semua bagian yang diperlukan untuk membuat


system yang berfungsi penuh termasuk Flash memory, RAM dan internal
peripheral.

Keistimewaan 16F88
16F88 mempunyai pin yang kompatibel dengan 16F84 akan tetapi 16F88
memiliki fasilitas osilator internal yang tidak dipunyai oleh 16F84, sehingga pin
yang seharusnya dipakai sebagai oscilator eksternal dapat difungsikan sebagai I/O
(Input/Output). Osilator internal dapat dijalankan dari 125kHz sampai 8MHz
(menggunakan postscaler) atau 31.25kHz (clock internal terpisah). Clock
31.25KHz memungkinkan berjalan pada daya rendah jika diperlukan.16F88
memiliki enam internal peripheral utama termasuk timer, UART dan
comparator analog. Fitur-fitur ini cocok digunakan untuk bahasa tingkat tinggi
karena 16F88 memiliki RAM yang cukup besar.
Flash memory

Flash memory adalah salah satu bagian yang paling penting dari
mikrokontroler dalam menyimpan program C terkompilasi (diprogram ke
dalam mikrokontroler menggunakan file hex yang dihasilkan oleh kompiler).

Manfaat dari Flash memory adalah Anda dapat tetap memrogramnya kembali
setidaknya ribuan kali. untuk jenis mikrokontroller baru bahkan bisa sampai
ratusan ribu kali (16F88 - 100.000 siklus pemrograman).

Memori flash bersifat non-volatile (tidak mudah berubah) yang berarti bahwa
memory flash akan tetap isinya walaupun power dimatikan.

Salah satu manfaat tambahan adalah antarmuka ICSP (In Circuit Serial
Programming) yang memungkinkan Anda untuk memrogram kembali
peralatan saat masih dalam sirkuit Anda.
RAM memory

RAM adalah penyimpanan yang bersifat volatile (tempat penyimpanan yang


mudah berubah) yang berarti isinya akan hilang setelah power dimatikan.
Tidak seperti Flash memory, Anda dapat dengan mudah mengubah nilai-nilai
yang terkandung di dalamnya meskipun program sedang berjalan.

Anda menggunakan RAM untuk menyimpan nilai dalam program Anda


misalnya untuk menghitung jumlah peristiwa pada pin atau untuk menyimpan
bacaan dari sensor suhu dll.

Bagian-bagian internal

16F88 memiliki enam perangkat internal yang membuatnya sangat tangguh:

• Tiga timer
• ADC
• Comparator analog
• CCP (PWM)
• SSP (I2C, SPI)
• USART

Kursus ini menggunakan dua perangkat yang tersedia yaitu PWM (Pulse Width
Modulator) dan USART (untuk berkomunikasi melalui RS232 ke PC).

Video

Sebelum Anda mulai menggunakan kompiler, berikut ini adalah demo video
pendek yang menunjukkan kepada Anda bagaimana untuk:

• mengeload (memuat) sebuah proyek.


• Mengedit source code.
• Mengkompilasi source code ke hex file.
• Menambahkan file proyek ke proyek-proyek Anda sendiri.

http://www.youtube.com/watch?v=2r2Hy5XUu78

Video berikutnya menunjukkan urutan pemrograman menggunakan ICPROG


termasuk setup awal:

MenggunakanICPROGpemrograman
1.1 m
perangkat lunak

Kompiler c dan ICPROG

Jika Anda belum men-download dan meng-instal kompiler, Anda harus


melakukannya sekarang. Anda juga harus menginstal ICPROG dan men-setup
sirkuit tersebut.
Sudah?
Mari kita mulai...

Ports

Aspek yang paling penting dalam menggunakan mikrokontroler adalah


bagaimana Anda berkomunikasi dari sebuah program yang berjalan di dalam
chip dengan dunia luar yaitu dengan menggunakan port I/O (Input/Output).

Mikrokontroler PIC memiliki beberapa 8 bit port tergantung pada jumlah PIN
yang tersedia dan mereka biasanya diberi label mulai dari A yaitu port input
dan output.

Jadi port pertama diberi label PORTA dan Anda dapat menggunakan nama ini
dalam program C untuk merujuk ke port tersebut. Jika Anda melihat gambar
mikrokontroler di atas, Anda akan melihat pin pada chip dilabelkan dengan
RA0 sampai RA7 yang mewakili semua bit untuk PORTA.

Catatan: Ketika output berlogika 1, tegangan keluaran adalah 5V (yaitu sama


dengan Tegangan suplay) dan ketika output berlogika nol, tegangannya
adalah 0V. Berlaku sama untuk input.

Perhatikan bahwa terdapat kata-kata port input dan output. Ini karena port
dapat menjadi port input atau port output dan tidak hanya itu, masing-
masing pin dalam port juga dapat menjadi input atau output.

Hal ini membuat port sangat fleksibel karena Anda dapat menetapkan satu
pin untuk membaca sebuah tombol, sementara pin yang lain (pada port yang
sama) sebagai pin output yang mengontrol nyala LED, kipas angin, dll.

Aspek penting lain adalah bahwa Anda juga dapat mengubah pin input atau
output dengan cepat yaitu ketika program sedang berjalan. misalnya
berkomunikasi dengan perangkat 1 wire atau menggunakan I2C. tetapi ini
akan dibahas pada modul selanjutnya.

Kompiler C menggunakan label port yang sama dengan yang Anda temukan
dalam lembar datasheet PIC 16F88 sehingga untuk PIC 16F88 ada dua port 8
bit berlabel PORTA dan PORTB.

Dalam gambar di atas, bit PORTA dilabeli RA0 sampai RA7 dan bit PORTB
dilabeli RB0 sampai RB7). Label lain adalah pin alternatif yang berfungsi
untuk perangkat internal.

Catatan: Karena perangkat internal multiplexed dengan beberapa PIN, Anda


harus memutuskan apa yang seharusnya pin lakukan misalnya saja Anda
ingin menggunakannya sebagai internal UART.

RX dan TX input dan output –nya terhubung ke pin 8 dan 11 dan multiplexed
dengan RB2 dan RB5 (PORTB bit 2 dan 5).

Jika Anda ingin menggunakan port secara normal I/O maka Anda
menonaktifkan UART (kondisi default).
Untuk saat ini kita hanya akan menganggap konfigurasi sederhana (kondisi
default) yaitu tidak menggunakan perangkat internal.

//////////////////////////////////////////////////////////
//
// File: prog01-16F88-port-flash.c
//
// Compiler: mikroC, mikroElektronika C Kompilator
// untuk microchip PIC microcontrollers
// Versi: 6.2.0.0
//
// Diuji pada PIC 16F88
// Clock: 4 MHz (internal)
//
//////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////
/ / Mulai di sini
//
void {main (void)

/ * Setup 16F88 * /
OSCCON = 0X60; / * b64 = 110 = 4 MHz * /
ANSEL = 0; / * semua ADC pin untuk digital I/O * /

TRISB = 0; / * ditetapkan sebagai output * /

while(1) {/ * infinite loop * /

PORTB = 0XFF;
delay_ms(500);

PORTB = 0;
delay_ms(500);
}
}

Kontrol internal dan eksternal

Anda perlu mengetahui tentang kontrol internal dan eksternal karena ini
adalah kontrol yang memungkinkan mikrokontroler bekerja sesuai dengan
cara yang Anda inginkan.

Berikut adalah sedikit detail tentang mengapa ada nilai tertentu dalam
register ANSEL dan OSCCON pada program diatas.

Kontrol-kontrol internal adalah register-register yang dapat Anda gunakan


untuk mengendalikan pengoperasian perangkat internal dan mereka adalah
satu-satunya yang Anda dapat diubah dari dalam program misalnya
mengubah baud rate dari USART terkirim (on the fly), mengubah arah port,
dll.

Kontrol-kontrol eksternal mengontrol fitur chip yang harus disetup


sebelum mikrokontroler bekerja yaitu mikrokontroler harus tahu apakah
menggunakan kristal eksternal atau internal clock. Nilai-nilai kontrol ini ditulis
ke dalam bagian terpisah dari memori mikrokontroler yang tidak dapat
diakses selama pengoperasian normal chip. Pengaksesan hanya dapat
dilakukan oleh ICSP port sehingga software programer (contohnya ICPROG)
dapat menge-set-nya untuk Anda.

Kontrol internal

Pertama-tama, dua pernyataan...

OSCCON = 0X60; // b64 = 110 = 4 MHz


ANSEL = 0; // semua pin ADC difungsikan sebagai digital I/O

... digunakan untuk setup 16F88. 16F88 memiliki banyak perangkat internal
dan sebagian besar (pada kondisi default) adalah off, tetapi ADC tidak begitu,
Anda harus mematikan ADC untuk menggunakan pin-pin sebagai I/O digital
normal, yaitu menggunakan ANSEL = 0.

Catatan: Anda dapat mengetahui semua tentang 16F88 dengan mempelajari


datasheet 16F88 dan Anda akan menemukan label yang sama di dalamnya
yaitu ANSEL dan OSCCON.

Berikut adalah bagian dari datasheet 16F88 menunjukkan register di atas:

OSCCON register

OSCCON adalah register kontrol osilator dan di sini OSCCON men-setup


frekuensi dari osilator internal sampai 4 MHz.

Anda dapat mengabaikan sebagian besar kontrol dalam OSCCON register,


yang Anda butuhkan adalah membuatnya sebagai default mode. Jadi bit 6-4
adalah untuk melihat dan mengontrol frekuensi RC internal. Kode C…
OSCCON = 0X60;
... diterjemahkan menjadi nilai biner 0110 0000 - yaitu bit 6 = 1, bit 5 = 1
dan bit4 = 0 memberikan frekuensi osilator 4 MHz.
ANSEL register

ANSEL adalah register analog select control yang default-nya adalah on,
sehingga semua pin ditetapkan untuk menerima sinyal analog. Untuk proyek
awal, Anda membutuhkan mereka diatur ke digital I/O yaitu tidak
menggunakan ADC.

ANSEL = 0X00;

... diterjemahkan nilai biner 0000 0000 - karena setiap bit adalah nol, yang
dapat Anda lihat dari tabel di atas, maka tiap-tiap pin kini difungsikan sebagai
digital I/O.

Jika Anda melihat pada gambar PIC 16F88, pin yang dapat berfungsi sebagai
input analog adalah semua pin yang berlabel ANn di mana n adalah 0 sampai
6 – semua ini ada pada PORTA. semua pin-pin ini sekarang adalah digital I/O
yaitu beroperasi tanpa ADC.

Kontrol-kontrol eksternal

Satu pertanyaan yang mungkin Anda miliki adalah bagaimana kompiler


mensetup mikrokontroler agar menggunakan internal atau eksternal clock?

Untuk kompiler mikroC ini, layar terpisah digunakan untuk setiap


mikrokontroler dan ini yang membuatnya mudah untuk melihat kontrol apa
yang tersedia untuk mikrokontroller individu. Berikut adalah screenshot untuk
16F88:
Seperti yang Anda lihat, ada beberapa kontrol (dan tidak semua ditampilkan)
tetapi untuk diskusi kali ini yang penting adalah kontrol osilator:

• _EXTRC_CLKOUT
• _EXTRC_IO
• _INTRC_CLKOUT
• _INTRC_IO
• _EXTCLK
• _HS_OSC
• _XT_OSC
• _LP_OSC

Ini adalah semua opsi osilator dan disinilah osilator internal dipilih dan pin
clock diatur untuk digunakan sebagai pin I/O normal. Untuk kristal eksternal
pada 4 MHz, pilih _HS_OSC dan matikan yang lain.

Kontrol-kontrol lain yang berguna adalah:

BODEN_OFF

Brown out detect off - jika ‘brown out’ dibiarkan dalam posisi on maka saat
‘brown out’ mendeteksi terjadinya sedikit penurunan pada power supply,
mikrokontroler tidak berhenti beroperasi tetapi yang mungkin terjadi adalah
perubahan (corruption) data misalnya nilai RAM yang ditetapkan berubah
karena penurunan power.
Untuk proyek-proyek non-produksi dan non-kritis matikan saja kontrol ini jika
tidak mikrokontroler akan secara otomatis me-reset on 'brown out'.

MCLR_OFF

Master Clear Control (atau master reset input). Input ini terdapat pada semua
perangkat PIC dan memungkinkan Anda me-reset prosesor menggunakan
tegangan input eksternal dengan cara menahannya untuk sementara dalam
kondisi low (di ground).

Pada prosesor lama misalnya 16F84 Anda harus memiliki sirkuit/rangkaian


reset eksternal tetapi pada prosesor 16F88 Anda memiliki pilihan untuk
menggunakan rangkaian reset internal (dan kemudian menggunakan pin
tersebut sebagai pin input yang dapat digunakan). Ini lebih hemat bila
dibandingkan harus memiliki rangkaian reset eksternal - yang berarti Anda
tidak perlu rangkaian eksternal - semua diambil secara internal.

WDT_OFF

Watch Dog Timer adalah timer internal independen yang mana Anda harus
tetap me-reset *menggunakan software) agar WDT tidak kehabisan waktu.
Itu adalah pelindung modul software dan jika WDT kehabisan waktu, prosesor
akan me-reset.

10 Konfigurasi register yang harus anda centang pada panel “Edit Project”
adalah sebagai berikut:

• _CP_OFF
• _CCP1_RB0
• _DEBUG_OFF
• _WRT_ENABLE_OFF
• _CPD_OFF
• _LVP_OFF
• _BODEN_OFF
• _MCLR_OFF
• _WDT_OFF
• _INTRC_IO

Catatan: Anda dapat melihat makna dari semua kontrol lainnya pada
datasheet 16F88.

"Mulai belajar C disini"


Ini adalah awal dari bagian kursus C dimana Anda mulai belajar struktur
program C.

Fungsi utama (main)

Baris pertama adalah...


void main(void) {

Ini adalah titik awal program yang dinyatakan sebagai fungsi. Fungsi-fungsi
yang digunakan di seluruh pemrograman C adalah untuk mendefinisikan
tindakan dari sepotong kode dibawahnya dan nama fungsi dalam kasus ini
adalah main. Secara umum Anda dapat menentukan nama Anda sendiri untuk
fungsi-fungsi lain yang Anda nyatakan, tapi 'main' adalah kata kunci dan
fungsi 'main' harus ada dan ini memberitahu compiler dimana program mulai
diakses.

Catatan: Anda dapat membuat sebanyak-banyaknya fungsi yang Anda


inginkan selama Anda menggunakan karakter yang berlaku untuk nama
fungsi lihat referensi manual.

Kata-kata kunci 'void' Anda akan kembali lagi ketika Anda melihat deklarasi
fungsi secara lebih rinci.

Saya berbicara tentang dua pernyataan sebelumnya:

OSCCON = 0X60; // b64 = 110 = 4 MHz


ANSEL = 0; // semua ADC pin difungsikan sebagai digital I/O

Braces (kurung kurawal) {}

Braces digunakan untuk mendefinisikan isi dari fungsi atau blok pernyataan.
fungsi main memiliki sebuah brace awalan dan akhiran yang mendefinisikan
isinya.

Blok pernyataan adalah hanya sekelompok pernyataan (setiap akhir dalam


tanda titik koma) tertutup dalam braces (lihat kata kunci 'while' di bawah ini).

Dalam program ini ada dua braces tertutup, satu untuk fungsi main dan satu
untuk pernyataan while.

Catatan: Setiap pembuka brace '{' harus diikuti dengan penutup brace '}'.

Arah port

Pernyataan...

TRISB = 0; // fungsikan semua pin pada PORTB sebagai output

Kata TRISB didefinisikan untuk Anda dalam file setup kompiler. TRISB adalah
alamat di memori PIC SFR (Special Function Register).

Catatan: Register TRIS mungkin diberi label setelah istilah teknik elektronik
'tristate atau three state' di mana chip-chip (misalnya 74HC125) memiliki pin
kontrol tristate yang active low. Ketika low output diaktifkan (enabled).
Sebenarnya ini adalah kebalikan dari cara di mana kebanyakan
microcontrollers lainnya bekerja.
Untuk mengatur port sebagai input, Anda akan menulis:
TRISB = 0XFF;

Infinite loop (Loop tak terbatas)

Kelompok pernyataan berikutnya dimulai dengan kata kunci while

while(1) {

pernyataan...

...yang perlu Anda ketahui tentang hal itu sekarang adalah bahwa loop terus-
menerus mengeksekusi pernyataan yang diapit oleh brace (tanda kurung
kurawal) sampai power dimatikan.

Setiap pernyataan dalam brace adalah dieksekusi satu demi satu sampai akhir
brace dan kemudian eksekusi dilanjutkan lagi setelah brace pembuka.

Anda dapat menggunakan gaya apapun yang Anda suka dan beberapa orang
menulis seperti ini :

while(1)
{

pernyataan...

Program 1: action code

Jadi kode bit yang menarik - yang benar-benar melakukan sesuatu yang
berguna adalah:

PORTB = 0XFF;
delay_ms(500);

PORTB = 0;
delay_ms(500);

Semua pin PORTB ditetapkan high kemudian menunggu selama 500 milidetik
(0.5 detik) lalu semua pin PORTB ditetapkan low lalu menunggu selama 500
milidetik. Hal ini terjadi berulang-ulang sehingga apabila PORTB di koneksikan
dengan LED, maka LED akan hidup mati (berkedip) seterusnya.

Catatan: fungsi delay_ms(500); adalah dibangun dalam fungsi yang


memberhentikan mikrokontroler dari melakukan sesuatu yang lain sampai
jumlah milidetik tertentu. telah delay memaksa mikrokontroler menunggu
sebanyak waktu delay yang telah ditentukan.
Semicolons (titik koma)
Apakah Anda perhatikan titik koma pada akhir setiap pernyataan? Ini adalah
bagaimana Anda memisahkan pernyataan individu dari yang lainnya dan itu
tidak seperti beberapa bahasa lain di mana setiap pernyataan ditempatkan
pada baris yang terpisah untuk menentukan pernyataan lengkap. C
menggunakan metode ini, memberikan Anda lebih banyak fleksibilitas dalam
menulis kode. Untuk memperpendek kode, Anda tidak perlu menulis banyak
baris.

Misalnya menggunakan konstruksi if-then-else (dibahas kemudian) Anda bisa


menulis:

if (a== 10) c = 20; else c = 0;

Atau Anda bisa meletakkan lebih dari satu titik koma. mendefinisikan
pernyataan pada baris membuatnya lebih mudah untuk membaca kode.
Misalnya Anda bisa juga menulis:

if (a== 10)
c = 20;
else
c = 0;

Catatan: Blok pernyataan tidak perlu tanda titik koma untuk menyelesaikan
definisi sehingga tidak ada titik koma setelah penutupan brace '}'.

Whitespace (spasi kosong)

Dalam pemrograman C Anda dapat menggunakan sebanyak-banyaknya ruang


spasi (spasi, tab, baris baru) yang Anda inginkan untuk membuat kode Anda
lebih mudah dibaca. Yang mana yang terbaik Anda sukai?

PORTB = 0XFF;
delay_ms(500);

PORTB = 0;
delay_ms(500);
PORTB=0xff;delay_ms(500);PORTB=0;delay_ms(500);

Keduanya akan dilihat oleh kompiler sebagai C yang benar, Anda dapat
melihat yang mana yang lebih mudah untuk dibaca.
Sirkuit

Ringkasan Program 1: apa yang telah Anda pelajari

• Struktur dari fungsi 'main'.


• Braces (tanda kurung kurawal) menentukan isi dari blok fungsi atau
pernyataan.
• Penggunaan tanda titik koma untuk menentukan akhir pernyataan.
• Penggunaan ruang spasi untuk kejelasan.
• Mengirim output port mikrokontroler (perintah PORT).
• Mengendalikan arah pin mikrokontroler (perintah TRIS).
• Penggunaan fungsi delay_ms.

Program 1: latihan

1. Ubah penundaan dalam source code untuk delay_ms(200).


Kompilasi ulang dan lihat efeknya. Ini akan membuat Anda lebih akrab
dengan pemrograman chip.
2. Ubah kecepatan osilator menjadi 8Mz dan amati hasilnya (OSCCON).

Pertama, Ubahlah hanya source code dan lalu compile ulang. Kedua, ubahlah
sumber kode dan kecepatan clock di kompiler 'Edit project' pengaturan yang
ditunjukkan di atas. perbedaan yang Anda lihat adalah bahwa kompiler
menggunakan setting kecepatan clock untuk menghitung operasi delay_ms
yang diperlukan.

Catatan: compiler tidak dapat menganalisis seting source code. sehingga


Anda harus ingat bahwa untuk menjaga kecepatan clock, anda harus
mensetingnya dalam kompiler.

Anda mungkin juga menyukai