Nov 24, 2013

Contoh Memasukan Periintah Ke RobotLine Follower Menggunakan AVR Condevision


A. NGOBROL DIKIT DULU GAN..
Pada perancangan alat elektronika berbasis mikrokontroler kadang dibutuhkan HMI (Human to Machine Interface) berupa display dan yang sangat lazim digunakan salah satunya adalah dengan menggunakan LCD.
Pada alat elektronika portable atau peralatan elektronika dengan sistem kecil LCD yang digunakan kebanyakan adalah jenis LCD yang berbasis HD44780 Controller. Jenis LCD ini banyak digunakan karena harganya murah dan dimensi yang cukup kecil sehingga sangat pas digunakan untuk aplikasi elektronika portable (battery powered) atau sistem dengan lingkup kecil. LCD jenis ini hanya bisa menampilkan text / character dalam koridor ASCII (American Standard Code for Information Interchange) yang terdiri dari angka simbol dan huruf Alphabetic.
Tetapi LCD dengan basis HD44780 controller juga bisa menampilkan custom character dengan memanfaatkan CG RAM internal pada controller tersebut. CG RAM bisa ditulisi dengan perintah khusus yang dikontrol oleh mikrokontroler host (mikrokontroler aplikasi).
Untuk memudahkan pemrograman dan mempersingkat development time, designer bisa menggunakan library untuk LCD HD44780 yang sangat banyak tersedia di Internet dan juga kadang dalam beberapa jenis compiler default menyediakan library tersebut. Dengan menggunakan Library LCD HD44780, designer hanya perlu memanggil fungsi2 yang tersedia pada library tersebut misal fungsi untuk menulis karakter ke LCD, fungsi untuk menghapus karakter yang tertampil pada LCD, fungsi untuk meletakkan kursor pada posisi baris dan kolom tertentu pada LCD dll tanpa harus menulis program sampai pada komunikasi IO antara mikrokontroler host dan controller LCD.
B. INTI TOPIK :)
Nubielab (www.nubielab.com) mencoba untuk menawarkan library LCD HD44780 dengan konsep yang sedikit berbeda dan dengan fasilitas fungsi tambahan seperti fungsi running text, progress bar, custom character dll. Kelebihan library ini adalah dikembangkan oleh anak Indonesia dan disebarluaskan secara gratis dengan lisensi GNU GPL. Karena ditulis oleh anak bangsa, dokumentasi juga sebagian besar berbahasa Indonesia dan sangat mudah dipelajari dan dimodifikasi. Bila ada kesulitan, pertanyaan, kritik, perbaikan, saran atau informasi bugs silahkan kirim lewat email ke herlambang @nubielab.com atau buka www.nubielab.com dan cari post artikel yang terkait.
Berikut adalah screenshot simulasi library LCD ini pada ISIS Proteus:

Nubielab LCD library animated screenshot

C. PEMBAHASAN SINGKAT

Pada Nubielab HD44780 LCD Library terdapat 2 file utama yaitu nubielab_lcdlib.c dan nubielab_lcdlib.h; nubielab_lcdlib.c berisi fungsi- fungsi pendukung untuk operasi IO dan komunikasi antara mikrokontroler host dengan kontroler LCD (HDD44780). Berikut adalah fungsi- yang terdapat pada nubielab_lcdlib.c beserta keterangan fungsi dan cara penggunaanya.
Pada file “nubielab_lcdlib.c” terdapat syntax berikut:
#include <mega8535.h>  //untuk ATmega8535, ubah sesuai kebutuhan
#include <delay.h>         
#include <string.h>
Syntax
#include <mega8535.h>”
berfungi untuk memilih jenis mikrokontroler AVR yang akan digunakan. Mega8535.h berisi pendefinisian alamat IO dan SFR yang terdapat pada mikrokontroler AVR jenis ATmega8535. Bila anda menngunakan jenis mikrokontroler yang lain, silahkan ganti sesuai dengan mikrokontroler yang digunakan.
#include <delay.h>“
berfungsi untuk memasukkan fungsi delay default CodeVisionAVR kedalam program sedangkan
#include <string.h>“
berfungsi untuk memasukkan fungsi string default CodeVisionAVR kedalam program, misal fungsi
unsigned int strlen(char *str);
yang berfungsi untuk mengetahui panjang data dalam suatu array.
#define __PORTLCD_  PORTC //silahkan diganti sesuai kebutuhan..	
#define DDR_CONTROL DDRC  //jangan lupa ini juga diganti :D
Syntax diatas berfungsi untuk mengganti port LCD bila diperlukan. Nilai default LCD menggunakan PORTC. Ganti sesuai dengan kebutuhan misal ingin memindah port LCD ke PORTD maka __PORTLCD_ PORTD, DDR_CONTROL DDRD.
#define lcd_number  16    //diganti sesuai kebutuhan misal pake yg 2x20 
             //lcd_number 20 (untuk perhitungan kolom LCD) running text     
#define PROGRESSPIXELS_PER_CHAR	6
#define buffer_lcd_length 97 //total karakter buffer_lcd_length - 17 = 80
Silahkan ganti nilai lcd_number sesuai dengan jumlah karakter maksimal pada LCD, nilai default adalah 16 yang bisa digunakan untuk LCD 16x… misalkan anda menggunakan LCD dengan jumlah baris karakter 20x… anda bisa ganti nilai 16 menjadi 20. PROGRESSBPIXELS_PER_CHAR berfungsi untuk menentukan jumlah step pixel (progress bar) dalam satu blok karakter. Konstanta buffer_lcd_length berfungsi untuk buffer runnning text, nilai yang sesungguhnya adalah buffer_lcd_length – 17 misal definisi buffer_lcd_length adalah 97, maka jumlah karakter maksimal untuk dimasukkan ke buffer running text adalah 80 character.
Nilai lebih berjumlah 17 berfungsi untuk marquee fading yaitu karakter kosong (dalam aplikasi menggunakan karakter spasi 0×20) setelah program melakukan marquee (running text) dan selesai pada karakter terakhir, program akan menampilkan karakter kosong pada LCD sehingga akan terlihat efek fading atau karakter hilang kekiri disertai dengan tampilan kosong pada sebelah kanan. Program akan menambah karakter spasi setelah karakter terakhir secara otomatis.
Konfigurasi koneksi pin LCD ke mikrokontroler sama dengan library default CodeVisionAVR .. tinggal pilih aja portnya dan ganti definisi DDR_CONTROL dan __PORTLCD_. Berikut adalah konfigurasi koneksi antara port mikrokontroler dengan port LCD, PORTX…. X mengindikasikan port yang dipilih A/B/C/D.
Table koneksi mikrokontroler ke LCD.

Konfigurasi port mikrokontroler AVR ke LCD HD44780
D. PREVIEW CODE DOLOOO….
Berikut adalah Code contoh penggunaan dalam demo:
1.Contoh penggunaan (LCD_RUNNING_TEXT.c)
Spoiler for LCD_RUNNING_TEXT.c
/*__ ___        __  __ ___  ___ ___  ___ _  _
|_ _|   \  ___ |  \/  |_ _|/ __| _ \/ _ \ \| | - eMBEDDED Design &
 | || |) ||___|| |\/| || |  (__|   / (_)| .` | - System Development
|___|___/      |_|  |_|___|\___|_|_\\___/_|\_|______________________+
 
;Homepage   : http://www.nubielab.com 
;Programmer : Herlambang Aribowo.
;Email      : herlambang@nubielab.com
;Mobile     : +62-85883289911
;------------------------------------
About Program:
Contoh penggunaan nubielab LCD library :D
library dilengkapi dengan fungsi moving message / running text, progress bar
user defined char, dan fungsi2 standar LCD. library ini tidak menggunakan fungsi
pembacaan data dari LCD termasuk fungsi wait busy dll..
tidak adanya perintah baca data dari LCD karena pertimbangan pengalaman pribadi
.. LCD RUSAK APLIKASI HANG!!! ____________ :D hal ini disebabkan
loop library bawaan CodeVisionAVR dibuat untuk menunggu jawaban dari LCD. hehe loop
tersebut tidak disertai fungsi timeout, ya jadinya fail dah.
 
mungkin kedepan akan saya tambahkan fungsi baca LCD dan busy wait serta fitur2
lain.. dan tentu saja dengan fungsi timeout :D
 
Satu lagi yang antik.. nama fungsi seperti lcd_puts, lcd_putsf, lcd_putchar
lcd_gotoxy, lcd_clear, lcd_control ..ane buat sama dengan nama fungsi pada 
LCD library default CodeVisionAVR hehe.. jadi fungsi dasar sama, misal agan
pake library default CodeVisionAVR sebelumnya, library ini bisa digunakan
tanpa perubahan  program yang significant :D
 
keterangan lebih lanjut tentang fungsi2 pada library ini dan kegunaanya serta
cara penggunaanya bisa dilihat langsung pada file nubielab_lcdlib.h
 
So... last but not least, library ini masih dalam tahap beta testing.. dan tentu
saja pasti ada bugsnya.. terutama masalah timing :) dan optimasi program..
tapi sudah usable koq hehe..
 
OPEN CRITICS and SUGGESTIONS.. send to the address above!
 
Happy Programming^^"
 
Compiler: CodeVisionAVR V2.03.9
Chip    : ATmega8535 X-tall 4Mhz
FUSE: H:C9    L:2F    Brownout@4.5V,WDT ON,BOD ON,SPI EN,X-tall High Freq. 
FUSE: H:C9    L:AF    Brownout@2.7V,WDT ON,BOD ON,SPI EN,X-tall High Freq.  
############################################################################
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
This code is distributed under the GNU Public License
which can be found at http://www.gnu.org/licenses/gpl.txt
 
Copyright 2009, 2010 Herlambang Aribowo
############################################################################
Ing ngarso sung tulodo; Ing madyo mangun karso; Tut wuri handayani.
________________________________"ODJO DUMEH"________________________________
*/
 
#include <mega8535.h>
//bila ingin menggunakan library ini, dalam program harus di include
//header library #include "nubielab_lcdlib.h"
//buka "nubielab_lcdlib.h" untuk pengaturan IO dan port yang digunakan
//default library ini menggunakan PORTC untuk port LCD
//konfigurasi PIN sama dengan library bawaan CVAVR (4bit mode)
#include "nubielab_lcdlib.h"  //pengaturan IO LCD buka disini
#include <stdio.h>           
#include <delay.h>                                                          
 
// Global variables
 
//berikut adalah contoh user defined chars :D
//bisa dibuat pendek dengan format hex,desimal atau oktal...
//pake biner biar mudah dipelajari... woookey digoyang gan"
__flash char arwl[]= 
{
0b00011,    //mata panah kiri
0b00111,
0b01111,
0b11111,
0b01111,
0b00111,
0b00011
};
__flash char arwr[]= 
{
0b11000,    //mata panah kanan
0b11100,
0b11110,
0b11111,
0b11110,
0b11100,
0b11000
};
__flash char arfl[]= 
{
0b11111,    //full block
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
__flash char pesan_1[]="HERLAMBANG ARIBOWO"; //isi pesan disini..
__flash char pesan_2[]="WWW.NUBIELAB.COM";   //masing2 pesan maks. 80 karakter
__flash char pesan_3[]="-DISCOVERING THE ART AND TECHNOLOGY-"; 
__flash char pesan_4[]="DEDICATED FOR WHO WANT TO REFRESHING ON THEIR KNOWLEDGE";
 
// Function prototype
void sett_regs(void);
 
// Main routine (super loop)
void main(void){
unsigned char i,dig[2]="";
char pesan_5[25]="";
char temperature = 100; //bwt nilai dummy aja..
 
sett_regs();
lcd_def_progressbar();  //panggil fungsi progressbar bila ingin digunakan
lcd_gotoxy(0,0);
lcd_putsf("LOADING..");
//dibawah adalah contoh penggunaan progress bar
for (i=0;i<100;i++){
    lcd_gotoxy(0,1);
    LCDprogressBar(i,100,16);
    lcd_gotoxy(10,0);
    dig[0] = (i/10)|0x30;
    dig[1] = (i%10)|0x30;   
    lcd_puts(dig);
    lcd_gotoxy(12,0);
    lcd_putchar('%');
    delay_ms(50);
    }
//karena sebelumnya sudah dipake oleh karakter progress bar,
//definisikan lagi user char yang lain kalo mo pake
lcd_defchar(arwl,0); //tulis user defined char ke CGRAM
lcd_defchar(arwr,1);  
lcd_defchar(arfl,2);
for(;;){
    //contoh pemanggilan pesan
    lcd_clear(); 
    lcd_gotoxy(2,0);
    lcd_putchar(0);  //user defined char pertamax
    lcd_gotoxy(13,0);
    lcd_putchar(1);  //user defined char keduax  ..kebawah sama                  
    __go_runf(0,3,12,pesan_1);
    lcd_clear(); 
    lcd_gotoxy(7,1);
    lcd_putchar(0);
    lcd_gotoxy(15,1);
    lcd_putchar(1); 
    __go_runf(1,8,14,pesan_2);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putchar(0);
    lcd_gotoxy(8,0);
    lcd_putchar(1);
    __go_runf(0,1,7,pesan_3);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("WWW.NUBIELAB.COM");
    for (i=0;i<=3;i++){
        lcd_gotoxy(i-1,1);
        lcd_putchar(2); 
        }
    for (i=12;i<16;i++){
        lcd_gotoxy(i,1);
        lcd_putchar(2);
        } 
    __go_runf(1,3,12,pesan_4);
    lcd_clear();
    //contoh pemakaian fungsi __go_runr(...) dengan formating char sprintf(...) 
    //untuk penggabungan sprintf dengan running tex mode, belum support nilai float
    sprintf(pesan_5,"SUHU: %2d%cC PUANAAAAS!",temperature,0xDF); 
    __go_runr(0,0,15,pesan_5);                 
    }
}
 
// Setting register
void sett_regs(void){
//Define I/O 
DDRA  = 0xFF;PORTA = 0x00;
DDRB  = 0xFF;PORT

0 komentar:

Post a Comment