Kamis, 08 September 2016

Kenapa lampu bisa Mengeluarkan Cahaya?

Kenapa lampu bisa Mengeluarkan Cahaya?

          Masa kecil adalah saat dimana kita mengalami banyak hal yang menyenangkan. Karena anak pada saat kita kecil, kita pasti banyak angan-angan atau pemikiran-pemikiran konyol, padahal hal tersebut sebenarnya adalah yang dicari-cari oleh para ahli. Akan tetapi saat dewasa agan-angan tersebut berubah menjadi suatu tujuan yang seolah-olah wajib untuk kita wujudkan. Sehingga kita telalu fokus dengan hal tersebut dan melupakan hal-hal menarik yang dapat mnciptakan hal-hal baru. Pada saat aku kecil aku sering sekali bertanya-tanya, bagaimana caranya benda bulat yang tergantung di atas langit-langit rumah itu bisa bercahaya sangat terang ke penjuru kamar, apakah dia adalah benda penangkap cahaya matahi atau obor tanpa minyak?  Pertanyaan serupa juga di ajukan oleh teman-teman kecil yang di titipkan dirumah saya beberapa waktu lalu. Dan reaksi saya adalah

           Hah apaan ya? eng.. anu karena benda itu... eemm hehehe...  jadi begini kisahnya..

Pada tahun 1880, seorang Inggris yang bernama Humphry Davy melakukan eksperimen-eksperimen tertentu dengan tenaga listrik. Ia mempunyai apa yang sekarang kita namakan baterai listrik, tetapi baterai itu sangat lemah.


Ia menghubungkan kawat-kawat ke ujung-ujung baterai dan menempelkan sepotong karbon pada masing-masing dari ujung-ujung kawat yang bebas. Dengan menyentuh dua potong karbon bersama-sama dan menariknya agar terpisah, ia menghasilkan cahaya yang mendesis.

Ini dinamakan "busur listrik", tetapi ini adalah bukti pertama bahwa cahaya listrik itu dapat dibuat. Davy juga mengganti dua potong karbon dengan kawat platina tipis yang menghubungkan kedua ujung kawat yang menuju kepada baterai. Ketika arus listrik melewati kawat platina itu, kawat menjadi panas dan mulai berpijar dan menghasilkan cahaya!

Kesulitan dengan cahaya-cahaya listrik sederhana ini adalah bahwa sumber tenaga listrik tidak cukup kuat. Jadi seorang murid Davy, Michael Faraday, mengadakan eksperimen yang mengarah kepada pengembangan generator-generator listrik. Dengan menggunakan mesin-mesin uap untuk menggerakkan generator-generator itu, ditemukan sumber-sumber tenaga listrik yang lebih baik.

Sementara itu, di Amerika Serikat, Thomas Edison mengadakan eksperimen dengan benang-benang karbon tipis. Ketika benang karbon, atau filamen, dipanaskan dengan mengalirkan arus listrik kepadanya, benang itu berpijar. Jika ini dilakukan di udara, karbon itu sendiri akan membakar.

Jadi, Edison menaruhnya di dalam bola lampu kaca dan mengeluarkan udara dari dalamnya. Karena tidak ada oksigen di dalam bola lampu itu, karbon tidak dapat membakar.

Bola lampu itu berpijar dengan terang dan padam secara sangat perlahan-lahan. Sekarang kita mempunyai lampu pijar listrik yang menghasilkan cahaya yang sangat terang.



Tetapi para ilmuwan mengetahui bahwa semakin filamen dipanaskan, semakin kuat cahaya yang dihasilkan. Jadi mereka mencari bahan-bahan yang dapat dipanaskan sampai suhu-suhu tinggi tanpa mencair.

Salah satu dari bahan-bahan ini adalah tantalum, sebuah logam yang mencair pada suhu 5.160 derajat Fahrenheit. Logam itu diubah menjadi kawat-kawat halus dan digunakan untuk filamen-filamen lampu pada tahun 1905.

Sebuah logam yang bahkan lebih baik untuk filamen adalah tungsten, karena logam itu mencair pada suhu 6.100 derajat Fahrenheit. Pada mulanya tidak seorang pun yang dapat mengubah tungsten menjadi kawat dan memerlukan waktu selama bertahun-tahun untuk mengembangkan proses ini.

Sekarang, lampu-lampu filamen tungsten adalah lampu-lampu yang paling banyak digunakan dan kira-kira 1.000.000.000 dari lampu-lampu itu dibuat di Amerika Serikat setiap tahunnya!

Minggu, 04 September 2016


MENGHUBUNGKAN DAN MENGGUNAKAN LCD SEBAGAI PERIPHERAL PADA MIKROKONTROLER AVR DENGAN AVR STUDIO 5



1.1.      PENGENALAN LCD





Gambar 1. Liquid Crystal Display
(a) Graphical LCD; (b) Character LCD

LCD merupakan singkatan dari Liquid Crystal Display. LCD merupakan alat atau komponen yang digunakan untuk menampilkan berbagai hal secara visual. Ada banyak jenis LCD, namun yang secara umum yang digunakan dalam dunia robotika atau mikrokontroler dapat dikelompokan dalam dua jenis yaitu, character LCD dan graphical LCD. Pada tulisan ini akan yang akan dibahas adalah jenis LCD yang lebih sederhana yaitu character LCD.

Gambar 2. LCD JHD 162A
Hitachi HD44780 adalah salah satu seri character LCD yang umum digunakan dalam dunia mikrokontroler. LCD ini mampu menampilkan karakter dalam ukuran 2 baris yang masing-masing baris terdiri dari 16 kolom. Namun yang akan digunakan dalam arttikel ini adalah LCD seri JHD 162A. LCD seri JHD 162A ini memiliki bentuk yang hampir sama dan memiliki desain yang kompetibel dengan seri HD44780, sehingga dapat berjalan dengan code yang yang sama. Kedua LCD ini memiliki konfigurasi pin yang sama seperti dapat dilihat pada table 1:
Tabel 1. Konfigurasi pin LCD
No.
PIN
NAMA
FUNGSI
1
VSS
Ground (referensi tegangan)
2
VCC
Power (Positive voltage), +5 Volt
3
VEE
Contrast Voltage (tegangan pengatur kontras)
4
RS
Register Select (memilih register):
0 = Instruction Register (mengaktifkan register instruksi)
1 = Data Register (mengaktifkan register penerima data)
5
R/W
Read/Write:
0 = Write mode (LCD bekerja dalam modus menulis)
1 = Read Mode (LCD bekerja pada modus data LCD bisa dibaca)
Umumnya, read mode jarang digunakan sehingga sebagain orang hanya menghubungkan PIN ini pada ground (0 = modus menulis)
6
E
Enable:
0 = Mulai menampung (save/latch) data karakter pada LCD
1 = disable / me-nonaktifkan
7
DB0
                    Data Bit 0 (LSB)
8
DB1
                    Data Bit 1
9
DB2
                    Data Bit 2
10
DB3
                    Data Bit 3
11
DB4
Data Bit 1 / Data Bit 4
12
DB5
Data Bit 2 / Data Bit 5
13
DB6
Data Bit 3 / Data Bit 6
14
DB7
Data Bit 4 / Data Bit 7 (MSB)
15
BPL
Back Plane Light ( tegangan untuk backlight), +5 Volt atau lebih rendah
16
GND
Ground


1.2.      MENGHUBUNGKAN LCD

Kedua seri character LCD yang disebutkan sebelumnya, dapat beroperasi dengan mode 8 bit maupun mode 4 bit. Mode 8 bit akan menghasilkan proses yang lebih cepat, tetapi memerlukan 8 pin koneksi data pada mikrokontroler. Sedangakan mode 4 bit lebih lambat dibandingkan mode 8 bit, tetapi hanya memerlukan 4 pin untuk mengirimkan data dari mikrokontroler (koneksi data belum termasuk koneksi pengendalian). Namun umumnya kecepatan pengolahan data mode 4 bit sudah cukup memenuhi kebutuhan dan lebih umum digunakan oleh para pecinta mikrokontroler. Oleh karena pada tulisan ini kita akan belajar menghubungkan mikrokontroler dan LCD JHD 162A dengan mode 4 pin.
Gambar 3. Skema penggunaan LCD dengan modus 4 bit.

1.3.      MENGGUNAKAN LCD

Sebelum mulai menggunakan alat atau komponen elektronik tertentu biasanya kita akan mencoba untuk mempelajari datasheet dari komponen tersebut, misalnya data sheet dari LCDini. Tapi untuk menghasilkan proses pembelajaran yang lebih produktif dan efisien, sahabat tidak perlu melakukan hal tersebut. Saya yakin sahabat suka dengan hal yang lebih sederhana.  Peter Fleury telah menyediakan library LCD, yang dapat sahabat unduh di sini. Oleh karena itu sebelum memulai coding dengan AVR Studio 5, sebaiknya sahabat memiliki mengunduh dan meng-extract library tersebut.
Sekarang kita akan memulai dengan membuka AVR Studio 5 dan memulai create new project. Setelah terbuka, pada panel disebelah kanan, sahabat akan menemukan jendelaSolution Explorer. Lakukan klik kanan pada nama project di jendela tersebut. kemudian pilih Go to à Add dan kemudian pilih Existing Item. Jendela pencarian akan muncul, dan sahabat tinggal memilih (Add) file lcd.c dan kemudian ulangi langkah diatas untuk memilih file lcd.h. Akhirnya kita dapat melihat kedua file (file c dan file header dari library LCD) tertera pada project kita.
Gambar 4. Menambahkan library LCD pada project di AVR Studio 5
Setelah kita menambahkan library LCD pada project kita, mari lanjutkan dengan mengatur konfigurasi yang sesuai untuk library tersebut, dengan mengikuti langkah-langkah berikut ini:
-   Lakukan double click pada bagian ‘lcd.h’ (pada jendela Solution Explorer), sehingga akan memunculkan tab ‘lcd.h’. Selanjutnya lakukan scroll ke bawah secara perlahan agar kita tidak melewatkan hal-hal yang penting.
-       Pada bagian awal kita akan menemui beberapa teks komentar yang mendeskripsikan tentang library tersebut.
-   Jika kita melakukan scroll ke bawah lagi maka kita akan menemukan bahwa baris yang mendefinisikan nilai XTAL (atau F_CPU). Sesuaikan nilainya dengan nilai clock (F_CPU) yang kita gunakan pada mikrokontroler. Jika nilai ini tidak sesuai maka kita akan mendapatkan waktu delay yang tidak sesuai juga.
-         Scroll lagi ke bawah dan kita akan menemukan baris yang mendefinisikan LCD_IO_MODE. Seperti telah dijelaskan pada deskripsi di bagian awal, LCD_IO_MODE = 0 berarti LCD dalam modus memory mapped. Sedangakan untuk LCD_IO_MODE = 1 berarti LCD dalam modus 4 bit. Pastikan agar LCD_IO_MODE di set dengan nilai 1 (modus 4 bit). Perlu diingat bahwa library ini tidak mendukung modus 8 bit.
-    Setelah bagian LCD_IO_MODE maka kita akan menemukan bagian penting lainnya, yaitu pendefinisian port/pin pada mikrokontroler yang telah dihubungkan dengan LCD. Sesuaikan port dan pin yang anda gunakan. Umumnya, DB4,…,DB7 pada LCD dihubungkan dengan pin D4 hingga D7 pada mikrokontroler. Sedangkan 3 pin pengendali LCD (RE, R/W, E) bebas sesuai keiinginan kita. Sebenarnya, kita bebas mengatur pin yang digunakan, yang terpenting adalah kita mendefinisikan pin-pin tersebut pada bagian ini sesuai dengan keadaan yang sebenarnya.
-      Sahabat telah selesai melakukan proses pengaturan pendefinisian atau pengaturan konfigurasi. Jangan lupa untuk menyimpan (save) semua setting yang telah sahabat lakukan dalam lcd.h ini.
-     Jika kita tetap melakukan scroll lebih lanjut lagi maka kita akan menemukan rangkaian daftar perintah pada LCD yang dapat dijalankan dengan meng-input-kan perintah tersebut pada fungsi lcd_command().
-      Selanjutnya kita juga akan menemukan rangkaian daftar fungsi bersama deskripsinya, yang di definisikan melalui library ini. Fungsi-fungsi tersebut antara lain lcd_init()lcd_clrscr(),lcd_home()lcd_gotoxy()lcd_putc()lcd_puts()lcd_puts_p()lcd_command()lcd_data() danlcd_puts_P(). Their description is attached alongwith their declaration.
Terakhir, jangan lupa untuk memasukan (#include) “lcd.h” pada bagian header file c project kita. Sekarang kita sudah siap untuk melakukan coding untuk menampilkan karakter yang kita inginkan pada LCD.
Coding
Mari kita coba menampilkan karakter yang sederhana, sekaligus untuk memeriksa apakah kita telah berhasil menghubungkan LCD dan mikrokontroler kita. Sahabat bisa menggunakan code berikut ini:

Gambar 5. Contoh c code untuk menampilkan karakter sederhana pada LCD
Jika sudah selesai mengetik code diatas, lakukan compile dan build untuk menghasilkan file hex. Lakukan burning/programming/flashing file tersebut ke dalam mikrokontroler sahabat yang sudah terhubung dengan LCD dan lihat apa yang terjadi dengan LCD sahabat. Jika sahabat telah melihat tulisan “Hallo Sahabat” dan “Sky-Institute” pada baris pertama dan baris kedua maka saudara telah berhasil menghubungkan dan menggunakan LCD.
Sekarang mari kita pelajari sesuatu yang lebih, sekaligus mematangkan kemampuan sahabat dalam menggunakan LCD karakter ini.

1.3.1.      Menampilkan karakter/string dinamis

Pada bagian ini kita akan melihat contoh bagaimana menampilkan karakter yang dinamis/bergerak pada LCD kita. Mempelajari bagian ini akan membantu kita untuk lebih mengeksplore dan mengenal library LCD yang kita tambahkan diatas. Bagian ini juga akan membuat kemampuan sahabat semakin bertambah, dan saya yakin hal ini akan memberikan kesenangan dan kepuasan bagi sahabat yang sedang mempelajari pengunaan LCD.
Kali ini kita akam menampilkan tulisan atau karakter yang akan bergerak. Sebagai tips: gunakanlah perintah/fungsi lcd_command() yang telah kita lihat sebelumnya, misalnyalcd_command(LCD_MOVE_DISP_RIGHT) untuk menggerakan karakter ke kanan,lcd_command(LCD_MOVE_DISP_LEFT), dan lain-lain. Kemudian coba buat agar tulisan tersebut dapat berputar bergantian antara baris satu dan baris kedua pada LCD. Sahabat bisa mempelajari lebih jauh menggunakan code berikut ini:
Gambar 6. Contoh c code untuk menampilkan karakter dinamis

1.3.2.      Menampilkan nilai atau angka (integerfloat):

Seperti namanya LCD karakter, maka fungsinya pun untuk menampilkan karakter. Namun bagaimana jika sahabat ingin menampilkan data integerfloat atau yang lain? Apakah hal tersebut dapat dilakukan? Pada dasarnya yang dapat kita display adalah grafik ataupun karakter. Sedangkan integer dan proses aritmatik hanya bisa terjadi didalam otak. Angka merupakan merupakan representasi karakter dari sebuah data integerfloat, dan lain-lain. Oleh karena itu kita dapat menampilkan data integer ataupun hasil operasi aritmatika lainnya, tetapi kita perlu ‘merubah’/merepresentasikan dalam bentuk data karakter (string).
Untuk mengubah data integer menjadi data string kita dapat menggunakan perintah/fungsiitoa(integer_yg_ingin_diubahrepresentasi_string_nyabasis). Dengan fungsi tersebut kita dapat ‘mengubah’ data integer menjadi data karakter sesuai basis yang diinginkan. Misalnya jika kita ingin mengubah data integer 14 menjadi data string dalam bentuk biner maka basis kita isi dengan 2. Dari pada berpanjang lebar, mari kita lakukan percobaan dengan code berikut ini:

Gambar 7. C code untuk menampilkan data integer

Secara umum, kita tidak disarankan untuk menggunakan perhitungan decimal (float number) dalam melakukan pemrograman mikrokontroler. Hal ini disebabkan karena umumnya inti otak dari mikrokontroler tidak dilengkapi dengan kemampuan untuk melakukan operasi aritmatik dengan bilangan decimal. Yang dapat dilakukan oleh otak dari mikrokontroler adalah melakukan operasi aritmatik. Namun secara engineer hal itu dapat dilakukan dengan mensimulasi (emulate) operasi aritmatik tersebut pada perangkat lunaknya.
Jika sahabat melakukan operasi aritmatik sederhana dan selalu menghasilkan bilangan bulat (integer) maka sahabat tidak perlu khawatir karena mikrokontroler dapat melakukannya dengan mudah. Tetapi jika pecahan atau bilangan desimal (float) tidak dapat dihindari maka sahabat perlu menggunakan perintah sprintf(). Seperti yang telah disebutkan diatas bahwa untuk melakukan operasi aritmatik bilangan decimal maka kita perlu menambahkan semacam emulator pada mikrokontroler kita. Fungsi sprintf() umum digunakan, tetapi membutuhkan waktu dan memori yang lebih banyak dibandingkan operasi aritmatik sederhana. Oleh karena itu sedapat mungkin sabahat menggunakan perhitungan yang sederhana.
Terkadang kita tidak dapat menghindar dari operasi aritmatik bilangan desimal. Pilihan lain adalah dengan menggunakan perintah/fungsi seperti dtostre() atau dtostrf(), karen fungsi-fungsi tersebut memiliki library yang lebih sederhana dan ringan dibandingkan perintah sprintf(). Atau kita juga dapat menggunakan perintah rprintfFloat(jmlhdigitdouble_or_float) yang terdapat pada library AVR (rprintf.h). 
Sekarang mari kita coba menampilkan data float ke dalam LCD, misalnya data tekanan udara.

Gambar 8. C code untuk menampilkan data float/double
Setelah sahabat memprogram mikrokontroler sahabat dengan code diatas, apakah yang terjadi? Apakah yang muncul di LCD hanya ‘tanda tanya’ (?) seperti gambar dibawah ini?

Gambar 9. Error saat menampikan data float pada LCD
Masih ingat kan dengan penjelasan diatas bahwa, untuk melakukan operasi dengan data float, mikrokontroler membutuhkan ‘emulator’. Nah, kita perlu menjalankan ‘emulator’ tersebut agar operasi berjalan lancar, dengan cara memberitahukan kepada linker agar menggunakanfloating point libraryLibrary ini umumnya sudah tersedia dalam software AVR studio 5, tetapi perlu kita set agar library tersebut dapat digunakan. Library yang perlu ditambahkan adalahlibprintf_flt.a dan libm.a, dan kita juga perlu menambahkan -Wl,-u,vfprintf -lprintf_flt –lmpada linker option agar library diatas dapat dijalankan dengan benar.
Berikut ini adalah cara memberitahukan linker pada AVR studio 5 mengenai floating point library:
-          Pada bagian menu klik Project (ALT+F7)
-          Klik Toolchain dan lihat pada bagian AVR/GNU C Linker dan pilih Libraries.
-          Pada bagian Librarier (-Wl,-l), lakukan klik pada tombol Add, dan sebuah jendela akan terbuka. Ketikkan (insertlibprintf_flt.a. Pilih Ok dan ulangi dari tombol Add dan ketikkanlibm.a.
-          Lanjutkan dengan mengklik bagian Miscellaneous pada bagian AVR/GNU C Linker dan ketikkan -Wl,-u,vfprintf -lprintf_flt –lm pada baris input disamping tulisan Other linker flags.
-         Lakukan save, kemudian rebuild file C project sahabat.
Program kembali mikrokontroler sahabat dengan file hex yang baru, maka sahabat akan mendapatkan tampilan pada LCD seperti yang diharapkan.
Catatan:  bagi sahabat yang masih menggunakan CV AVR, sahabat dapat melakukan langkah diatas dengan melakukan klik pada Project à Configure, kemudian pada bagian (s)printf feature ubah statusnya menjadi float, width, precision.

Kesalahan (error) yang Sering Terjadi dan Solusinya
Saat menggunakan LCD mungkin sahabat akan menemui beberapa masalah seperti berikut:
-          tidak ada yang terlihat di layar
-          layar tampak hitam semuanya
-          hanya tampak kursor yang berkedip, dan tidak nampak karakter yang diinginkan
-          tampak karakter atau simbol yang aneh
Untuk masalah-masalah tersebut coba selasaikan dengan langkah-langkah berikut:
ü  Atur resistor variabel (potensiometer) untuk meningkatkan kontras
ü  Periksa kembali sambungan, mungkin ada koneksi yang putus atau mengalami short sircuit.
ü  Periksa kembali code sahabat. Pastikan sahabat telah menggunakan nilai clock (XTAL/F_CPU) yang tepat pada project utama maupun pada library lcd.h.
ü  Terakhir, jangan lupa bertanya kepada orang lain, karena mungkin mereka pernah mangalami masalah yang sahabat hadapi, dan mereka telah berhasil menemukan solusinya. Sahabat juga dapat bertanya di blog ini melalui jendela comment.




BIBLIOGRAPHY



dl8dtl. (2006, June 30). How to use sprintf with floats in AVR STUDIO (winavr compile). Retrieved August 14, 2012, from www.avrfreaks.net:http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=39892
Motisan, R. (2012, February 8). AVR Studio 5 snprintf / vsnprintf problem with Floats. Retrieved August 14, 2012, from POCKET MAGIC: Where Technology meets Magic:http://www.pocketmagic.net/?p=2513
Rudiawan, E. (2012, March 19). ngooprek.com. Retrieved August 14, 2012, from Belajar AVR – Sensor Interfacing – 13: http://ngooprek.com/blog/2012/03/19/belajar-avr-sensor-interfacing-13/
Vitu, M. (2011, June 16). LCD Interfacing with AVR. Retrieved August 14, 2012, from maxEmbedded: a Guide to Robotics and Embedded Electronics:http://maxembedded.wordpress.com/2011/06/16/lcd-interfacing-with-avr/
winavr.scienceprog.com. (2007, January 19). Using sprintf function for float numbers in AVR-GCC. Retrieved August 14, 2012, from AVR-GCC Tutorial WINAVR:http://winavr.scienceprog.com/comment/28 
Assalamualaikum...

















Ada referensi untuk pemograman C pada Code vision AVR nih semoga membantu :D

A.    Mengenal Bahasa C
            Sebuah berkas program C terdiri dari beberapa unsur, yaitu dokumentasi program , pengarah prapengolahan, bagian deklarasi global, sebuah fungsi main ( ), dan fungsi-fungsi buatan pemrogram. Masing-masing fungsi ini terdiri dari badan fungsi yang memuat deklarasi local dank ode program yang dapat dieksekusi.

Berikut sebuah program sederhana : 

/* Nama file : Program sederhana
Conto program sederhana pada program C*/
#include
 
int main ( )
{
return 0; 
}

Dokumentasi Program
            Memberikan dokumentasi pada program sangat berguna untuk membantu memperjelas alur logika penyusunan program. Karena tujuannya hanya sebagai dokumentasi, komentar-komentar yang dituliskan pada program tidak diproses oleh compiler. Komentar dapat dimulai dengan simbol dua karakter yang terdiri dari garis miring dan asterisk (/*) dan diakhiri dengan asterisk dan garis miring.
            Karakter komentar /* dapat diletakkan dimana saja didalam program dan dapat mencakup lebih dari satu komentar, dengan syarat setiap /* harus ditutup dengan */. Pada awal program, komentar yang diberikan biasanya bertujuan untuk menjelaskan apa yang dilakukan oleh program, sedangkan pada bagian probram yang lain tujuannya adalah untuk memperjelas logika program. 
            Dalam membeikan komentar untuk dokumentasi program, ada beberapa hal yang perlu diperhatikan, diantaranya:
1.      Komentar hendaklah diberikan pada tempat-tempat yang bias menimbulkan kekaburan pengertian.
2.      Beri komentar ditempat yang perlu saja, misalnya pada awal program untuk menjelaskan secara ringkas tujuan program, pada awal blok pernyataan untuk menjelaskan kumpulan tugas yang dilakukan , pada pernyataan keputusan untuk menjelaskan kondisi yang harus dipenuhi dalam pengambilan keputusan.
3.      Komentar tidak bisa dibuat bertingkat , yaitu adanya komentar dalam komentar, misalnya;
/* Komentar awal /* Komentar lagi /* Komentar berikutnya*/

Pengarah Prapengolahan 
            Dalam mengolah kode-kode program, compiler C melaksanakan beberapa tahapan yaitu melakukan prapengolahan untuk melakukan persiapan yang diperlukan sebuah berkas program kompilasi. Di dalam program pengarah prapengolahan diawali oleh karakter # yang dituliskan pada baris-baris pertama program. 
            Prapengolahan memperlakukan berkas program sebagai sederetan baris teks: membaca, mengolah, dan menuliskan kembali hasil pengolahan kedalam berkas semula. Prapengolah membuang semua baris perintah prapengolahan dari berkas sumber dan melakukan perubahan terhada berkas sumber sesuai dengan arahan perintah yang diberikan. Secara garis besar pelayanan prapengolah dibagi dalam tiga kelompok :
1)      Penyisipan berkas (#include),
2)      Pendefenisian makro (#define), dan 
3)      Pengarah kendali compiler (#ifdef, #ifndef, dll)

            Dalam menyertakan berkas judulyang diperlukan olefh fungsi input dan outputyang digunakan dalam program : #include dan untuk mendefenisikan sebuah konstanta (pi): #define PI 3.1459, sementara itu #ifdef diguakan apabila hendak melakukan kompilasi terhadap satu bagian program hanya apabila sebuah ekspresi tertentu telah didefenisikan menggunakan #define. Standar ANSI C menambahkan beberapa pengarah prapengolahan tambahan; pengujian alternatif, pernyataan instruksi, pendeteksian kesalahan, pengubahan pengenal menjadi string dan penggabungan pengenal.

Deklarasi Global
            Pada bagian deklarasi global terdapat pendeklarasian variable dan prototipe fungsi. Semua variable y ang dideklarasikan pada bagian ini akan dikenal oleh semua bagian program yang terdapat dibawahnya. Sementara itu prototipe fungsi adalah sebuah deklarasi tentang akan digunakannya sebuah fungsi didalam program. Ada tiga unsur yang perlu disebutkan: jenis data yang dikembalikan oleh fungsi, nama fungsi dan daftar argumen yang diberikan pada fungsi yang diberi jumlah argumen (arity) dan jenis data masing-masing argumen.

Fungsi Main ( )
            Fungsi main ( ) memegang peranan yang penting pada sebuah program. Fungsi ini merupakan fungsi utama pada setiap program C dimana eksekusi keseluruhan program dimulai. Barapapun banyaknya fungsi yang terdapat pada sebuah program C, main ( ) adalh fungsi utama yang akan dilaksanakan oleh compiler. Contoh program yang memperlihatkan struktur fungsi main ( ) sederhana.
/* Nama file : Hello.c
Menampilkan teks dilayar*/
#include 
int main ( )
{
printf(“hello, world!\n”);
return 0;
}

            Pada contoh diatas fungsi main ( ) tidak memerlukan argumen, badan fungsi main ( ) tidak memiliki bagian deklarasi lokal, dan hanya memiliki sebuah pernyataan yang dapat dieksekusi, berupa fungsi output printf ( ). Kode program (pernyataan) yang dapat dieksekusi adalah kode program yang merupakan baris-baris instruksi yang harus dilaksanakan oleh kompiler. Kode program ini dapat berupa input/output, konstruksi runtunan, konstruksi keputusan dan konstruksi pengulangan. Dalam badan fungsi main ( ) terdapat pula bagian deklarasi lokal yang dimaksudkan untuk mendeklarasikan variable-variabel dan prototipe-prototipe fungsi. semua variable dan prototipe fungsi ini bersifat lokal terhadap main ( ), dalam arti hanya dikenal oleh main ( ). 

Fungsi Buatan Pemrogram
            Selain main ( ) yang mempunyai kedudukan khusus dalam sebuah program, terdapat pula fungsi-fungsi buatan pemrogram. Pada fungsi ini dapat diberikan deklarasi prototype fungsi lain secara local, sehingga hanya dikenal oleh fungsi tersebut. Kode program yang dapat dieksekusi juga dapat berupa fungsi input/output standar, konstruksi runtunan, konstruksi keputusan, dan konstruksi pengulangan.

Pembatas 
            Setelah pendefenisian fungsi terdapat kurung kurawal buka “{“ dan kurung kurawal tutup “}” yang menunjuk akhir blok fungsi, kurung kurawal ini disebut pembatas (delimeters). Dalam badan program kurung kurawal juga dapat digunakan untuk membatasi pernyataan majemuk yang dimiliki oleh sebuah blok kode program. Selain kurung kurawal juga terdapat beberapa pembatas lain, diantaranya: [ ], < >, ( ), “ “, dan ‘ ‘.

Akhir Pernyataan
            Setiap pernyataan (statement) dalam C diakhiri dengan titik koma ( ; ) yang berperan untuk memberitahu compiler akhir pernyataan. Carriage return yang diperoleh sewaktu menekan tombol bukan penunjuk akhir pernyataan, karena C mengabaikan semua karakter yang disebut karakter-karakter whitespace, yaitu spasi, tabulator dan carriage return (newline).

Tipe Data
            Adalah suatu nilai yang dapat dinyatakan dalam bentuk konstanta atau variabel dan operator. Konstanta menyatakan nilai yang tetap, sedangkan variabel menyatakan nilai yag dapat berubah-ubah selama eksekusi berlangsung.
Tipe data simple merupakan tipe data bawaan dari C++, tipe data ini terdiri dari beberapa tipe data yaitu:
·         Tipe data integral merupakan tipe data yang terdiri dari bilangan dengan range yang berbeda-beda.
·         Floating merupakan tipe data untuk bilangan desimal. Untuk semua Turbo C++, type floating-point yang menggunakan format-format IEEE floating-point digunakan oleh intel 8087. Type float menggunakan real format 32-bit IEEE. Type double menggunakan real format 64-bit IEEE. Type long double menggunakan extended real format 80-bit IEEE.

            Address merupakan tipe data yang digunakan untuk menunjuk suatu alamat memori. Sedangkan tipe data structured merupakan tipe data bentukan.

Identifiers
            Identifiers adalah untaian satu atau lebih huruf, angka, atau garis bawah ( _ ). Panjang dari identifier, tidak terbatas, walaupun untuk beberapa kompiler hanya 32 karakter pertama saja yang dibaca sebagai identifier (sisanya diabaikan). Identifier harus selalu diawali dengan huruf atau garis bawah ( _ ). Ketentuan lainnya yang harus diperhatikan dalam menentukan identifier adalah tidak boleh menggunakan keyword dari bahasa C.

Dekalarasi Variabel
            Untuk menggunakan variable pada C, kita harus mendeklarasikan tipe data yang akan digunakan. Sintaks penulisan deklarasi variable adallah dengan menuliskan tipe data yang akan digunakan diikuti dengan identifier yang benar, contoh :
int a;
float mynumber;
            Jika akan menggunakan tipe data yang sama untuk beberapa identifier maka data dituliskan dengan tanda koma, contoh :
int a, b, c;
            Tipe data integer (char, long, short, dan int) dapat berupa signed atau unsigned tergantung dari kisaran nilai yang direpresentasikan. Dilakukan dengan menyertakan keyword signed atau unsigned sebelum tipe data, contoh : 
unsigned short NumberofSons;
signed int MyAccountBalance;
            jika tidak ditulis maka akan dianggap signed.

Inisialisasi Variabel

Ketika mendeklarasikan variable local, kita dapat memberikan nilai tertentu. Sintaks penulisan sbb :
Tipe identifier = initial_value ;

            Misalkan kita akan mendklarasikan variable int dengan nama a yang bernilai 0, maka dapat dituliskan : 
int a = 0;

Atau dengan cara lain, yaitu menyertakan nilai yang akan diberikan dalam tanda ( ) :
tipe identifier (initial_value);

Konstanta : Literals
            Konstanta adalah ekspesi dengan nilai yang tetap. Terbagi dalam nilai integer, nilai floating point karakter, dan string.

Nilai Integer
            Merupakan nilai konstanta numeric yang meng-identifikasikan nilai integer decimal. Karena merupakan nilai numeric, maka tidak memerlukan tanda kutip ( “ ) maupun karakter khusus lainnya. Contoh :
1776
707
-273

            C memungkinkan kita untuk menggunakan nilai octal (base 8) dan heksadesimal (base 16). Jika menggunakn octal harus digunakan dengan karakter 0 (karakter nol), dan untuk heksadesimal diawali dengan karakter 0X (nol, X). contoh :
75 // decimal
0113 // octal
0X4b // heksadecimal

Nilai Floating Point
            Merepresentasikan nilai decimal dan / atau eksponen, termasuk titik decimal dan karakter e (yang merepresentasikan “ dikali 10 pangkat n “, dimana n merupakan nilai integer) atau keduanya. Contoh :

3.14159 // 3.14159
6.02e23 // 6.02 * 10^23
1.6e-19 // 1.6 * 10^-19
3.0 // 3.0

Konstanta Define (#define)
            Kita dapat mendefenisikan sendiri nama untuk konstanta yang akan kita pergunakan, dengan menggunakan preprocessor directive #define. Dengan format : 
#define identifier value

Contoh :
#define PI 3.14159
#define NEWLINE ‘\n’
#define WIDTH 100

Deklarasi Konstanta (const)
            Dengan prefix const kita dapat mendeklarasikan konstanta dengan tipe yang spesifik seperti yang kita inginkan. Contoh :
const int width = 100;
constchar tab = ‘t’;
const zip = 12440;

Jika tipe data tidak disebutkan, maka compiler akan mengsumsikan sebagai int. 

Operator
            Operator yang disediakan C berupa keyword atau karakter khusus. Operator-operator ini cukup penting untuk diketahui karena merupakan salah satu dasar bahasa C.

Assignation ( = )
            Operator ini digunakan untuk membeikan nilai ke suatu variable.
a = 5 ;
           
            Memberikan nilai integer 5 ke variable a. Sisi kiri dari operator disebut lvalue (left value) dan sisi kanan disebut rvalue (right value). lvalue harus selalu berupa variable dan sisi kanan berupa konstanta, variable, hasil dari suatu operasi atau kombinasi dari semuanya. Contoh :

Int a, b; // a : ? b : ?
a = 10; // a : 10 b : ?
b = 4; // a : 10 b : 4
a = b; // a : 4 b : 4
b = 7; // a : 4 b : 7

            Hasil dari contoh diatas , a bernilai 4 dan b bernilai 7.
Contoh :
a = 2 + (b = 5);

equivalent dengan :
b = 5 
a = 2 + b
Arithmetic Operators ( +, -, *, / , % )
+ addition
- substraction
* multiplication
/ division
% module

Increase (++) and decrease (--).
Contoh :
            a++;
            a+=1;
            a=a+1;

            Operator increase dan decrease dapat digunakan sebagai prefix dan suffix. Dengan kata lain dapat dituliskan sebelum identifier variable (++a) atau sesudahnya (a++). Operator increase yang digunakan sebagai prefix (++a), letak perbedaan :

Example 1 Example 2 
            B=3; B=3;
            A=++B; A=B++;
            // A is 4, B is 4 // A is 3, B is 4

Relasional Operators (= =, !=, >, <, >=, <=)
            Untuk mengvaluasi antara dua ekspresi, dapat digunakan operator relasional. Hasil dari operator ini adalah nilai bool yaitu hanya berupa true atau false, atau dapat juga dalam nilai int, 0 untuk merepresentasikan “false” dan 1 untuk merepresentasikan “true”. Operator-operator relasional pada C :
            = = Equal
            != Different
            > Greater than
            < Less than
            >= Greater or equal then
            <= Less or equal then

Logic Operators ( !, &&, || )
            Operator ! equivalent dengan operasi Boolean NOT, hanya mempunyai 1 operand, berguna untuk membalikkan nilai dari operand yang bersangkutan. Contoh :

            ! (5 = = 5) returns false because the expression at is right (5 = = 5) would be true.
            ! (6 =<= 4) returns true because (6 <=4) be false.
            ! true returns false.
            !false returns false.

            Operator logika && dan || digunakan untuk mengevaluasi 2 ekspresi dan menghasilkan 1 nilai akhir. Mempunyai arti sama dengan logika Boolean AND dan OR. 

Conditional Operator ( ? )
            Operator kondisional mengevaluasi ekspresi dan memberikan hasil tergantung dari hasil evaluasi (true atau false ). Sintaks :
            conditional ? result1 : result2

Jika kondisi true maka akan menghasilkan result1, jika tidak akan menghasilkan result2.
            7 = = 5 ? 4 : 3 returns 3 since 7 is not equal to 5.
            7 = = 5 + 2 ? 4 :3 returns 4 since 7 is equal to 5 + 2.
            5 > 3 ? a : b returns a, since 5 is greater than 3.
            a > b ? a :b returns the greater one, a or b.

Explisit Type Casting Operators
            Explisit type casting operators memungkinkan untuk mengkonversikan tipe data yang sudan diberikan ke tipe data ynag lain. Ada beberapa cara yang dilakukan dalam C, yang paling populer yaitu tipe baru dituliskan dalam tanda kurung ( ), contoh :

            int i;
            float f = 3.14;
            i = (int) f;

            Contoh diatas mengkonversikan nilai 3.14 menjadi nilai integer (3). Tipe casting operator yang digunakan (int). cara lainnya :

            i = int ( f );

            Operator ini menerima 1 parameter, dpat berupa type variable atau variable itu sendiri dan mengembalikan ukuran type atau object tersebut dalam bytes :

            a = sizeof (char);
           
            Contoh diatas akan memberikan nilai 1 ke a karena char adalah tipe data dengan panjang 1 byte. Nilai yang diberikan ole sizeof bersifat konstan.

B.     Instruksi-instruksi pada Codevision AVR.
Pengembangan sebuah system menggunakan mikrokontroler AVR buatan ATMEL menggunakan software AVR STUDIO dan Codevision AVR. AVRSTUDIO merupakan softwarekhusus untuk bahasa assembly yang mempunyai fungsi sangat lengkap, yaitu digunakan untuk menulis program, kompilasi, simulasi, dan download program ke IC mikrokontroler AVR. Sedangkan Codevision AVR merupakan software C-cross compiler, dimana program dapat ditulis dalam bahasa C, Codevision memiliki IDE (Integrated Development Environment) yang lengkap, di mana penulisan program, compilelink, pembuatan kode mesin (assembler) dandownload program ke chip AVR dapat dilakukan pada codevision, selain itu ada fasilitas terminal, yaitu untuk melakukan komunikasi serial dengan mikrokontroler yang sudah deprogram. Proses download program ke IC mikrokontroler AVR dapat menggunakan systemdownload secara ISP (In-System Programming). In-System programmable Flash on-chipmengizinkan memori program untuk diprogram ulang dalam system menggunakan hubungan serial SPI (Andrianto, 2008: 17).
Berikut ini penjelasan penggunaan program dalam bahasa C di software Codevision AVR.
Preprocessor (#): Digunakan untuk memasukkan (include) text dari file lain, mendefinisikan macro yang dapat mengurangi beban kerja pemrograman dan meningkatkan legibility source code (mudah dibaca).
#define : Digunakan untuk mendefinisikan macro
Contoh :          #define                        ALFA             oxff
                        #define                        SUM(a,b)        a+b
                        #define                        sensor              PIN.2
                        #define                        pompa             PORTB.o
Komentar
Penulisan komentar untuk beberapa baris komentar sekaligus
/*
…komentar
..*/
Penulisan komentar untuk satu baris saja
//…komentar…

1.      Program Kontrol
a.      Percabangan
Perintah if dan if…else…
Perintah if dan if…else.. digunakan untuk melakukan operasi percabangan bersyarat. Sintaks penulisan if dapat ditulis sebagai berikut :
                                    if(<expression>)<statement>;
Sintaks perintah if …else …dapat dituliskan sebagai berikut:
                                    if(<expression>)<statement1>;
                                    else <statement2>;

b.      Looping (pengulangan)
Looping adalah pengulangan satu atau beberapa perintah sampai mencapai keadaan tertentu. Ada tiga perintah looping, yaitu: for …,while …, dan do…while…. Sintaks loop for dapat dituliskan sebagai berikut :
for
Untuk pengulangan yang melakukan proses increment
            for(nama_variable = nilai_awal;syarat_loop;nama_variable ++)
            {
statement_yang_diulang;
            }
            //untuk pengulangan yang melakukan proses decrement
For(nama_varible=nilai_awal;syarat_loop;nama_variable --)
{
Statement_yang_diulang;
}

Syarat_loop adalah pernyataan relasional yang menyatakan syarat berhentinya pengulangan, biasanya barkaitan dengan variable kontrolnama_variable++ dan nama_variable--, menyatakan proses increment dan proses decrement pada variable kontrol.
while
Perintah while dapat melakukan looping apabila persyaratannya benar. Sintaks perintah while dapat dituliskan sebagai berikut :
            nama_varible = nilai_awal;
while (syarat_loop)
{
Statement_yang_akan_diulang;
Nama_variable++;
}

2.      Library Function pada CodeVisionAVR
a.      Fungsi Input/Output
Fungsi-fungsi input/Output berada didalam file stdio.h, pada subdirektori …\INC. berikut ini beberapa fungsi I/O dasar yang disediakan pada CodeVision.
  1. char getchar(void) : menghasilkan nilai balikan berupa karakter yang diterima dari UART, menggunakan system polling (menerima data serial)
  2. void putchar(char c): mengirim karakter ’c’ menggunakan UART, menggunakan system polling (mengirimkan data serial)
Sebelum menggunakan fungsi ini, lakukan terlebih dahulu pengaturan konfigurasi komunikasi serial:
1)      Inisialisasi baudrate UART
2)      Mengaktifkan transmitter UART
3)      Mengaktifkan receiver UART
Fungsi I/O yang lebih tinggi lainnya menggunakan fungsi getchar dan putchar, seperti:
  1. void puts(char *str) : output, menggunakan putcharnull mengakhiri karakter string, berlokasi di SRAM.
  2. void putsf(char flash *str) : output, menggunakan putcharnull mengakhiri karakter string, berlokasi di FLASH.
  3. void printf(char flash *fmtstr[ , arg1, arg2, ...]) : output text yang terformat, menggunakanputchar, sesuai dengan format specifiers dalam fmtstr string.

b.                  Fungsi Matematika
Fungsi ini berada di dalam file math.h, pada subdirektori ...\INC. Berikut ini sebagian dari beberapa fungsi-fungsi matematika yang disediakan pada CodeVision.
  1. unsigned char cabs(signed char x): menghasilkan nilai absolute dari byte x
  2. unsigned int abs(int x): menghasilkan nilai absolute dari bilangan integer x
  3. unsigned long labs(long x): menghasilkan nilai absolute dari bilangan long integer x.
  4. float fabs(float x): menghasilkan nilai absolute dari bilangan floating point x
  5. signed char cmax(signed char a,signed char b) : menghasilkan nilai maksimum dari bytea dan b.
  6. int max(int a,int b) : menghasilkan nilai maksimum dari integer a dan b.


c.                   Fungsi LCD
Fungsi LCD ditunjukkan untuk memudahkan interfacing antara program C dan modulalphanumeric LCD yang dibuat dengan chip Hitachi HD44780 atau yang serupa chip Hitachi HD44780. fungsi ini berada di dalam file lcd.h, pada subdirektori …\INC. Header ini harus dimasukan (include) jika kita akan menggunakan fungsi-fungsi LCD. Sebelum menggunakan fungsi ini, terlebih dahulu harus diatur port mikrokontroler yang digunakan untuk komunikasi dengan modul LCD. Format LCD dalam lcd.h mendukung: 1x8, 2x12, 3x12, 1x16, 2x16, 2x20, 4x20, 2x24, dan 2x40 karakter. Fungsi-fungsi untuk mengakses LCD diantaranya adalah:
  1. unsigned char lcd_init(unsigned char lcd_columns): untuk menginisialisasi modul LCD, menghapus layar dan meletakkan posisi karakter pada baris ke-0. jumlah kolom pada LCD harus disebutkan (misal, 16). Kursor tidak di tampakkan. 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.
  2. void lcd_clear(void): menghapus layar LCD dan meletakkan posisi karakter pada baris ke-0 kolom ke-0.
  3. 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.
  4. void lcd_putchar(char c): menampilkan karakter c pada LCD
  5. void lcd_puts(char *str): menampilkan string yang disimpan pada SRAM pada LCD.
  6. void lcd_putsf(char flash *str): menampilkan string yang disimpan pada flash pada LCD.

d.                  Fungsi Delay
Menghasilkan delay dalam program-C. Berada pada header delay.h yang harus dimasukkan (include) sebelum digunakan. Sebelum memanggil fungsi, interupsi 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 –Configur – Compiler – Code Generation.
Fungsi delay yang dihasilkan adalah:
  1. void delay_us(unsigned int n) : fungsi ini menghasilkan delay selama n μ-detik, n adalah nilai konstan.
  2. void delay_ms(unsigned int n) : fungsi ini menghasilkan delay selama n mili-detik, n adalah nilai konstan.

Kedua fungsi tersebut secara otomatis akan me-reset watchdog-timer setiap 1 mili-detik dengan mengaktifkan instruksi wdr.
Fungsi – fungsi lain seperti fungsi akses memori, I2C, maxim/dallas semiconductor DS1302Real Time Clock, 1 Wire Protocol, SPI, Power Management dapat dilihat pada manualCodeVisionAVRCodeVisionAVR user manual.