Haaa.......... ?
Kok bertentangan neh.
oh iya gw dah buat listingnya, tapi bigu di simulasi pake top view hasil perhitungannya kg nongol.
apa konversi ascii-nya ada yang salah yah, soalnya di listing ini :
tulis_str("KADAR CO");
nongol di LCD "KADAR CO".
Ini maksudnya :
1. hanya hasil perhitugannya ga nongol tapi untuk karakter ASCII nongol.
2. Karakter " yang seharusnya g nongol ikut nongol.
bener yak? Saya anggap benar aj dah.
Btw ini komunikasi LCD 8 bit dengan mikro kan, jadinya make PORT mikro 2 buah, PORT 2 untuk data LCD dan PORT 3 untuk mode LCD. Klo saya si biasanya hanya 1 PORT untuk LCD, D0 dan D3 LCD tidak digunakan. Jadi komunikasi data 4 bit.
Kalo tertarik mengubah rangkaian LCD bilang, tp tar ubah semua coding program looo..
Sebenarnya basic wa Bahasa C dengan AVR n beda dengan AT89S51.
duluuuu.. banget pake Keil C untuk MCS51. Ya udah, Wa koreksi dulu listingnya :
// --------------
Koreksi 1 -------------------------------------------------------------
P3_3 = 0;
tulis_cmd(0x38); //LCD 2x16 character
Kok P3_3 tidak di define sekalian, kan nanggung.
void tunda_s()
{
int c;
for (c=0; c<500; c++);
tunda();
}
void tunda()
{
int i;
for (i=0; i<210; i++);
}
Wah g jelas neh waktunya coba :
void tunda_ms(unsigned int waktu)
{ unsigned int loop;
while (waktu--)
{
loop=1000; // tunda 1000 uS
while (loop--){} // Xtall 12 MHz
}
}
void tunda_us(unsigned int waktu)
{
while (waktu--){} // tunda 1 uS
} // Xtall 12 MHz
ulang:
baca_adc();
.......................
tunda_s();
goto ulang;
Perintah
goto pada bahasa terstruktur sebaiknya tidak digunakan meskipun disediakan, karena akan "lompat" ke baris program yang lain dan bisa menyebabkan kesalahan program (hang).
Pada listing anda tidak akan error karena
goto-nya hanya 1 buah, coba jika kompleks dan ada banyak
goto-nya. Program anda akan kacau balau.
ganti dengan
while (1)
{
............. // sudah umum untuk looping selamanya
}
void tulis_str(unsigned char *s)
{
while(*s)
tulis_char(*s++);
}
Tentu saja tanda " ditampilkan.
Coba ganti
void tulis_str(unsigned char *s)
{
*s++; // " (petik) pertama dilewati.
while(*s!=0x22) tulis_char(*s++);
// saat *s tidak sama dengan 0x22 = hex-nya karakter " (petik),
// maka tampilkan ......
}
// --------------
Koreksi 2 -------------------------------------------------------------
Untuk menguji LCD apakah bisa menampilkan bilangan bulat atau pecahan sebaiknya langsung memberikan nilai konstan dulu, jangan dari membaca nilai ADC karena bisa saja proses pembacaan ADC-nya sebenarnya belum berhasil.
Misal :
while(1)
{
nilai = 195;
tampil_data1(2,1);
nilai = 5678;
tampil_data(2,2);
tunda_ms(2000);
}
Ok ke koreksi listing
WR = 0;
WR = 1;
if (INT == 0)
RD = 0;
sensor = data_adc;
RD = 1;
}
Jika INT sama dengan 0 maka...........
Padahal Pin INT anda belum tentukan nilai defaultnya apa, bisa saja sejak awal berlogika 0.
seharusnya inisialisasi terlebih dahulu yaitu INT = 1; pada main program saat inisialisasi LCD.
INT itu maksudnya dijadikan
Interupsi Eksternal (P3.2) untuk membaca apakah ADC selesai konversi (EOC) ?
Tapi kok saya g liat ada proses inisialisasi interupsi eksternal ya ? Coba di cek.
Selain itu saya bingung melihat posisinya yang agak menjorok ke kanan, apakah maksudnya begini :
void baca_adc()
{
WR = 1;
RD = 1;
tunda();
WR = 0;
WR = 1;
if (INT == 0)
{ // perhatikan posisi kurung kurawal
RD = 0;
sensor = data_adc;
RD = 1;
} // perhatikan posisi kurung kurawal
}
Saya koreksi 1 aj yah.
unsigned char nilai,sensor;
................
void kon_ascii()
{
koma2 = (nilai % 10) + 0x30;
nilai /=10;
koma1 = (nilai % 10) + 0x30;
nilai /=10;
..................
}
Saya lihat
nilai memiliki data maksimal 4 digit atau maksimal
nilai = 9999
tetapi type data yang digunakan
unsigned char, coba lihat dulu di link berikut
http://www.keil.com/support/man/docs/c51/c51_le_datatypes.htmjadi seharusnya
unsigned int.
di KeilC ada fungsi Matematika yang namanya math.h pada librarynya.
Lihat helpnya dan cari fungsi
ceil atau
floor.
atau lihat di
http://www.keil.com/support/man/docs/c51/c51_lib_math.htmsetelah dibagi dengan 10 harusnya di bulatkan biar tidak menghasilkan pecahan.
jadi menurutku.
void kon_ascii()
{
koma2 = (nilai % 10) + 0x30;
nilai = floor (nilai / 10); // pembulatan ke bawah.
.........................
}
Tolong d koreksi terlebih dahulu sapa tau ad salah..
