Tuesday, May 3, 2011

Struktur Pemrograman Bahasa C


Bagi para programmer mikrokontroler, bahasa C masih menjadi salah satu bahasa pemrograman favorit. Selain struktur pemrograman yang cukup mudah untuk dimengerti, telah terdapat cukup banyak library yang siap pakai dalam pembuatan program. Sebagai contoh, untuk dapat mengirimkan data serial dengan menggunakan pemrograman bahasa C cukup hanya dengan mengirimkan perintah "putchar", "printf" ataupun perintah yang lain.
Untuk kesempatan kali ini tidak akan membahas perihal keuntungan dan kekurangan dari pemrograman bahasa C, akan tetapi lebih menekankan pada struktur Pemrograman Bahasa C.
Format penulisan untuk program dalam bahasa C terdiri dari 

1. Komentar
2. Preprocessor
3. Deklarasi Variabel Global
4. Protype fungsi
5. Main / Utama

Berikut ini penjelasan mendasar dari format penulisan bahasa C

1. Komentar
Bagian ini digunakan untuk memberikan keterangan pada program agar mudah dibaca dan akan diabaikan oleh kompiler.

Cara penulisan :
/*.......*/     Digunakan untuk komentar bentuk paragrah
//                          Digunakan untuk komentar per baris

Contoh :
1: /* Berikut ini merupakan contoh komentar dalam bentuk paragraf */
2: //Berikut ini merupakan contoh komentar per baris

2.Preprocessor
Preprocessor #include biasanya digunakan untuk menyertakan file header (.h) ataupun file library. File include berguna untuk memberitahu kompiler agar membaca file yang di include-kan lebih dahulu agar mengenali definisi-definisi yang digunakan dalam program agar tidak dianggap error

Cara penulisan :
#include <....> Digunakan ketika lokasi dari file yang dingin di-include-kan telah ditentukan oleh kompiler dan biasanya terletak pada folder direktor kompiler tersebut
#include "..."  Digunakan ketika lokasi file yang ingin di-include-kan terletak pada folder tempat program diletakan

Contoh:
1: #include <avr/io.h> //file include terletak di direktori kompiler
2: #include "uart.h" /*file include terletak di folder yang sama dengan program utama*/

Selain perintah #include, terdapat juga perintah lain yang digunakan untuk mendefinisikan konstanta atau makro

Cara penulisan :
#define indentifier konstanta

Contoh :
1: #define on 1
Berati setiap kemunculan "on" akan digantikan dengan angka 1
atau
1: #define lcd_port PORTD
setiap menuliskan "lcd_port", berarti mengakses PORTD


3. Deklarasi Variabel Global
Variabel global dideklarasikan di luar semua fungsi termasuk fungsi utama dan lataknya harus di atas. Sifat variable global yaitu dapat diakses(dibaca/ditulis) oleh semua penyataan dalam program.

Cara penulisan:
TipeData nama Variabel;

Contoh:
1: #include "transceiver.h"
2: uint8_t StartState = 0xFF;


4. Prototype fungsi
Berguna untuk mendeklarasikan fungsi yang ditulis di bawah fungsi "main". Jika fungsi tersebut berada di atas fungsi "main", maka perlu untuk mendeklarasikan fungsi tersebut.

Cara penulisan:
TipeDATA namaFUNGSI (TipeDATA, ... , ...);
TipeDATA namaFUNGSI (TipeDATA namaPARAMETER, ...);

Contoh:
A. Jika fungsi berada di bawah "main", maka perlu deklarasi fungsi di atas main

1:  #include <util delay.h>
2:  #include "transceiver.h"
3:  #include "uart.h"
4:
5:  #define EnableTimer TIMSK;
6:  #define Aktif 0x01;
7:
8:  void timer0_init(void);
9:  void CekLoginSN(uint16_t data16);
10: unsigned char ks0108DoReadData(unsigned char first);
11:
12: void main(void)
13: {...
14: ..}
15: 
16: void timer0_init(void){ //Timer/Counter 0 initialization
17: TCCR0=0x05;                 //Mode 0 (normal, top=0xFF), T0clock = SysClock/1024(=3.906kHz), OC0 output disconnected
18: TCNT0=0x00;                 //overflow rate = 19.26Hz
20: OCR0=0x00;
21: TIMSK=0x00;          //Timer/Counter Interrupt initialization
22: EnableTimer = NonAktif;
23: }
*Penulisan prototype ditandai dengan warna merah

B. Jika fungsi berada di atas "main", maka perlu tidak deklarasi fungsi

1:  #include <util delay.h>
2:  #include "transceiver.h"
3:  #include "uart.h"
4:
5:  #define EnableTimer TIMSK;
6:  #define Aktif 0x01;
7:  void timer0_init(void){ //Timer/Counter 0 initialization
8:  TCCR0=0x05;                 //Mode 0 (normal, top=0xFF), T0clock = SysClock/1024(=3.906kHz), OC0 output disconnected
9:  TCNT0=0x00;                 //overflow rate = 10.26Hz
11:  OCR0=0x00;
12:  TIMSK=0x00;          //Timer/Counter Interrupt initialization
13:  EnableTimer = NonAktif;
14:  }
15:
16:  void main(void)
17:  {...
18:  ..}
19: 

Jenis2 fungsi di dalam struktur pemrograman C terbagi menjadi 4 jenis. Untuk penjelasan detil perihal fungsi ini akan dijelaskan dikesempatan mendatang.

5. Main/Utama
Main/Utama merupakan fungsi pertama yang akan dieksekusi dengan urutan dari atas ke bawah. Jika di tengah2 program terdapat instruksi pemanggilan fungsi, maka alur program akan lompat ke fungsi tersebut dan akan kembali lagi jika pengerjaan tugas di fungsi tersebut sudah selesai.

Cara penulisan:

1. Untuk fungsi tanpa nilai balik (output) dan tanpa parameter (input)
NamaFUNGSI();

2. Untuk fungsi dengan nilai balik (output) dan tanpa parameter (input)
VariabelPENAMPUNG = namaFUNGSI();

3. Untuk fungsi tanpa nilai balik (output) dan dengan parameter (input)
namaFUNGSI(variabel/konstanta, ... , ... );

4. Untuk fungsi dengan nilai balik (output) dan dengan parameter (input)
VariabelPENAMPUNG = namaFUNGSI(variabel/konstanta, ... , ... );

Contoh:

1. //--------program utama------//
2. int main(void){
3.  DDRB = 0xF0; 
4. PORTB = 0x00; 
5.      uartinit();                    //contoh no.1
6.      temp = PengambilanDataPL();    //contoh no.2
7.      TerimaDataPL(data16);          //contoh no.3
8.      temp2 = CekLoginPL(data16);    //contoh no.4 
9. while(1){
10. }
11. return 0;
12.}

Tutorial singkat ini mengambil sebagian bahan dari buku "Mikrokontroler AVR ATmega8//32/16/8535 dan Pemrograman dengan Bahasa C pada WinAVR" karangan Ardi Winoto, Penerbit INFORMATIKA