Program utama merupakan bagian yang dikerjakan saat mikrokontroler dicatu daya atau saat mikrokontroler direset. Program utama dimulai dengan proses inisialasi LCD, inisialisasi RTC, dan inisialisasi alamat data. Setelah proses inisialisasi selesai, pada LCD akan ditampilkan biaya beban untuk listrik rumah tangga 1300W sebagai total biaya awal. Langkah selanjutnya yaitu menghitung banyaknya putaran piringan KWh meter mekanik yang mana besar pemakaian energi listrik akan bertambah 1 KWh untuk setiap 1250 putaran. Nilai dari banyaknya pemakaian energi listrik akan ditampilkan ke LCD untuk setiap perubahannya. Setelah menerima data besar pemakaian energi listrik, selanjutnya program akan menghitung besar biaya pemakaian energi listrik dan menampilkan ke LCD. Langkah terakhir adalah menanyakan waktu. Jika waktu sudah 1 bulan, maka program akan menyimpan data jumlah dan besar biaya pemakaian energi listrik bulan tersebut dan memulai perhitungan baru untuk 1 bulan berikutnya (reset program). Diagram alir program utama alat penampil jumlah dan biaya pemakaian energi listrik pada KWh meter mekanik (analog) ditunjukkan pada gambar 3.9.
MULAI
INISIALISASI ALAMAT DATA, LCD, RTC
TAMPILKAN TOTAL BIAYA AWAL (BIAYA BEBAN)
COUNTER + 1 KWh + 1 RESET P3.4 = 1 COUNTER = 1250 1BULAN TAMPILKAN JUMLAH KWh KE LCD TAMPILKAN TOTAL BIAYA KE LCD Y T Y T Y T P3.4 = 0 T Y SIMPAN DATA HITUNG BIAYA PEMAKAIAN
3.2.2 Sub-routine Hitung Biaya Pemakaian
Proses ini akan diawali dengan menentukan jumlah KWh sekarang termasuk dalam blok 1, 2, atau 3. Jumlah KWh akan dikurangkan 21, dimana nilai 21 ini adalah nilai awal untuk blok 2. Jika hasil pengurangan bernilai negatif (cy=1), berarti jumlah KWh masih berada dalam perhitungan blok 1 (KWh<21). Jika hasil pengurangan bernilai positif (cy=0), berarti jumlah KWh tidak berada dalam perhitungan blok 1 tapi mungkin berada dalam perhitungan blok 2 atau blok 3. Untuk memastikan hal itu maka proses berikutnya adalah mengurangkan jumlah KWh dengan 61, dimana nilai 61 ini adalah nilai awal untuk blok 3. Jika hasil pengurangan bernilai negatif (cy=1), berarti jumlah KWh berada dalam perhitungan blok 2 (KWh<61). Jika hasil pengurangan bernilai positif (cy=0), berarti jumlah KWh tidak berada dalam perhitungan blok 2 tapi berada dalam perhitungan blok 3. Setelah mengetahui jumlah KWh termasuk dalam blok 1, 2, atau 3, maka proses berikutnya adalah melakukan proses aritmatika untuk menghitung biaya pemakaian listrik sesuai dengan jumlah KWh yang terpakai. Berikut adalah potongan program untuk sub-routine hitung biaya pemakaian dan diagram alir sub-routine hitung biaya pemakaian:
biaya:
mov a,kwh ; ambil data jumlah kwh subb a,#21 ; data jumlah kwh dikurang 21
jnb cy,hitblok2 ; lompat ke ‘hitblok2’ jika hasil pengurang bernilai positif (cy = 0), lanjutkan program jika cy = 1 mov dptr,#blok1 ; ambil data harga blok 1
lcall aritma ; hitung biaya ljmp balik
hitblok2:
mov a,kwh ; ambil data jumlah kwh subb a,#61 ; data jumlah kwh dikurang 61
positif (cy = 0), lanjutkan program jika cy = 1 mov dptr,#blok2 ; ambil data harga blok 2
lcall aritma ; hitung biaya ljmp balik
hitblok3:
mov a,kwh ; ambil data jumlah kwh mov dptr,#blok3 ; ambil data harga blok 3 lcall aritma ; hitung biaya
balik:
lcall ubah_ascii1 ; ubah bcd dan ascii untuk tampilan biaya total ret mulai Isi Alamat DPTR DPTR = Blok 1 KWh < 21 Panggil Sub-routine Proses Aritmatika (menghitung Biaya) selesai Isi Alamat DPTR DPTR = Blok 2 Isi Alamat DPTR DPTR = Blok 3 Ambil Data Variabel KWh KWh < 61 Panggil Sub-routine Proses Aritmatika (menghitung Biaya) Panggil Sub-routine Proses Aritmatika (menghitung Biaya) T Y Y T
Gambar 3.10. Diagram Alir Sub-routine hitung biaya pemakaian
3.2.3 Sub-routine Aritmetika
Proses aritmatika diawali dengan pengisian register 0 (R0) dengan data 3 desimal, maksudnya karena ada 3 data pada harga blok yang akan diambil. Masing – masing data itu adalah data satuan, data puluhan, dan data ratusan. Sebelumnya perlu diketahui bahwa data – data baik pada harga blok maupun pada biaya total, semua sudah dalam bentuk BCD. Untuk setiap proses penjumlahan
jika hasilnya lebih dari 1 digit decimal (menghasilkan puluhan), maka data puluhan dari hasil penjumlahan akan ditambahkan ke data berikutnya. Saat R0 = 3, maka akan dilakukan penjumlahan data satuan antara harga blok dan biaya total (saat kwh = 0, biaya total = biaya beban). Selanjutnya DPTR akan diisi dengan data puluhan harga blok dan isi R0 dikurang 1 (R0 = 2), maka data puluhan antara harga blok dan biaya total akan dijumlahkan. Saat R0 = 1 dan DPTR berisi data ratusan harga blok, maka data ratusan antara harga blok dan biaya total akan dijumlahkan.
Berikut adalah potongan program untuk sub-routine aritmatika dan diagram alir sub-routine aritmatika:
aritma:
mov r0,#3 ; isi R0 untuk proses pengambilan data ulang:
clr a
movc a,@a+dptr ; ambil data di DPTR
cjne r0,#3,puluhan1 ; R0=3? Jika YA ke proses berikutnya ; Jika TIDAK lompat ke ‘puluhan1’ lcall satuan
ljmp balik1 puluhan1:
cjne r0,#2,ratusan1 ; R0=2? Jika YA ke proses berikutnya ; Jika TIDAK lompat ke ‘ratusan1’ lcall puluhan
ljmp balik1 ratusan1:
lcall ratusan balik1:
inc dptr ; isi DPTR dengan data berikutnya (DPTR + 1) djnz r0,ulang ; R0=0? Jika YA ke proses berikutnya
; Jika TIDAK lompat ke ‘ulang’ ret
Gambar 3.11. Sub-routine Aritmetika
Kemudian pada sub-routine satuan, puluhan dan ratusan. Berikut adalah potongan program dan diagram alirnya:
satuan:
add a,r7 ; jumlahkan data satuan lcall cantik2
jnb cy,ambil1
mov r7,50h ; simpan data satuan ret
puluhan:
add a,r6 ; jumlahkan data puluhan lcall cantik2
jnb cy,ambil2
mov r6,50h ; simpan data puluhan ret
ratusan:
add a,r5 ; jumlahkan data ratusan lcall cantik2
jnb cy,ambil3
mov r5,50h ; simpan data ratusan ret
Jika cy = 1 berarti pengurangan menghasilkan carry. Dengan perintah JNB, maka lompat bila tidak bit (cy = 0). Pada sub-routine ini, alamat 50h digunakan sebagai alamat penyimpan hasil sementara. Sebagai contoh untuk menghitung harga 1 KWh, maka biaya beban akan ditambah harga blok 1 yang prosesnya sebagai berikut:
R7 = 0 (data satuan biaya beban), Acc = 5 (data satuan harga blok 1). R7 + Acc = 5 (hasil disimpan di Acc kemudian simpan sementara di 50h). Subb a,#10 (Acc – 10 desimal; hexa = 0A).
Hasil pengurangan menghasilkan cy = 1, maka R7 = 50h (data di 50h dipindahkan ke R7 sebagai data satuan).
R6 = 3, Acc = 8 R6 + Acc = 11
Subb a,#10 (hasil 1 simpan di Acc, kemudian disimpan di 50h), karena cy = 0 maka ambil data ratusan (R5 = 1) kemudian jumlahkan dengan hasil (1) dan kemudian dengan data ratusan harga blok 1 (3), hasil penjumlahan disimpan di Acc.
Subb a,#10 (5 – 10), menghasilkan cy =1; maka data di 50h (1) akan disimpan di R6 sebagai data satuan dan hasil pengurangan akan disimpan di R5 sebagai data ratusan yang mana data tersebut dipindahkan dulu dari Acc ke 50h, karena Acc akan digunakan untuk proses berikutnya (hitung data ribuan sampai ratusan ribu).
3.2.4 Diagram Alir Tampil LCD
3.2.4.1Inisialisasi LCD
Proses inisialisasi LCD merupakan proses pengiriman data ke LCD yang mana di dalam data tersebut diatur sedemikian rupa agar LCD dapat bekerja sesuai keinginan. Adapun program untuk inisialisasi LCD adalah sebagai berikut: init_lcd:
mov a,#3fh ; set LCD untuk 8 bit, 2 baris, 5 x 10 dot lcall tulis_perintah
lcall tulis_perintah
mov a,#0dh ; display ON, cursor OFF, blinking ON lcall tulis_perintah
mov a,#06h ; set mode (pergeseran_bertambah atau kekanan) lcall tulis_perintah
mov a,#01h ; clear display lcall tulis_perintah
mov a,#0ch ; display ON, cursor OFF, blinking OFF lcall tulis_perintah
ret
3.2.4.2Menampilkan Karakter pada LCD
Pada proses menampilkan karakter pada LCD, yang perlu diingat adalah membuat pin R/W dan RS berlogika ‘0’ untuk perintah pengiriman instruksi, dan membuat pin R/W berlogika ‘0’ dan pin RS berlogika ‘1’ untuk perintah pengiriman data.
3.2.5 Menjalankan Waktu (Real Time Clock) MULAI NAIKKAN DETIK NOLKAN DETIK MENIT = MENIT + 1 NOLKAN MENIT JAM = JAM + 1 NOLKAN JAM HARI = HARI + 1 DETIK = 60 ? MENIT = 60 ? JAM = 24 ? HARI = 30 ? RETURN T Y T Y Y T T Y
BAB IV
HASIL PENGAMATAN DAN PEMBAHASAN
Pada bab ini akan dibuktikan hasil perancangan dengan menampilkan beberapa hasil percobaan beserta analisanya.